2024-09-17
算法
0

目录

例子:融合GPS和IMU数据的卡尔曼滤波
背景
步骤
示例实现
对应的代码
拓展观测矩阵
使用GPS计算速度
拓展观测矩阵
卡尔曼滤波实现
示例代码:
总结
拓展观测矩阵的优势和区别
不拓展观测矩阵的优势和区别
总结

例子:融合GPS和IMU数据的卡尔曼滤波

背景

假设我们有一个移动机器人,配备了GPS和IMU(包括加速度计和陀螺仪)。GPS提供位置和速度信息,但其更新率较低(例如每秒1次)且可能受遮挡影响。IMU提供高频率的加速度和角速度数据,但存在漂移和累积误差。我们希望通过卡尔曼滤波来融合这两种传感器的数据,以获得更精确和稳定的位置信息。

步骤

  1. 状态定义: 定义状态向量x\mathbf{x}包含位置、速度和姿态(例如 [x,y,z,vx,vy,vz,θ,ϕ,ψ][x,y,z,v_x,v_y,v_z,θ,ϕ,ψ])。

  2. 系统模型: 定义状态转移方程:

    xk+1=Fkxk+Bkuk+wkx_{k+1}=F_kx_k+B_ku_k+w_k

    其中 Fk\mathbf{F}_k 是状态转移矩阵,Bk\mathbf{B}_k 是控制输入矩阵,通常就是0矩阵,uk\mathbf{u}_k 是控制输入,一般也是无,wk\mathbf{w}_k 是过程噪声协方差矩阵。

  3. 测量模型: 定义观测方程:

    zk=Hkxk+vk\mathbf{z}_k = \mathbf{H}_k \mathbf{x}_k + \mathbf{v}_k

    其中 Hk\mathbf{H}_k 是观测矩阵,vk\mathbf{v}_k 是测量噪声。

  4. 初始化: 设置初始状态估计x0\mathbf{x}_0 和初始协方差矩阵 P0\mathbf{P}_0

  5. 卡尔曼滤波循环: 对于每个时间步 k 执行以下步骤:

    • 预测: 预测下一时刻的状态和协方差矩阵:

      x^kk1=Fk1x^k1+Bk1uk1\mathbf{\hat{x}}_{k|k-1} = \mathbf{F}_{k-1} \mathbf{\hat{x}}_{k-1} + \mathbf{B}_{k-1} \mathbf{u}_{k-1}

      Pkk1=Fk1Pk1Fk1T+Qk1\mathbf{P}_{k|k-1} = \mathbf{F}_{k-1} \mathbf{P}_{k-1} \mathbf{F}_{k-1}^T + \mathbf{Q}_{k-1}

    • 更新: 结合新的测量数据更新状态估计和协方差矩阵:

      Kk=Pkk1HkT(HkPkk1HkT+Rk)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}

      x^kk=x^kk1+Kk(zkHkx^kk1)\mathbf{\hat{x}}_{k|k} = \mathbf{\hat{x}}_{k|k-1} + \mathbf{K}_k (\mathbf{z}_k - \mathbf{H}_k \mathbf{\hat{x}}_{k|k-1})

      Pkk=(IKkHk)Pkk1\mathbf{P}_{k|k} = (\mathbf{I} - \mathbf{K}_k \mathbf{H}_k) \mathbf{P}_{k|k-1}

    其中,Qk1\mathbf{Q}_{k-1} 是过程噪声协方差矩阵,Rk\mathbf{R}_k 是测量噪声协方差矩阵,Kk\mathbf{K}_k 是卡尔曼增益。

示例实现

假设机器人以固定时间步长 Δt\Delta t运行。为了简化,我们仅考虑二维平面上的位置和速度,状态向量为 [][x, y, v_x, v_y][x,y,vx,vy][x,y,v_x,v_y]

  1. 状态定义

    xk=[xkykvxkvyk]\mathbf{x}_k = \begin{bmatrix} x_k \\ y_k \\ v_{xk} \\ v_{yk} \end{bmatrix}

  2. 状态转移矩阵

    F=[10Δt0010Δt00100001]\mathbf{F} = \begin{bmatrix} 1 & 0 & \Delta t & 0 \\ 0 & 1 & 0 & \Delta t \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}

  3. 观测矩阵(GPS测量位置)

    HGPS=[10000100]\mathbf{H}_{\text{GPS}} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \end{bmatrix}

    观测矩阵 H\mathbf{H}的作用是将状态向量映射到测量向量。由于测量向量只有位置信息,观测矩阵只需要提取状态向量中的位置部分[x,y][x,y]

  4. 过程噪声和测量噪声: 设过程噪声协方差矩阵Q\mathbf{Q} 和测量噪声协方差矩阵 RGPS\mathbf{R}_{\text{GPS}}为已知。

  5. 初始化

    x^0=[x0y0vx0vy0],P0=I(初始协方差矩阵)\mathbf{\hat{x}}_0 = \begin{bmatrix} x_0 \\ y_0 \\ v_{x_0} \\ v_{y_0} \end{bmatrix}, \quad \mathbf{P}_0 = \mathbf{I} \text{(初始协方差矩阵)}

对应的代码

python
import numpy as np # 定义初始状态和协方差矩阵 x_hat = np.array([0, 0, 0, 0]) # 初始状态 [x, y, v_x, v_y] P = np.eye(4) # 初始协方差矩阵 # 定义状态转移矩阵 dt = 1 # 时间步长 F = np.array([[1, 0, dt, 0], [0, 1, 0, dt], [0, 0, 1, 0], [0, 0, 0, 1]]) # 定义观测矩阵 H_GPS = np.array([[1, 0, 0, 0], [0, 1, 0, 0]]) # 定义过程噪声协方差矩阵和测量噪声协方差矩阵 Q = np.eye(4) * 0.1 R_GPS = np.eye(2) * 5 # --------- 以下代码就是计算一次最优估计的过程------------ # 预测步骤 x_hat_prior = F @ x_hat P_prior = F @ P @ F.T + Q # 假设有一个新的GPS测量值 [x_GPS, y_GPS] z_GPS = np.array([5, 5]) # 计算卡尔曼增益 K = P_prior @ H_GPS.T @ np.linalg.inv(H_GPS @ P_prior @ H_GPS.T + R_GPS) # 更新步骤 x_hat = x_hat_prior + K @ (z_GPS - H_GPS @ x_hat_prior) P = (np.eye(4) - K @ H_GPS) @ P_prior print("更新后的状态估计:", x_hat) print("更新后的协方差矩阵:", P) # 每次有观测值,将观测值输入到卡尔曼的五个方程组当中得到最优估计,多组数据就是循环,案例代码未循环,只写了一次采样更新过程。

拓展观测矩阵

你提到的通过两次采样间接计算速度的方法是一个合理的思路。这种方法确实可以利用GPS测量的位置数据来计算速度,并将其纳入卡尔曼滤波的观测模型中。让我们详细讨论这种情况。

使用GPS计算速度

假设我们通过连续的GPS位置测量来计算速度。我们可以用以下公式计算速度: [vxxGPS(k)xGPS(k1)Δt][ v_x \approx \frac{x_{\text{GPS}}(k) - x_{\text{GPS}}(k-1)}{\Delta t} ] [vyyGPS(k)yGPS(k1)Δt][ v_y \approx \frac{y_{\text{GPS}}(k) - y_{\text{GPS}}(k-1)}{\Delta t} ] 其中,(xGPS(k))(x_{\text{GPS}}(k))(yGPS(k))(y_{\text{GPS}}(k)) 是时刻 (k) 的GPS位置测量值,(\Delta t) 是两个GPS测量之间的时间间隔。

拓展观测矩阵

在这种情况下,我们可以扩展观测向量包含速度信息,并使用一个 (4 \times 4) 的观测矩阵。具体步骤如下:

  1. 状态向量: 仍然定义为 (x=[x,y,vx,vy]T)(\mathbf{x} = [x, y, v_x, v_y]^T),维度为 4。

  2. 测量向量: 包含位置和速度信息,定义为 zGPS=[xGPS,yGPS,vxGPS,vyGPS]\mathbf{z}_{\text{GPS}} = [x_{\text{GPS}}, y_{\text{GPS}}, v_{x_{\text{GPS}}}, v_{y_{\text{GPS}}}],维度为 4。

  3. 观测矩阵: 在这种情况下,观测矩阵是 (4 \times 4) 的单位矩阵: HGPS=[1000010000100001]\mathbf{H}_{\text{GPS}} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} 这个矩阵表明测量值直接对应状态向量的各个分量。

卡尔曼滤波实现

假设我们有一个方法来计算速度测量值(如上所述),我们可以将其纳入卡尔曼滤波的观测模型中。

示例代码:

python
import numpy as np # 定义初始状态和协方差矩阵 x_hat = np.array([0, 0, 0, 0]) # 初始状态 [x, y, v_x, v_y] P = np.eye(4) # 初始协方差矩阵 # 定义状态转移矩阵 dt = 1 # 时间步长 F = np.array([[1, 0, dt, 0], [0, 1, 0, dt], [0, 0, 1, 0], [0, 0, 0, 1]]) # 定义观测矩阵 H_GPS = np.eye(4) # 4x4 单位矩阵 # 定义过程噪声协方差矩阵和测量噪声协方差矩阵 Q = np.eye(4) * 0.1 R_GPS = np.eye(4) * 5 # 预测步骤 x_hat_prior = F @ x_hat P_prior = F @ P @ F.T + Q # 假设有一个新的GPS测量值 [x_GPS, y_GPS, v_x_GPS, v_y_GPS] z_GPS = np.array([5, 5, 1, 1]) # 位置和速度测量值 # 计算卡尔曼增益 K = P_prior @ H_GPS.T @ np.linalg.inv(H_GPS @ P_prior @ H_GPS.T + R_GPS) # 更新步骤 x_hat = x_hat_prior + K @ (z_GPS - H_GPS @ x_hat_prior) P = (np.eye(4) - K @ H_GPS) @ P_prior print("更新后的状态估计:", x_hat) print("更新后的协方差矩阵:", P)

总结

采用 (4 \times 4) 的观测矩阵是可行的,前提是测量向量包含了位置和通过位置计算得出的速度信息。这种方法能够充分利用GPS数据,提高速度估计的精度。在实际应用中,选择何种观测矩阵取决于具体的测量数据和系统要求。如果能实时计算和获取速度测量值,扩展观测矩阵并使用包含速度信息的测量向量确实是一种有效的方案。

在使用卡尔曼滤波进行数据融合时,是否拓展观测矩阵(即是否包含速度信息)会带来不同的优势和区别。具体来说,主要差异体现在测量精度、计算复杂度和适用场景等方面。

拓展观测矩阵的优势和区别

  1. 精度提高

    • 优势:包含速度信息的测量向量可以显著提高速度估计的精度。通过直接观测速度,滤波器能够更快速和准确地调整对速度的估计,从而提高整体状态估计的精度。
    • 区别:未拓展观测矩阵仅包含位置信息,需要通过位置的差分来间接计算速度,这种方法可能会受到位置测量误差和采样间隔不一致的影响,从而导致速度估计不够准确。
  2. 滤波器响应速度

    • 优势:拓展观测矩阵使得滤波器可以更迅速地响应速度变化,因为速度信息是直接测量而不是通过间接计算得出。这在快速运动或加速度变化较大的情况下尤为重要。
    • 区别:不拓展观测矩阵时,速度估计需要依赖于位置变化,可能会滞后于实际速度的变化。
  3. 传感器数据融合

    • 优势:如果传感器能够提供速度信息(例如一些高精度的GPS模块或其他测速传感器),直接将速度信息纳入观测向量可以更充分地利用这些传感器的数据,提高滤波器的性能。
    • 区别:如果只有位置传感器(如普通GPS),则需要通过位置差分计算速度,传感器数据的利用率较低。
  4. 计算复杂度

    • 区别:拓展观测矩阵会增加观测向量和观测噪声矩阵的维度,增加卡尔曼增益计算的复杂度。但是对于现代计算设备来说,这种增加的计算量通常是可以接受的。
  5. 系统复杂性

    • 区别:拓展观测矩阵需要额外处理速度信息,增加了系统的复杂性,特别是在传感器数据预处理和滤波器设计上。

不拓展观测矩阵的优势和区别

  1. 系统简单性

    • 优势:系统设计和实现相对简单,因为只需要处理位置数据。这对于资源有限的系统(如小型嵌入式系统)尤其重要。
    • 区别:不拓展观测矩阵时,系统只需处理位置数据,传感器数据处理和滤波器设计相对简单。
  2. 适用场景

    • 优势:在速度变化不剧烈或对速度估计精度要求不高的场景下,不拓展观测矩阵的方案可能足够满足需求,且能简化系统设计和实现。
    • 区别:对于速度变化剧烈的场景,不拓展观测矩阵可能无法提供足够的精度和响应速度。

总结

  • 拓展观测矩阵:通过包含速度信息,能够提高估计精度和响应速度,更好地利用传感器数据,适用于对速度估计精度要求高的应用场景,但会增加系统复杂性和计算量。
  • 不拓展观测矩阵:系统实现简单,计算量较小,适用于对速度估计精度要求不高的应用场景,但在快速运动或加速度变化较大的情况下可能表现不佳。

具体选择哪种方案取决于实际应用的需求、传感器的能力以及计算资源的限制。在实际系统中,这种选择通常是一个权衡过程,需根据具体情况进行设计和调整。

本文作者:James

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!