开源飞控OpenPilot的扩展卡尔曼滤波EKF学习笔记(五)

本文是关于开源飞控OpenPilot中扩展卡尔曼滤波(EKF)的学习笔记,主要探讨了滤波修正过程,包括线性化H矩阵、预测观测量的计算以及状态变量的修正和更新。作者通过分析代码详细解释了EKF的实现步骤,并预告下篇将深入讲解EKF的理论基础。

出差归来,接着说,上回书说到函数INSCorrection,这个函数进行具体的滤波修正。

INSCorrection(this->work.mag, this->work.pos, this->work.vel, this->work.baro[0], sensors);  
进去看看。

    float Z[10], Y[10];
    float Bmag, qmag;

    // GPS Position in meters and in local NED frame
    Z[0] = Pos[0];
    Z[1] = Pos[1];
    Z[2] = Pos[2];

    // GPS Velocity in meters and in local NED frame
    Z[3] = Vel[0];
    Z[4] = Vel[1];
    Z[5] = Vel[2];

    // magnetometer data in any units (use unit vector) and in body frame
    Bmag =
        sqrtf(mag_data[0] * mag_data[0] + mag_data[1] * mag_data[1] +
              mag_data[2] * mag_data[2]);
    Z[6] = mag_data[0] / Bmag;
    Z[7] = mag_data[1] / Bmag;
    Z[8] = mag_data[2] / Bmag;

    // barometric altimeter in meters and in local NED frame
    Z[9] = BaroAlt;
先是一段赋值,我们知道Z阵是新息,这里先把所有能用到的传感器数据赋值到新息矩阵。

    LinearizeH(ekf.X, ekf.Be, ekf.H);
然后是对H阵进行线性化,难道H阵不是1吗,进去看看

    float q0, q1, q2, q3;

    q0 = X[6];
    q1 = X[7];
    q2 = X[8];
    q3 = X[9];

    // dP/dP=I;
    H[0][0] = H[1][1] = H[2][2] = 1.0f;
    // dV/dV=I;
    H[3][3] = H[4][4] = H[5][5] = 1.0f;

    // dBb/dq
    H[6][6] = 2.0f * (q0 * Be[0] + q3 * Be[1] - q2 * Be[2]);
    H[6][7] = 2.0f * (q1 * Be[0] + q2 * Be[1] + q3 * Be[2]);
    H[6][8] = 2.0f * (-q2 * Be[0] + q1 * Be[1] - q0 * Be[2]);
    H[6][9] = 2.0f * (-q3 * Be[0] + q0 * Be[1] + q1 * Be[2]);
    H[7][6] = 2.0f * (-q3 * Be[0] + q0 * Be[1] + q1 * Be[2]);
    H[7][7] = 2.0f * (q2 * Be[0] - q1 * Be[1] + q0 * Be[2]);
    H[7][8] = 2.0f * (q1 * Be[0] + q2 * Be[1] + q3 * Be[2]);
    H[7][9] = 2.0f * (-q0 * Be[0] - q3 * Be[1] + q2 * Be[2]);
    H[8][6] = 2.0f * (q2 * Be[0] - q1 * Be[1] + q0 * Be[2]);
    H[8][7] = 2.0f * (q3 * Be[0] - q0 * Be[1] - q1 * Be[2]);
    H[8][8] = 2.0f * (q0 * Be[0] + q3 * Be[1] - q2 * 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值