惯性导航算法(九)-速度更新算法+划桨效应补偿+旋转效应补偿

本文详细探讨了惯性导航系统中速度更新算法的数学原理和物理意义,从惯性坐标系、地球坐标系到导航坐标系的地速微分方程建立,并解析了加速度计输出、地球自转效应和重力加速度的影响。介绍了速度微分方程的统一表示方式以及在实际计算中采用的双子样算法,讨论了速度增量计算中的关键补偿项,如旋转效应和划桨效应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

速度更新算法

惯导速度算法

符号定义

在这里插入图片描述

速度微分方程

速度是位置随时间的变化率 /位置微分,我们在惯导里面关注的是从地面观察的位置随时间的变化也就是地速,而不是以惯性系为观察角度(因为在地面上静止的车,我们认为它的速度就是0,而在惯性系下,它的速度不是0)
在这里插入图片描述
1.对于哥氏方程的理解:
从a这个坐标系观察的向量随时间的变化等于从b系观察的这个向量随时间的变化加上 b坐标系相对于a坐标系的角速度叉乘这个向量本身
2.地速在不同系下变化(时间导数)不同;可以在不同的坐标系下建立地速微分方程,i 系,e系,n系。

惯性坐标系速度微分方程

在这里插入图片描述
重点:对上述推导中的第三步的某些项的物理意义做一些阐述:
1.上图绿色框,表示地球自转角速度叉乘位置向量[这个位置向量是从地心指向我们所处位置参考坐标系的原点(比如e系指向b系得原点)],得到的是地球自转带动我们运动的一个线速度,方向是绕着纬度圈的一个圆周运动
2.上图紫色框,表示地球自转角速度叉乘地球带我们做圆周运动的速度,得到的实际上就是地球带我们做圆周运动的向心加速度
3.上图黑色框,表示万有引力减去我们做圆周运动的向心加速度,最后得到的其实就是当地的重力加速度
4.从上述解释中我们也可以知道,万有引力和当地重力不是一回事,中间差了一个向心加速度

地球坐标系速度微分方程

在这里插入图片描述
1.由上图推导的第三步我们知道,最终的地速微分方程的物理含义为:加速度计输出的比力向量减去两倍的地球自转角速度叉乘地速本身再加上当地重力
2.得到的结果是,速度的时间微分从e系里面来进行观察的速度微分方程(以e系作为参照系/观察系所得到的地速微分方程)
3.加速度计输出的比力默认就是在b系下的

导航坐标系速度微分方程

在这里插入图片描述

速度微分方程的统一表示方式

惯性导航从根本上说就是已知来自于加速度计的比力(非引力加速度)测量值在特定的坐标系内(比力测量值投影在该坐标系内,且这个坐标系相对于惯性坐标系的指向通过陀螺确定)求解牛顿力学方程。对于地球附近的导航应用,有
在这里插入图片描述

速度更新

在这里插入图片描述

速度微分方程的求解——直观猜想

在这里插入图片描述

导航系下的速度更新算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从上图中可知,解算比力积分项的时候做了两个近似处理:
1.对等效旋转矢量做小角度假设,同时忽略上式中等效旋转矢量的二阶小量
2.将等效旋转矢量近似为陀螺的角增量输出
在这里插入图片描述
被积函数难以进一步化简,只能作不同的假设处理:假设积分周期内
加速度计所测比力和陀螺所测角速度向量为时间的常值函数(单子样
算法)、线性函数(双子样算法)和二次函数(三子样算法)

速度更新的双子样算法

在这里插入图片描述
最后求得的速度增量包括,k时刻速度增量+旋转效应补偿项+划桨效应补偿项
1.划桨效应:当同时具有角震动和线震动时,这一项显得格外突出,因此得名
2.旋转效应:只要有角运动/旋转,就会有这一项
3.什么情况下Sculling补偿项为零?
当前时刻和上一时刻,角度增量相等(角速度保持不变),速度增量相等(加速度保持不变)时,两个叉乘大小相等、方向相反,一叉乘就为0了;实际中,这一项基本为0或者很小,除非有很显著、强烈的震动的时候,这一项才会很明显

Pbds全称为Perfectly Balanced Red-Black Tree,是一种平衡查找树的数据结构,它是C++标准库中的`<ext/pb_ds/rb_tree>`模块提供的一种高级模板容器,主要用于高效地存储和查找数据。它是在红黑树基础上进行了优化,保证了常数级的平均时间复杂度。 **特点:** 1. **自平衡**:插入、删除操作后的调整过程保证了树的高度最大为log(n),这使得查询操作的时间复杂度保持在O(log n)。 2. **内存效率高**:支持迭代器,可以像普通的数组或vector一样访问元素。 3. **模板化**:适用于各种数据类型,并支持自定义比较函数。 **实践示例(C++17开始引入std::any,旧版本需第三方库如Boost):** ```cpp #include <ext/pb_ds/tree_policy.hpp> // 引入PBDS策略 using namespace __gnu_pbds; // 使用namespace // 定义一个关联值类型的树模板,键为int,值为std::string template <typename K, typename V> using rb_tree = tree<K, null_type, less<K>, rb_tree_tag, tree_order_statistics_node_update>; int main() { // 创建一个rb_tree实例 rb_tree<int, std::string> myTree; // 插入元素 myTree.insert({5, "Hello"}); myTree.insert({10, "World"}); // 查找最小值 auto it = myTree.begin(); if (it != myTree.end()) { std::cout << "Smallest key is " << *it.first << " with value " << it->second << '\n'; } // 计算第3大的值 auto third_largest = myTree.order_of_key(3); // 获取值为3之前的所有节点个数 if (third_largest > 0) { it = myTree.lower_bound(third_largest); if (it != myTree.end()) { std::cout << "Third largest key is " << *it.first << " with value " << it->second << '\n'; } } return 0; } ``` **相关问题--:** 1. Pbds的红黑树相比标准的红黑树有哪些优势? 2. 如何使用Pbds的rb_tree进行范围查找? 3. 在实际项目中,何时会选择使用Pbds而不是普通的二叉搜索树?
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

十八与她

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

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

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

打赏作者

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

抵扣说明:

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

余额充值