卡尔曼滤波算法及其python实现

卡尔曼滤波算法及其python实现

算法原理

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

python实现

# KF algorith demo by Leo
# 2020.01.06
# ZJG CAMPUS,ZJU

import numpy as np
import matplotlib.pyplot as plt
 

'''
生成带噪声的传感器观测值Z
Z中一共包含500个samples,第k个sample代表k时刻传感器的读数
假设只对机器人位置进行传感器观测,并且只用距离表示位置
因此,Z中只有一个观测变量,即机器人的位置,这个位置一维数据表示
'''
# 生成不带噪声的数据
Z_raw = [i for i in range(500)]
# 创建一个均值为0,方差为1的高斯噪声,共有500个samples,精确到小数点后两位
noise = np.round(np.random.normal(0, 1, 500), 2)
# 将z的观测值和噪声相加
Z = np.mat(Z_raw) + np.mat(noise)

 

'''
定义状态向量X的初始状态
X中包含两个状态变量:p和v,二者都被初始化为0,且二者都用标量表示
'''
X = np.mat([[0,], [0,]])



'''
定义初始状态协方差矩阵P
'''
P = np.mat([[1, 0], [0, 1]])



'''
定义状态转移矩阵F,假设每秒钟采一次样,所以delta_t = 1
'''
F = np.mat([[1, 1], [0, 1]])



'''
定义状态转移协方差矩阵Q
这里我们把协方差设置的很小,因为觉得状态转移矩阵准确度高
'''
Q = np.mat([[0.0001, 0], [0, 0.0001]])



'''
定义观测矩阵H
'''
H = np.mat([1, 0])



'''
定义观测噪声协方差R
'''
R = np.mat([1])
 


'''
卡尔曼滤波算法的预测和更新过程
'''
for i in range(100):
    x_predict = F * X#demo中没有引入控制矩阵B
    p_predict = F * P * F.T + Q
    K = p_predict * H.T / (H * p_predict * H.T + R)
    X = x_predict + K *(Z[0, i] - H * x_predict)
    P = (np.eye(2) - K * H) * p_predict
    print(X)
    plt.plot(X[0, 0], X[1, 0], 'ro', markersize = 4)
    
plt.show()

在这里插入图片描述
其中,横轴表示X[0,0],即位置p; 纵轴表示X[1,0],即速度v
可以看到速度v很快收敛于1.0,这是因为设置delta_t=1,即Z中的数据从0-500,每秒加1,卡尔曼滤波预测的速度与实际速度1.0很好的契合。
并且,我相信如果将横轴展开来看,卡尔曼滤波也对位置的预测具有很好的契合。

参考资料

1.[blog]详解卡尔曼滤波原理
翻译自http://www.bzarg.com/p/how-a-kalman-filter-works-in-pictures/
blog地址:https://blog.csdn.net/u010720661/article/details/63253509
2.[blog]我所理解的卡尔曼滤波
blog地址:https://www.jianshu.com/p/d3b1c3d307e0
3.[blog]卡尔曼滤波,最最容易理解的讲解.找遍网上就这篇看懂了.
blog地址:https://blog.csdn.net/phker/article/details/48468591
4.[paper]A New Approach to Linear Filtering
and Prediction Problems
paper地址:http://www.cs.unc.edu/~welch/kalman/media/pdf/Kalman1960.pdf

  • 49
    点赞
  • 221
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
卡尔曼滤波是一种用于估计系统状态的算法,它通过融合传感器测量值和系统模型的预测值来提供更准确的状态估计。在Python中,可以使用NumPy和SciPy等库来实现卡尔曼滤波。 一个常见的卡尔曼滤波Python实现是基于KalmanFilter类。这个类提供了一些方法来初始化滤波器、更新滤波器状态和计算滤波器的精度评价。 在实现中,可以使用KalmanFilter类的init方法来初始化滤波器的状态和协方差矩阵。然后,可以使用update方法来更新滤波器的状态和协方差矩阵,根据传感器测量值和系统模型的预测值。最后,可以使用accuracy方法来计算滤波器的精度评价。 一个简单的卡尔曼滤波Python实现可以参考以下代码: ```python import numpy as np from scipy.linalg import inv class KalmanFilter: def __init__(self, initial_state, initial_covariance, measurement_noise, process_noise): self.state = initial_state self.covariance = initial_covariance self.measurement_noise = measurement_noise self.process_noise = process_noise def update(self, measurement): # 预测步骤 predicted_state = self.state predicted_covariance = self.covariance + self.process_noise # 更新步骤 innovation = measurement - predicted_state innovation_covariance = predicted_covariance + self.measurement_noise kalman_gain = predicted_covariance @ inv(innovation_covariance) self.state = predicted_state + kalman_gain @ innovation self.covariance = (np.eye(len(self.state)) - kalman_gain) @ predicted_covariance def accuracy(self): return np.trace(self.covariance) # 示例用法 initial_state = np.array(\[\[0\], \[0\]\]) # 初始状态 initial_covariance = np.eye(2) # 初始协方差矩阵 measurement_noise = np.eye(2) * 0.1 # 测量噪声 process_noise = np.eye(2) * 0.01 # 过程噪声 filter = KalmanFilter(initial_state, initial_covariance, measurement_noise, process_noise) # 更新滤波器状态 measurement = np.array(\[\[1\], \[1\]\]) # 测量值 filter.update(measurement) # 计算滤波器的精度评价 accuracy = filter.accuracy() print("滤波器的精度评价:", accuracy) ``` 这个示例代码演示了如何使用KalmanFilter类来实现卡尔曼滤波。首先,我们初始化滤波器的状态、协方差矩阵和噪声。然后,我们使用update方法来更新滤波器的状态和协方差矩阵,根据测量值。最后,我们使用accuracy方法来计算滤波器的精度评价。 请注意,这只是一个简单的示例,实际应用中可能需要根据具体问题进行适当的调整和扩展。同时,还可以根据需要使用其他库或工具来实现卡尔曼滤波。 #### 引用[.reference_title] - *1* *3* [卡尔曼滤波算法及其python实现](https://blog.csdn.net/wolfcsharp/article/details/103874453)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [卡尔曼滤波Python实现](https://blog.csdn.net/lishan132/article/details/124576990)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值