组合导航中航向约束

前言

在GNSS/INS导航中,载体处于静止或匀速运动状态时,航向角容易发散;利用外部的姿态信息进行约束,可以提高航向角的精度。

一、航向发散的原因

IMU的误差公式如下:
在这里插入图片描述在上式中可以看到,对失准角误差影响最大的是速度误差方程中的fn项 ;简化可得到
在这里插入图片描述分析可知,pitch和roll的失准角误差可以利用fn在z方向的分量进行约束,yaw失准角误差只能利用fn在x和y方向的分量进行约束,在静止或匀速运动过程中,fn在x和y方向的值变化很小,导致yaw失准角误差可观测性变弱了,航向慢慢发散。

二、航向约束

假设外部给定的双天线航向角跟组合结果的航向角相等,即:
在这里插入图片描述进行误差扰动分析可得:
在这里插入图片描述同时,由平台误差角和平台失准角的关系为[1]:
在这里插入图片描述其中,航向误差跟航向失准角的关系为:
在这里插入图片描述代入扰动方程得到最终的航向约束方程:
在这里插入图片描述

三、参考资料

[1] 链接: 平台失准角与姿态误差角的区别

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是使用六轴四元素解算航向的C语言代码示例: ``` #include <math.h> #define PI 3.14159265358979323846 // 陀螺仪、加速度计、磁力计原始数据 float gyro_x, gyro_y, gyro_z; // 陀螺仪速度,单位:弧度/秒 float accel_x, accel_y, accel_z; // 加速度计加速度,单位:g float mag_x, mag_y, mag_z; // 磁力计磁场强度,单位:高斯 // 四元素 float q0 = 1, q1 = 0, q2 = 0, q3 = 0; // 根据加速度计和磁力计数据计算四元素 void update_quaternion() { float norm; float hx, hy, _2bx, _2bz; float s1, s2, s3, s4; float q_dot1, q_dot2, q_dot3, q_dot4; // 归一化加速度计数据 norm = sqrt(accel_x * accel_x + accel_y * accel_y + accel_z * accel_z); accel_x /= norm; accel_y /= norm; accel_z /= norm; // 归一化磁力计数据 norm = sqrt(mag_x * mag_x + mag_y * mag_y + mag_z * mag_z); mag_x /= norm; mag_y /= norm; mag_z /= norm; // 计算辅助变量 hx = 2 * mag_x * (0.5 - q2 * q2 - q3 * q3) + 2 * mag_y * (q1 * q2 - q0 * q3) + 2 * mag_z * (q1 * q3 + q0 * q2); hy = 2 * mag_x * (q1 * q2 + q0 * q3) + 2 * mag_y * (0.5 - q1 * q1 - q3 * q3) + 2 * mag_z * (q2 * q3 - q0 * q1); _2bx = sqrt(hx * hx + hy * hy); _2bz = 2 * mag_x * (q1 * q3 - q0 * q2) + 2 * mag_y * (q2 * q3 + q0 * q1) + 2 * mag_z * (0.5 - q1 * q1 - q2 * q2); // 计算方向余弦矩阵的误差项 s1 = -q2 * accel_x + q1 * accel_y + q0 * accel_z; s2 = q3 * accel_x + q0 * accel_y - q1 * accel_z; s3 = -q0 * accel_x + q3 * accel_y - q2 * accel_z; s4 = q1 * accel_x + q2 * accel_y + q3 * accel_z; // 计算四元素误差项 q_dot1 = 0.5 * (-q1 * gyro_x - q2 * gyro_y - q3 * gyro_z) - 0.5 * s1; q_dot2 = 0.5 * (q0 * gyro_x + q2 * gyro_z - q3 * gyro_y) - 0.5 * s2; q_dot3 = 0.5 * (q0 * gyro_y - q1 * gyro_z + q3 * gyro_x) - 0.5 * s3; q_dot4 = 0.5 * (q0 * gyro_z + q1 * gyro_y - q2 * gyro_x) - 0.5 * s4; // 更新四元素 q0 += q_dot1 * dt; q1 += q_dot2 * dt; q2 += q_dot3 * dt; q3 += q_dot4 * dt; // 归一化四元素 norm = sqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3); q0 /= norm; q1 /= norm; q2 /= norm; q3 /= norm; } // 获取航向(单位:弧度) float get_heading_angle() { float yaw; // 计算方向余弦矩阵 float matrix[3][3] = { {1 - 2 * q2 * q2 - 2 * q3 * q3, 2 * q1 * q2 - 2 * q0 * q3, 2 * q1 * q3 + 2 * q0 * q2}, {2 * q1 * q2 + 2 * q0 * q3, 1 - 2 * q1 * q1 - 2 * q3 * q3, 2 * q2 * q3 - 2 * q0 * q1}, {2 * q1 * q3 - 2 * q0 * q2, 2 * q2 * q3 + 2 * q0 * q1, 1 - 2 * q1 * q1 - 2 * q2 * q2} }; // 计算航向 yaw = atan2(matrix[1][0], matrix[0][0]); if (yaw < 0) { yaw += 2 * PI; } return yaw; } int main() { while (1) { // 读取陀螺仪、加速度计、磁力计数据 // ... // 更新四元素 update_quaternion(); // 获取航向 float yaw = get_heading_angle(); } return 0; } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值