惯性导航算法(六)-姿态更新算法示例

姿态更新算法示例

以四元数为例

在这里插入图片描述

由上图可知:
已知量我们是需要前一历元的姿态(如果是第一步递推的话,那么就是初始对准的姿态),以及当前和前一历元的角增量(因为双子样解算)
在这里插入图片描述
牵连角速度:载体在地球球面运动而造成的当地水平坐标系发生的角度变化率

惯导姿态算法小结

1.欧拉角:简单明了,概念直观,容易理解,当俯仰角接近90
度时方程出现退化现象,所以这种方法只适用于水平姿态变
化不大的情况,而不适用于全姿态运载体的姿态确定。

2.方向余弦矩阵:避免了方程退化的问题,可全姿态工作。但
包含了九个未知量的线性微分方程组,计算量大。

3.四元数:只需求解四个未知量的线性方程组,计算量比方向
余弦法小,且算法简单,易于操作。

4.等效旋转矢量:采用多子样算法,对不可交换误差做有效补
偿,算法关系简单,易于操作,并且通过对系数的优化处理
使算法漂移在相同子样算法中达到最小,因此特别适用于角
机动频繁激烈或存在严重角振动的运载体的姿态更新。

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
捷联惯性导航(Inertial Navigation System,简称INS)是一种利用惯性测量单元(Inertial Measurement Unit,简称IMU)进行航位解算的技术。在INS中,IMU测量了飞行器在三个方向上的加速度和角速度,并通过数学模型进行姿态解算、速度解算和位置解算,从而实现飞行器的导航。下面是一个基于C语言的简单的INS算法示例: ```c #include <stdio.h> #include <math.h> #define PI 3.14159265358979323846 double rad2deg(double rad) { return rad / PI * 180.0; } double deg2rad(double deg) { return deg / 180.0 * PI; } void ins(double ax, double ay, double az, double gx, double gy, double gz, double dt) { static double pitch = 0.0; static double roll = 0.0; static double yaw = 0.0; static double vx = 0.0; static double vy = 0.0; static double vz = 0.0; static double lat = 0.0; static double lon = 0.0; static double alt = 0.0; double pitch_acc = atan2(-ax, sqrt(ay * ay + az * az)); double roll_acc = atan2(ay, sqrt(ax * ax + az * az)); pitch = 0.98 * (pitch + gx * dt) + 0.02 * pitch_acc; roll = 0.98 * (roll + gy * dt) + 0.02 * roll_acc; yaw = yaw + gz * dt; double vx_acc = ax; double vy_acc = ay; double vz_acc = az; double vx_gps = vx; double vy_gps = vy; double vz_gps = vz; vx = 0.98 * (vx + vx_acc * dt) + 0.02 * vx_gps; vy = 0.98 * (vy + vy_acc * dt) + 0.02 * vy_gps; vz = 0.98 * (vz + vz_acc * dt) + 0.02 * vz_gps; double r = 6371000.0; double lat_acc = rad2deg(lat + vx / (r + alt) * dt); double lon_acc = rad2deg(lon + vy / ((r + alt) * cos(deg2rad(lat))) * dt); double alt_acc = alt + vz * dt; lat = 0.98 * lat + 0.02 * lat_acc; lon = 0.98 * lon + 0.02 * lon_acc; alt = 0.98 * alt + 0.02 * alt_acc; printf("pitch: %f, roll: %f, yaw: %f, vx: %f, vy: %f, vz: %f, lat: %f, lon: %f, alt: %f\n", pitch, roll, yaw, vx, vy, vz, lat, lon, alt); } int main() { double ax = 0.0; double ay = 0.0; double az = 9.81; double gx = 0.0; double gy = 0.0; double gz = 0.0; double dt = 0.1; for (int i = 0; i < 100; i++) { ins(ax, ay, az, gx, gy, gz, dt); } return 0; } ``` 这个示例中,我们假设IMU测量到的加速度和角速度分别为ax、ay、az、gx、gy、gz,采样时间为dt。在ins函数中,我们首先根据加速度计算出飞行器的俯仰角和滚转角,然后根据角速度进行修正。接着,我们将加速度和GPS测量的速度进行融合,得到飞行器的速度。最后,我们根据速度和GPS测量的位置进行融合,得到飞行器的位置。在这个示例中,我们简单地采用了加权平均的方法对加速度和GPS测量进行融合,实际应用中可能需要更加复杂的滤波算法

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

十八与她

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

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

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

打赏作者

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

抵扣说明:

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

余额充值