【问题标题】:Kalman Filter for height and acceleration高度和加速度的卡尔曼滤波器
【发布时间】:2015-03-27 13:13:21
【问题描述】:

我正在研究 stm32f417ve 臂处理器并尝试实现卡尔曼滤波器,以将加速度计数据与高度(压力传感器)数据融合。 我想知道估计的垂直速度和位置。加速度计读数从车身框架旋转到地球框架,这不是问题。 我已经在互联网上搜索了很多,也发现了一些有趣的东西,但我不确定我的情况是否适合我找到的其他情况,所以我在这里:) 这篇文章 (Using Kalman filter with acceleration and position inputs) 与这篇文章非常相似,但我需要更多帮助。 我还有一个 MPU6000 作为 6DOF imu 和一个 MS5611 baro。我认为,结合这些数据的最佳方式是使用加速度作为控制输入,对吗? 也许有人可以看看我的矩阵和公式来告诉我,它是否正确。

公式:

//PREDICT

x = A*x + B*u

p = A*p*AT + Q

//UPDATE

Innovation = (H*p*HT + R)^-1

K = p*HT*Innovation

x = x + K*(y-H*x)

p = (I-K*H)*p

矩阵化:

#define NumState 3
#define NumInput 1
#define NumOutput 1

static float32_t xAr[NumState][1];

static float32_t uAr[NumInput][1];

static float32_t yAr[NumOutput][1];

static float32_t AAr[NumState][NumState];

static float32_t BAr[NumState][NumInput];

static float32_t HAr[NumOutput][NumState];

static float32_t QAr[NumState][NumState];

static float32_t RAr[NumOutput][NumOutput];

static float32_t PAr[NumState][NumState];

static float32_t kAr[NumState][NumOutput];

static float32_t IAr[NumState][NumState];

我将加速度放入向量 u 中,将高度放入 y 中。 Matrix IAr 只是一个单位矩阵,所以它的对角元素是 1。

    RAr[0][0] = 0.1f;

    QAr[0][0] = 1.0f;
    QAr[0][1] = 1.0f;
    QAr[0][2] = 0.0f;
    QAr[1][0] = 1.0f;
    QAr[1][1] = 1.0f;
    QAr[1][2] = 0.0f;
    QAr[2][0] = 0.0f;
    QAr[2][1] = 0.0f;
    QAr[2][2] = 0.0f;

    uAr[0][0] = AccZEarth;
    yAr[0][0] = Height;

    HAr[0][0] = 1.0f;
    HAr[0][1] = 0.0f;
    HAr[0][2] = 0.0f;

    BAr[0][0] = (dt*dt)/2;
    BAr[1][0] = dt;
    BAr[2][0] = 0.0f;

    AAr[0][0] = 1.0f;
    AAr[0][1] = dt;
    AAr[0][2] = 0.0f - ((dt*dt)/2.0f);
    AAr[1][0] = 0.0f;
    AAr[1][1] = 1.0f;
    AAr[1][2] = 0.0f - dt;
    AAr[2][0] = 0.0f;
    AAr[2][1] = 0.0f;
    AAr[2][2] = 1.0f;

    IAr[0][0] = 1.0f;
    IAr[0][1] = 0.0f;
    IAr[0][2] = 0.0f;
    IAr[1][0] = 0.0f;
    IAr[1][1] = 1.0f;
    IAr[1][2] = 0.0f;
    IAr[2][0] = 0.0f;
    IAr[2][1] = 0.0f;
    IAr[2][2] = 1.0f;

    PAr[0][0] = 100.0f;
    PAr[0][1] = 0.0f;
    PAr[0][2] = 0.0f;
    PAr[1][0] = 0.0f;
    PAr[1][1] = 100.0f;
    PAr[1][2] = 0.0f;
    PAr[2][0] = 0.0f;
    PAr[2][1] = 0.0f;
    PAr[2][2] = 100.0f;

如果你们中的一些人可以看看并告诉我我是对还是错,那就太好了!

谢谢, 克里斯

【问题讨论】:

    标签: height stm32 kalman-filter


    【解决方案1】:

    首先要确定您打算一起使用的两个传感器是否是一个很好的补充。随着双积分误差的累积,MEMS IMU 位置将迅速发散。要在此应用程序中成功使用它,您必须校准它的偏差和比例。这些在每个轴上都会有所不同,鉴于您的一维状态,必须在过滤器之外应用。由于您可能会在户外(高度计很有趣),因此您的偏差/刻度校准也应该进行温度补偿。

    您可以通过在 IMU 放在您的办公桌上时执行 x = A*x + B*u 循环来轻松测试 IMU,以查看 x[0] 变大的速度有多快。鉴于我对 IMU 和高度计的了解(不如 IMU 多),我猜你的 IMU 派生位置会在几秒钟内比你的原始高度计读数更差。如果偏差和比例没有正确校准,速度会更快。只有当 IMU 的短期精度明显优于高度计的短期精度时,卡尔曼滤波器才值得“融合”这两个传感器。

    如果您确实继续使用 KF,您的结构通常看起来不错。以下是一些具体的 cmets:

    • 您将加速建模为-x[2]。 (减号是由于您的矩阵A。我不确定您为什么选择否定加速。)我不认为在您的状态下加速对您有什么好处。 ... + B*u 使用 IMU 方法的优点之一是您不必保持加速度(正如您的 B 矩阵所示)。如果加速度是一个测量,你必须把它放在你的状态向量中,因为H=[0 0 1]
    • 您还没有努力选择PQR。这些是 KF 中最重要的矩阵。这里的另一个答案可能会有所帮助:https://electronics.stackexchange.com/questions/86102/kalman-filter-on-linear-acceleration-for-distance/134975#134975

    【讨论】:

      【解决方案2】:

      感谢您的回答! 到目前为止,我一直在使用互补过滤器将 acc 数据与 baro 数据融合。 acc 的所有三个轴都已补偿。 现在,我有一个一维卡尔曼滤波器,它可以降低气压输出的噪声,同时保持相位延迟相当小,这就是我不使用低通滤波器的原因。 我正在计算气压数据的导数,以获得基于气压的速度,它有大约 100 毫秒的延迟。 然后将该速度与通过积分计算的 acc 速度一起馈入第一个互补滤波器。 第二个互补滤波器使用此融合速度(无漂移且几乎没有延迟)并将其集成以将其与气压高度数据融合。 这工作得很好,但我想尝试卡尔曼滤波器,看看是否有可能从中获得更准确的数据。 在网上,如果找到这篇论文:http://www.actawm.pb.edu.pl/volume/vol8no2/06_2014_004_ROMANIUK_GOSIEWSKI.pdf 它似乎很符合我的“问题”,所以我决定以它为起点。 我的矩阵 A 中的负号来自于此,可能是由于它们的安装方向。我要检查一下;)

      最好的问候 克里斯

      【讨论】:

        猜你喜欢
        • 2013-08-11
        • 1970-01-01
        • 1970-01-01
        • 2011-07-15
        • 2020-10-31
        • 1970-01-01
        • 1970-01-01
        • 2015-03-22
        • 1970-01-01
        相关资源
        最近更新 更多