东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 2321|回复: 6
打印 上一主题 下一主题

[Python] 一维线性kalman滤波算法实例_改进R变化

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14449
QQ
跳转到指定楼层
楼主
发表于 2022-2-24 11:14:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一维线性kalman滤波算法实例_改进R变化
思考步骤:
1、状态变量 x1=距离/位置(米)   先写出一个系统的离散的状态空间方程表达
    x1还是应该为 速度
2、线性kalman对数据要求很严格 要求整段数据的方差是固定的  Q R矩阵的取值问题
    后验估计是:谁方差小 就更信任谁  但是这个问题的数据是 刚开始方差小 中间方差大 后面方差又小
    改变:能不能让Q R 矩阵的方差 随这数据 在变  可以的    测量噪声:协方差矩阵R 可以根据测量结果改变
    由于得不到真实的值 所以Q的方差 不好变 只能固定一个经验值
    发现:初值很关键 很敏感啊




  1. # -*- coding: utf-8 -*-
  2. __author__ = u'东方耀 微信:dfy_88888'
  3. __date__ = '2022/2/23 上午11:45'
  4. __product__ = 'PyCharm'
  5. __filename__ = 'j04_kalman_filter_状态变量(动目标的距离)'

  6. import numpy as np
  7. import matplotlib.pyplot as plt
  8. import matplotlib.ticker as mticker
  9. from matplotlib.font_manager import FontProperties

  10. font_fname = "/usr/share/fonts/wps-office/simfang.ttf"
  11. # font_fname = "C:\Windows\Fonts\simfang.ttf"
  12. font = FontProperties(fname=font_fname)
  13. # plt.rcParams['font.sans-serif']=['simfang']#设置作图中文显示

  14. '''
  15. 一维线性kalman滤波算法实例_改进R变化
  16. 思考步骤:
  17. 1、状态变量 x1=距离/位置(米)   先写出一个系统的离散的状态空间方程表达
  18.     x1还是应该为 速度
  19. 2、线性kalman对数据要求很严格 要求整段数据的方差是固定的  Q R矩阵的取值问题
  20.     后验估计是:谁方差小 就更信任谁  但是这个问题的数据是 刚开始方差小 中间方差大 后面方差又小
  21.     改变:能不能让Q R 矩阵的方差 随这数据 在变  可以的    测量噪声:协方差矩阵R 可以根据测量结果改变
  22.     由于得不到真实的值 所以Q的方差 不好变 只能固定一个经验值
  23.     发现:初值很关键 很敏感啊
  24. '''

  25. save_distance_csv_file = "/media/jiang/AI_Data/jjj_matlab_works/ZTR/actual_used_data/python/multi_frame_147_distance.csv"
  26. distance = np.loadtxt(save_distance_csv_file, delimiter=',')

  27. prt = 450 * 700e-6

  28. # 状态转移矩阵,上一时刻的状态转移到当前时刻
  29. # 数学模型中得到的 这是固定的
  30. A = np.array([[1]])

  31. # 测量矩阵  从测量或传感器的方程得到 也是固定的
  32. H = np.array([[1]])

  33. # 过程噪声:协方差矩阵Q, p(w)~N(0,Q),噪声来自真实世界中的不确定性
  34. # 位置与速度是相互独立的 所以只有对角线有值
  35. Q = np.array([[0.08]])

  36. # 测量噪声:协方差矩阵R, p(v)~N(0,R)
  37. R = np.array([[100.0]])

  38. len_counter_R_var = 5

  39. # 初始速度 0 行吗? 改为1呢?
  40. X0 = np.array([[1.0]])
  41. # 初始 误差的协方差矩阵
  42. P = np.array([[300.0]])

  43. # ---------------------------初始化-------------------------
  44. X_posterior_est = np.array(X0)
  45. P_posterior = np.array(P)  # 不停在更新 在变

  46. # 真实值
  47. # speed_true = []  # 不可能知道

  48. speed_measure = []  # 测量值

  49. speed_prior_est = []  # prior 先验估计值

  50. speed_posterior_est = []  # posterior 后验估计值

  51. distance_kalman = distance.copy()

  52. distance_kalman[0] = 0
  53. distance_kalman[1] = distance[1]

  54. for i in range(2, len(distance)):
  55.     # abs(distance[i] - distance[i-1])
  56.     # w = np.array([[gaussian_distribution_generator(Q[0, 0])]])
  57.     # X_true = np.dot(A, X_true) + w
  58.     # speed_true.append(X_true[0, 0])
  59.     Z_measure = np.array([[np.abs(distance[i] - distance[i - 1]) / prt]])
  60.     speed_measure.append(Z_measure[0, 0])

  61.     # assert 0 == 1, "停"
  62.     # ----------------------进行先验估计  真正的kalman算法---------------------
  63.     X_prior_est = np.dot(A, X_posterior_est)  # X_posterior_est需要初值
  64.     speed_prior_est.append(X_prior_est[0, 0])
  65.     if (len(speed_measure) >= len_counter_R_var):
  66.         print("(第%d次循环)测量系统的方差:" % i, np.var(np.array(speed_measure[-len_counter_R_var:])))
  67.         # Q[0, 0] = np.var(np.array(speed_prior_est[-len_counter_R_var:]))   这样改不行 是真实值的方差
  68.         R[0, 0] = np.var(np.array(speed_measure[-len_counter_R_var:]))

  69.     # 计算先验误差的协方差矩阵P
  70.     # print("第%d次使用的误差的协方差矩阵P(几次后会稳定下来)=\n" % i, P_posterior)
  71.     P_prior_1 = np.dot(A, P_posterior)  # P_posterior 需要初值
  72.     P_prior = np.dot(P_prior_1, A.T) + Q
  73.     # ----------------------计算卡尔曼增益,用numpy一步一步计算Prior and posterior
  74.     k1 = np.dot(P_prior, H.T)
  75.     k2 = np.dot(np.dot(H, P_prior), H.T) + R
  76.     K = np.dot(k1, np.linalg.inv(k2))  # np.linalg.inv():矩阵求逆
  77.     # print("第%d次计算得到的卡尔曼增益K(几次后会稳定下来)=\n" % i, K)
  78.     # ---------------------后验估计------------
  79.     X_posterior_est_1 = Z_measure - np.dot(H, X_prior_est)
  80.     # X的后验估计 = X的先验估计 + 系数 * (测量值 - H * X的先验估计)
  81.     X_posterior_est = X_prior_est + np.dot(K, X_posterior_est_1)
  82.     print("第%d次循环的kalman滤波结果(Q=%.2f,R=%.2f):先验估计的速度=%.1f,测量的速度=%.1f,后验估计的速度=%.2f" % (i, Q[0, 0], R[0, 0], X_prior_est[0, 0], Z_measure[0, 0], X_posterior_est[0, 0]))
  83.     # X_posterior_est 真正要的结果
  84.     if (distance[i] - distance[i - 1] >= 0):
  85.         distance_kalman[i] = distance_kalman[i - 1] + X_posterior_est[0, 0] * prt
  86.     else:
  87.         distance_kalman[i] = distance_kalman[i - 1] - X_posterior_est[0, 0] * prt

  88.     speed_posterior_est.append(X_posterior_est[0, 0])
  89.     # 更新(误差)协方差矩阵P
  90.     P_posterior_1 = np.eye(1) - np.dot(K, H)
  91.     P_posterior = np.dot(P_posterior_1, P_prior)

  92. # print("测量出来的速度:", speed_measure, np.var(np.array(speed_measure)))



  93. plt.figure(figsize=(14, 12))
  94. plt.figure(1)

  95. plt.plot(speed_measure, color='black', marker='o', markersize=6, label="speed_measure")
  96. plt.plot(speed_posterior_est, color='red', marker='o', markersize=6, label="speed_posterior_est")
  97. plt.plot(speed_prior_est, color='blue', marker='o', markersize=6, label="speed_prior_est")
  98. plt.xlabel("状态变化次数(积累帧数-1)", fontproperties=font, fontsize=15)
  99. plt.ylabel("动目标速度", fontproperties=font, fontsize=15)
  100. plt.title('卡尔曼滤波的1d实例_动目标速度(kalman状态变量)', fontproperties=font, fontsize=16)
  101. plt.legend()


  102. plt.figure(figsize=(14, 12))
  103. plt.figure(2)
  104. plt.xlabel("帧索引(slow_time)", fontproperties=font, fontsize=15)
  105. plt.ylabel("距离(米)", fontproperties=font, fontsize=15)
  106. plt.title('目标轨迹(径向距离变化_argmax算法)_kalman速度转距离', fontproperties=font, fontsize=16)
  107. plt.plot(distance, color='black', marker='o', markersize=6, label="distance_measure")
  108. plt.plot(distance_kalman, color='red', marker='o', markersize=6, label="distance_kalman")
  109. plt.legend()

  110. plt.show()
复制代码






一维线性kalman滤波算法实例_改进R变化01.png (87.89 KB, 下载次数: 234)

一维线性kalman滤波算法实例_改进R变化01.png

一维线性kalman滤波算法实例_改进R变化02.png (88.91 KB, 下载次数: 234)

一维线性kalman滤波算法实例_改进R变化02.png

multi_frame_147_distance.csv

3.59 KB, 阅读权限: 188, 下载次数: 0

让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

0

主题

96

帖子

204

积分

中级会员

Rank: 3Rank: 3

积分
204
沙发
发表于 2022-3-17 22:41:45 | 只看该作者
fasfsdfsdfsdafasdfas
回复

使用道具 举报

0

主题

96

帖子

204

积分

中级会员

Rank: 3Rank: 3

积分
204
板凳
发表于 2022-3-17 22:42:08 | 只看该作者
eafawfawefwfwafawfawf
回复

使用道具 举报

0

主题

96

帖子

204

积分

中级会员

Rank: 3Rank: 3

积分
204
地板
发表于 2022-3-17 22:42:36 | 只看该作者
dsfdsfdsfdsfdsfdsfdsfsdfds
回复

使用道具 举报

0

主题

96

帖子

204

积分

中级会员

Rank: 3Rank: 3

积分
204
5#
发表于 2022-3-17 22:42:51 | 只看该作者
dfasdfsdfdsfasdfdsafdasf
回复

使用道具 举报

0

主题

96

帖子

204

积分

中级会员

Rank: 3Rank: 3

积分
204
6#
发表于 2022-3-17 22:43:16 | 只看该作者
dssdfdsafdsafdsafsadfdsafdasfdsaf
回复

使用道具 举报

0

主题

96

帖子

204

积分

中级会员

Rank: 3Rank: 3

积分
204
7#
发表于 2022-3-17 22:43:47 | 只看该作者
sdfdsfdsfdsfdsdsfds
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-6-16 08:46 , Processed in 0.202679 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表