python卡尔曼滤波_卡尔曼滤波学习(四)实例 python

#!/usr/bin/env python

# coding: utf-8

import numpy as np

import math

import matplotlib.pyplot as plt

if __name__=="__main__":

## 1.动

X_real = np.mat(np.zeros((2, 100))) # 空矩阵,用于存放真实状态向量

X_real[:, 0] = np.mat([[0.0], # 初始状态向量

[1.0]])

a_real = 0.1# 真实加速度

F = np.mat([[1.0, 1.0], # 状态转移矩阵

[0.0, 1.0]])

B = np.mat([[0.5], # 控制矩阵

[1.0]])

for i in range(99):

X_real[:, i + 1] = F * X_real[:, i] + B * a_real # 计算真实状态向量

X_real = np.array(X_real)

fig = plt.figure(1)

plt.grid()

plt.title('real displacement')

plt.xlabel('k (s)')

plt.ylabel('x (m)')

plt.plot(X_real[0, :])

plt.show()

fig = plt.figure(2)

plt.grid()

plt.title('real velocity')

plt.xlabel('k (s)')

plt.ylabel('v (m/s)')

plt.plot(X_real[1, :])

plt.show()

X_real = np.mat(X_real)

## 2.建立传感器观测值

z_t = np.mat(np.zeros((2, 100))) # 空矩阵,用于存放传感器观测值

H = np.mat(np.zeros((2, 2)))

H[0, 0], H[1, 1] = -1.0, -1.0

noise = np.mat(np.random.randn(2,100)) # 加入位移方差为1,速度方差为1的传感器噪声

R = np.mat([[1.0, 0.0], # 观测噪声的协方差矩阵

[0.0, 1.0]])

for i in range(100):

z_t[:, i] = H * X_real[:, i] + noise[:, i]

z_t = np.array(z_t)

fig = plt.figure(3)

plt.grid()

plt.title('sensor displacement')

plt.xlabel('k (s)')

plt.ylabel('x (m)')

plt.plot(z_t[0, :])

plt.show()

fig = plt.figure(4)

plt.grid()

plt.title('sensor velocity')

plt.xlabel('k (s)')

plt.ylabel('v (m/s)')

plt.plot(z_t[1, :])

plt.show()

z_t = np.mat(z_t)

## 3.执行线性卡尔曼滤波

Q = np.mat([[0.0001, 0.0], # 状态转移协方差矩阵,我们假设外部干扰很小,

[0.0, 0.0001]])# 转移矩阵可信度很高

# 建立一系列空序列用于储存结果

X_update = np.mat(np.zeros((2, 100)))

P_update = np.zeros((100, 2, 2))

X_predict = np.mat(np.zeros((2, 100)))

P_predict = np.zeros((100, 2, 2))

#X_update[:, 0] = X_real[:, 0] # 初始状态向量

#X_predict[:, 0] = X_real[:, 0] # 初始状态向量

P_update[0, :, :] = np.mat([[1.0, 0.0], # 状态向量协方差矩阵初值

[0.0, 1.0]])

P_predict[0, :, :] = np.mat([[1.0, 0.0], # 状态向量协方差矩阵初值

[0.0, 1.0]])

for i in range(99):

# 预测

X_predict[:, i + 1] = F * X_update[:, i] + B * a_real

P_p = F * np.mat(P_update[i, :, :]) * F.T + Q

P_predict[i + 1, :, :] = P_p

# 更新

K = P_p * H.T * np.linalg.inv(H * P_p * H.T + R) # 卡尔曼增益

P_u = P_p - K * H * P_p

P_update[i + 1, :, :] = P_u

X_update[:, i + 1] = X_predict[:, i + 1] + K * (z_t[:, i + 1] - H * X_predict[:, i + 1])

X_update = np.array(X_update)

X_real = np.array(X_real)

fig = plt.figure(5)

plt.grid()

plt.title('Kalman predict displacement')

plt.xlabel('k (s)')

plt.ylabel('x (m)')

plt.plot(X_real[0, :], label='real', color='b')

plt.plot(X_update[0, :], label='predict', color='r')

plt.legend()

plt.show()

fig = plt.figure(6)

plt.grid()

plt.title('Kalman predict velocity')

plt.xlabel('k (s)')

plt.ylabel('v (m/s)')

plt.plot(X_real[1, :], label='real', color='b')

plt.plot(X_update[1, :], label='predict', color='r')

plt.legend()

plt.show()

X_update = np.mat(X_update)

X_real = np.mat(X_real)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卡尔曼滤波(Kalman Filter)是一种用于估计动态系统状态的技术,特别适用于处理噪声数据,常用于信号处理、控制系统和机器学习等领域。在Python中,有很多库支持卡尔曼滤波,最常用的是`python-control`库和`filterpy`库。 1. **python-control**: 提供了线性系统的分析和设计工具,包括卡尔曼滤波器的基本概念和实现。 2. **filterpy**: 是一个专门为Python设计的用于估计动态模型的库,它包含了许多高级滤波器算法,如卡尔曼滤波、扩展卡尔曼滤波等,并提供易于使用的API。 使用卡尔曼滤波的过程通常包括以下几个步骤: - **初始化**:设置滤波器的初始状态估计,协方差矩阵以及其他参数。 - **预测**:根据系统的动态模型和当前已知信息更新预测状态。 - **测量更新**:当接收到新的传感器数据时,使用这些数据来纠正预测状态。 - **递归**:重复预测和测量更新步骤。 如果你想要了解如何在Python中实现一个简单的卡尔曼滤波器,例如追踪目标位置,可以尝试以下代码片段: ```python from filterpy.kalman import KalmanFilter class KalmanTracker(KalmanFilter): def __init__(self, dt, initial_state, process_noise, measurement_noise): # 初始化滤波器参数 super().__init__(dim_x=2, dim_z=1) # 2维状态(x, y),1维观测(z) self.F = np.array([[1, dt], [0, 1]]) # 状态转移矩阵 self.H = np.array([[1, 0]]) # 测量矩阵 self.Q = np.diag(process_noise) # 过程噪声矩阵 self.R = np.diag(measurement_noise) # 测量噪声矩阵 self.x = initial_state # 初始状态估计 self.P = np.eye(2) # 初始协方差矩阵 # 使用实例并更新状态 tracker = KalmanTracker(dt=0.1, initial_state=[0, 0], process_noise=0.1, measurement_noise=1) measured_position = [1, 1] # 假设得到的位置数据 tracker.update(measured_position) predicted_position = tracker.x ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值