[通用 MCU]

卡尔曼滤波

[复制链接]
274|0
手机看帖
扫描二维码
随时随地手机跟帖
丙丁先生|  楼主 | 2025-5-8 06:39 | 显示全部楼层 |阅读模式
卡尔曼滤波是一种高效的递归滤波器,它能够从一系列有噪声的测量中估计出系统的动态状态。它在许多领域都有广泛应用,如导航、控制系统、信号处理等。以下是对卡尔曼滤波原理和实现的详细解说。

卡尔曼滤波原理

1. 基本概念
状态向量:表示系统的动态状态,通常用 \(\mathbf{x}_k\) 表示,其中 \(k\) 表示时间步。
测量向量:表示从传感器等设备获取的观测数据,通常用 \(\mathbf{z}_k\) 表示。
过程噪声:表示系统动态模型的不确定性,通常假设为高斯白噪声,其协方差矩阵为 \(\mathbf{Q}_k\)。
测量噪声:表示测量过程中的不确定性,通常假设为高斯白噪声,其协方差矩阵为 \(\mathbf{R}_k\)。

2.系统模型
卡尔曼滤波基于以下两个基本方程:
状态更新方程:
  \[
  \mathbf{x}_{k} = \mathbf{F}_{k} \mathbf{x}_{k-1} + \mathbf{B}_{k} \mathbf{u}_{k} + \mathbf{w}_{k}
  \]
  其中,\(\mathbf{F}_{k}\) 是状态转移矩阵,\(\mathbf{B}_{k}\) 是控制输入矩阵,\(\mathbf{u}_{k}\) 是控制输入向量,\(\mathbf{w}_{k}\) 是过程噪声。
测量方程:
  \[
  \mathbf{z}_{k} = \mathbf{H}_{k} \mathbf{x}_{k} + \mathbf{v}_{k}
  \]
  其中,\(\mathbf{H}_{k}\) 是测量矩阵,\(\mathbf{v}_{k}\) 是测量噪声。

3.滤波过程
卡尔曼滤波分为两个主要步骤:预测 和 更新。

预测步骤:
  1.状态预测:
     \[
     \hat{\mathbf{x}}_{k|k-1} = \mathbf{F}_{k} \hat{\mathbf{x}}_{k-1|k-1} + \mathbf{B}_{k} \mathbf{u}_{k}
     \]
     其中,\(\hat{\mathbf{x}}_{k|k-1}\) 是在时间步 \(k\) 的状态预测值,基于时间步 \(k-1\) 的估计值。
  2. 协方差预测:
     \[
     \mathbf{P}_{k|k-1} = \mathbf{F}_{k} \mathbf{P}_{k-1|k-1} \mathbf{F}_{k}^T + \mathbf{Q}_{k}
     \]
     其中,\(\mathbf{P}_{k|k-1}\) 是状态预测的协方差矩阵,\(\mathbf{P}_{k-1|k-1}\) 是上一时间步的状态估计协方差矩阵。

更新步骤:
  1. 卡尔曼增益计算:
     \[
     \mathbf{K}_{k} = \mathbf{P}_{k|k-1} \mathbf{H}_{k}^T (\mathbf{H}_{k} \mathbf{P}_{k|k-1} \mathbf{H}_{k}^T + \mathbf{R}_{k})^{-1}
     \]
     其中,\(\mathbf{K}_{k}\) 是卡尔曼增益,用于权衡预测值和测量值的可信度。
  2. 状态更新:
     \[
     \hat{\mathbf{x}}_{k|k} = \hat{\mathbf{x}}_{k|k-1} + \mathbf{K}_{k} (\mathbf{z}_{k} - \mathbf{H}_{k} \hat{\mathbf{x}}_{k|k-1})
     \]
     其中,\(\hat{\mathbf{x}}_{k|k}\) 是在时间步 \(k\) 的状态估计值,\(\mathbf{z}_{k} - \mathbf{H}_{k} \hat{\mathbf{x}}_{k|k-1}\) 是测量残差。
  3. 协方差更新:
     \[
     \mathbf{P}_{k|k} = ( \mathbf{I} - \mathbf{K}_{k} \mathbf{H}_{k} ) \mathbf{P}_{k|k-1}
     \]
     其中,\(\mathbf{P}_{k|k}\) 是状态估计的协方差矩阵。

卡尔曼滤波实现

以下是一个简单的卡尔曼滤波实现示例,假设我们正在跟踪一个一维物体的位置和速度。

1.初始化参数
假设:
状态向量 \(\mathbf{x} = \begin{bmatrix} \text{位置} \\ \text{速度} \end{bmatrix}\)
状态转移矩阵 \(\mathbf{F} = \begin{bmatrix} 1 & \Delta t \\ 0 & 1 \end{bmatrix}\)
测量矩阵 \(\mathbf{H} = \begin{bmatrix} 1 & 0 \end{bmatrix}\)
过程噪声协方差矩阵 \(\mathbf{Q}\)
测量噪声协方差矩阵 \(\mathbf{R}\)
初始状态估计 \(\hat{\mathbf{x}}_{0|0}\)
初始协方差矩阵 \(\mathbf{P}_{0|0}\)

2. Python代码实现
```python
import numpy as np

# 初始化参数
dt = 1.0  # 时间步长
F = np.array([[1, dt], [0, 1]])  # 状态转移矩阵
H = np.array([[1, 0]])  # 测量矩阵
Q = np.array([[0.001, 0.001], [0.001, 0.1]])  # 过程噪声协方差矩阵
R = np.array([[10]])  # 测量噪声协方差矩阵

# 初始状态和协方差矩阵
x = np.array([[0], [1]])  # 初始状态 [位置, 速度]
P = np.array([[10, 0], [0, 10]])  # 初始协方差矩阵

# 模拟数据
true_position = [0]  # 真实位置
measured_position = [0]  # 测量位置
estimated_position = [0]  # 估计位置
estimated_velocity = [1]  # 估计速度

# 模拟10个时间步
for k in range(1, 11):
    # 真实状态更新(假设真实速度恒定为1)
    true_position.append(true_position[-1] + 1 * dt)
   
    # 测量更新(假设测量噪声为高斯噪声)
    measured_position.append(true_position[-1] + np.random.normal(0, np.sqrt(R[0, 0])))
   
    # 预测步骤
    x_pred = F @ x
    P_pred = F @ P @ F.T + Q
   
    # 更新步骤
    K = P_pred @ H.T / (H @ P_pred @ H.T + R)
    x = x_pred + K @ (measured_position[-1] - H @ x_pred)
    P = (np.eye(2) - K @ H) @ P_pred
   
    # 保存估计值
    estimated_position.append(x[0, 0])
    estimated_velocity.append(x[1, 0])

# 打印结果
print("真实位置:", true_position)
print("测量位置:", measured_position)
print("估计位置:", estimated_position)
print("估计速度:", estimated_velocity)
```

总结
卡尔曼滤波是一种强大的工具,用于从噪声数据中估计系统的动态状态。它通过预测和更新两个步骤,结合系统的动态模型和测量数据,逐步优化状态估计。上述代码展示了如何实现一个简单的一维卡尔曼滤波器,用于跟踪物体的位置和速度。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1001

主题

3638

帖子

5

粉丝