飞控IMU姿态估计流程

飞控中使用加速度计,陀螺仪,磁罗盘进行姿态估计算法流程。

step1:

获取陀螺仪,加速度计,磁罗盘的原始数值。

step2:

陀螺仪,加速度计减去固定的偏移后得到校准数值,磁罗盘通过偏移和缩放后得到校准数值。(都是在载体坐标系下的测量值)。

step3:

首先根据上次的飞控姿态四元数计算出载体坐标系在世界坐标系中的旋转矩阵。
公式:从四元数 q ( w , x , y , z ) q(w,x,y,z) q(w,x,y,z)到旋转矩阵
[ 1 − 2 y 2 − 2 z 2 2 x y + 2 w z 2 x z − 2 w y 2 x y − 2 w z 1 − 2 x 2 − 2 z 2 2 y z + 2 w x 2 x z + 2 w y 2 y z − 2 w x 1 − 2 x 2 − 2 y 2 ] \begin{bmatrix} {1 - 2{y^2} - 2{z^2}} & {2xy + 2wz} & {2xz - 2wy} \\ {2xy - 2wz} & {1 - 2{x^2} - 2{z^2}} & {2yz + 2wx} \\ {2xz + 2wy} & {2yz - 2wx} & {1 - 2{x^2} - 2{y^2}} \\ \end{bmatrix} 12y22z22xy2wz2xz+2wy2xy+2wz12x22z22yz2wx2xz2wy2yz+2wx12x22y2
该旋转矩阵可以把载体坐标系中的测量值转换到世界坐标系下。
代码

q0q1 = imu->w * imu->x;
q0q2 = imu->w * imu->y;
q1q1 = imu->x * imu->x;
q1q3 = imu->x * imu->z;
q2q2 = imu->y * imu->y;
q2q3 = imu->y * imu->z;
q3q3 = imu->z * imu->z;
q1q2 = imu->x * imu->y;
q0q3 = imu->w * imu->z;
// 载体坐标下的x方向向量,单位化。
att_matrix[0][0] = 1 - (2*q2q2 + 2*q3q3);
att_matrix[0][1] = 2*q1q2 - 2*q0q3;
att_matrix[0][2] = 2*q1q3 + 2*q0q2;

// 载体坐标下的y方向向量,单位化。
att_matrix[1][0] = 2*q1q2 + 2*q0q3;
att_matrix[1][1] = 1 - (2*q1q1 + 2*q3q3);
att_matrix[1][2] = 2*q2q3 - 2*q0q1;

// 载体坐标下的z方向向量(等效重力向量、重力加速度向量),单位化。
att_matrix[2][0] = 2*q1q3 - 2*q0q2;
att_matrix[2][1] = 2*q2q3 + 2*q0q1;
att_matrix[2][2] = 1 - (2*q1q1 + 2*q2q2);

step4:

计算载体坐标系x轴在世界坐标系水平面的方向向量(可将世界坐标系xy平面加速度转换到航向坐标系平面),取选择矩阵第一列的前两个数并归一化。

imu->hx_vec[0] = att_matrix[0][0];
imu->hx_vec[1] = att_matrix[1][0];
//对hx_vec进行归一化即为载体坐标系x轴在世界坐标系水平面的方向向量

step5:

计算ACC归一化后的重力方向向量和等效重力向量的叉积,结果越大说明两个向量角度越大。(该结果在后续第7步计算融合角速度)

//acc_norm[3]为加速度计传感器测量值归一化后结果
// 测量值与等效重力向量的叉积
vec_err[0] =  (acc_norm[1] * att_matrix[2][2] - att_matrix[2][1] * acc_norm[2]);
vec_err[1] = -(acc_norm[0] * att_matrix[2][2] - att_matrix[2][0] * acc_norm[2]);
vec_err[2] = -(acc_norm[1] * att_matrix[2][0] - att_matrix[2][1] * acc_norm[0]);

step6:

将载体坐标系下罗盘数据通过旋转矩阵转移到世界坐标系下,得到在世界坐标系水平面上的向量并归一化。该向量与(1,0)向量叉乘(计算朝向相对南北的误差)和点乘(计算相对南北的方向)。

step7:

计算机体坐标系下的角速度融合值(融合陀螺仪,磁罗盘)
角速度融合值 = 陀螺仪传感器加速度测量值+重力方向误差系数1+重力方向误差积分系数2+磁罗盘角度误差在各个方向分量*系数3
重力方向误差定义为:姿态估计重力方向和加速度计测量重力方向夹角大小。

for(u8 i = 0;i<3;i++)
{
	vec_err_i[i] +=  vec_err[i] *dT;
	d_angle[i] = (gyr[i] + vec_err[i] * akp  + vec_err_i[i] * aki + mag_yaw_err *imu->z_vec[i] *mkp) * dT / 2 ;
}

这里乘 1 / 2 1/2 1/2的系数的原因,可以参考第8步中四元数的微分形式公式

step8:

使用四元数的微分形式进行姿态更新
[ q ˙ 0 q ˙ 1 q ˙ 2 q ˙ 3 ] = 1 2 [ q 0 − q 1 − q 2 − q 3 q 1 q 0 − q 3 q 2 q 2 q 3 q 0 − q 1 q 3 − q 2 q 1 q 0 ] [ 0 ω x b ω z b ω z b ] \begin{bmatrix} {{{\dot q}_0}} \\ {{{\dot q}_1}} \\ {{{\dot q}_2}} \\ {{{\dot q}_3}} \\ \end{bmatrix} =\frac{1}{2} \begin{bmatrix} {{q_0}} & { - {q_1}} & { - {q_2}} & { - {q_3}} \\ {{q_1}} & {{q_0}} & { - {q_3}} & {{q_2}} \\ {{q_2}} & {{q_3}} & {{q_0}} & { - {q_1}} \\ {{q_3}} & { - {q_2}} & {{q_1}} & {{q_0}} \\ \end{bmatrix} \begin{bmatrix} 0 \\ {\omega _x^b} \\ {\omega _z^b} \\ {\omega _z^b} \\ \end{bmatrix} q˙0q˙1q˙2q˙3=21q0q1q2q3q1q0q3q2q2q3q0q1q3q2q1q00ωxbωzbωzb
代码:

imu->w = imu->w            - imu->x*d_angle[X] - imu->y*d_angle[Y] - imu->z*d_angle[Z];
imu->x = imu->w*d_angle[X] + imu->x            + imu->y*d_angle[Z] - imu->z*d_angle[Y];
imu->y = imu->w*d_angle[Y] - imu->x*d_angle[Z] + imu->y            + imu->z*d_angle[X];
imu->z = imu->w*d_angle[Z] + imu->x*d_angle[Y] - imu->y*d_angle[X] + imu->z;
//然后对(w,x,y,z)进行归一化,即为新的姿态估计
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仟人斩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值