一维卡尔曼滤波的python实现

1.卡尔曼滤波原理:

卡尔曼滤波是由Kalman等人于20世纪60年代提出的一种优化自回归数据处理方法,是建立在线性系统状态空间方程以及观测方程上来对系统的状态进行最优估计,主要包含状态预测和更新两个步骤。

卡尔曼滤波原理

卡尔曼滤波原理的具体讲解可以参考如下博主的讲解:
	博主讲得十分详细,十分推荐
【卡尔曼滤波器】1_递归算法_Recursive Processing】 https://www.bilibili.com/video/BV1ez4y1X7eR/?share_source=copy_web&vd_source=5e51014934b5ebce10a321714d539943

2.一维卡尔曼的python实现:

提示:Q是状态噪声,R是测量噪声。先模拟生成一组数,加入随机噪声后进行滤波

import numpy as np
import matplotlib.pyplot as plt
def KF(Z,over,Q,R):
    #定义超参数
    over=over
    Q=Q   #4e-4
    R=R   #0.25
    #定义尺寸函数
    cc=[over,1]
    #定义迭代的初始参数
    X_bar=np.zeros(cc)
    Xbar=np.zeros(cc)
    K=np.zeros(cc)
    P_=np.zeros(cc)
    P=np.zeros(cc)
    P[0]=1
    Xbar[0]=Z[0]
    #循环迭代
    for n in range(1,over):
        #时间更新
        X_bar[n]=Xbar[n-1]
        P_[n] = P[n-1]+Q
        #状态更新
        K[n]=P_[n]/(P_[n]+R)
        Xbar[n]=X_bar[n]+K[n]*(Z[n]-X_bar[n])
        P[n]=(1-K[n])*P_[n]
    return Xbar
    
#生成模拟测量值
over=50
Z=(24+np.sqrt(100)*np.random.normal(0,1,size=over)).reshape(over,1)
X=KF(Z,50,0.01,100)
x=np.arange(over)
fig,ax =plt.subplots()
ax.plot(x,X, label='estimate')
ax.plot(x,Z, label='measure')      
ax.legend();   



3.实验结果:

提示:实验中加入的噪声是服从正太分布的,所以效果不错,通过调整Q和R的大小,可以出现不同的滤波效果,若要强化滤波效果,则可以将Q值调小;若要强调跟随特性,则减少R值。

在这里插入图片描述


  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的尔曼滤波器的Python代码实现示例: ```python import numpy as np class KalmanFilter: def __init__(self, initial_state, initial_covariance, transition_matrix, observation_matrix, process_noise_covariance, measurement_noise_covariance): self.state = initial_state self.covariance = initial_covariance self.transition_matrix = transition_matrix self.observation_matrix = observation_matrix self.process_noise_covariance = process_noise_covariance self.measurement_noise_covariance = measurement_noise_covariance def predict(self): self.state = np.dot(self.transition_matrix, self.state) self.covariance = np.dot(np.dot(self.transition_matrix, self.covariance), np.transpose(self.transition_matrix)) + self.process_noise_covariance def update(self, measurement): innovation = measurement - np.dot(self.observation_matrix, self.state) innovation_covariance = np.dot(np.dot(self.observation_matrix, self.covariance), np.transpose(self.observation_matrix)) + self.measurement_noise_covariance kalman_gain = np.dot(np.dot(self.covariance, np.transpose(self.observation_matrix)), np.linalg.inv(innovation_covariance)) self.state += np.dot(kalman_gain, innovation) self.covariance = np.dot((np.eye(len(self.state)) - np.dot(kalman_gain, self.observation_matrix)), self.covariance) # 定义初始状态、转移矩阵、观测矩阵、过程噪声协方差矩阵和测量噪声协方差矩阵 initial_state = np.array([[0], [0]]) transition_matrix = np.array([[1, 1], [0, 1]]) observation_matrix = np.array([[1, 0]]) process_noise_covariance = np.array([[0.1, 0], [0, 0.1]]) measurement_noise_covariance = np.array([[1]]) # 创建KalmanFilter对象 kalman_filter = KalmanFilter(initial_state, np.eye(2), transition_matrix, observation_matrix, process_noise_covariance, measurement_noise_covariance) # 生成随机观测数据 np.random.seed(0) measurements = np.random.normal(0, 1, (100, 1)) # 使用Kalman滤波器进行状态估计 estimated_states = [] for measurement in measurements: kalman_filter.predict() kalman_filter.update(measurement) estimated_states.append(kalman_filter.state) # 输出估计的状态值 for i in range(len(estimated_states)): print("Step", i+1, "Estimated State:", estimated_states[i]) ``` 该代码实现了一个简单的一维尔曼滤波器。在示例中,我们定义了初始状态、转移矩阵、观测矩阵、过程噪声协方差矩阵和测量噪声协方差矩阵。然后,我们使用随机生成的观测数据来进行状态估计,并输出每个时间步的估计状态值。 请注意,这只是一个简单的示例,实际应用中可能需要根据具体问题进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Brave heart

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值