引自:http://www.asensing.com/portal/article/index/cid/79/id/432.html
1、惯性导航系统是唯一可以输出完备的六自由度数据的设备、数据更新频率高(100Hz)、是定位信息的融合中心。目前GNSS+IMU构成的组合导航系统是主流的定位系统方案。将视觉传感器、雷达、激光雷达、车身系统信息进行更深层次的融合
2、惯导中使用的核心算法主要包括3种:1. 惯性导航解算算法;2. 组合导航的卡尔曼滤波器的耦合。3. 环境特征信息(激光雷达?地图约束?)与惯性导航融合是必然趋势。
3、通常单纯采用GNSS的定位系统的延迟是100ms,在时速120km/h的时候,100ms的延迟意味着3.3米的误差。摄像头的帧率一般是30Hz,时间不确定性为33ms;GNSS延迟一般是100-200ms;而惯导预测状态的延迟最短只有几ms,因此可以用惯导估算并补偿其他传感器的延迟,实现全局同步。
4、惯导计算得到的状态,用于预测车辆当前的位置,再和卫星定位接收机得到的位置(或观测数据)进行比较。比较的偏差包含了惯导的推算误差和卫星接收机的定位误差,通过数据融合算法进行加权后,用于修正惯导的预测,让惯导的预测越来越准确。(惯导对齐后的推算位置对比GPS的实际位置产生的误差进行加权)
5、主要瓶颈在高精度惯组芯片设计、封装以及组合导航算法设计技术上
6、惯性导航系统在自动驾驶中的应用属于起步阶段,短期内竞争力主要体现在算法上。算法的优劣决定传感器是否能发挥其最佳性能,也决定了惯性导航系统的稳定性和可靠性。惯导中使用的核心算法主要包括3种:
1. 惯性导航解算算法。包括MEMS惯性传感器的标定等硬件信息的处理,速度、加速度、航向及姿态的确定等;
2. 组合导航的卡尔曼滤波器的耦合。对IMU及GNSS等的输出信号进行融合。
3.(融合激光雷达/视觉传感定位等)环境特征信息与惯性导航融合是必然趋势。
--------------------------------------------------------------------------------------------------------------------------------
优化内存:来自https://www.cnblogs.com/mini-coconut/p/8511872.html
1、指针比较灵活简洁,而数组则比较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。
2、用指针运算代替数组索引,指针一般能使代码速度更快,占用空间更少。使用多维数组时差异更明显。array的地址每次装入地址p后,在每次循环中只需对p增量操作;
A = array[t++] A = *(p++)
3、类型名
(1)能够使用字符型(char)定义的变量,就不要使用整型(int)变量来定义
(2)能够使用整型(int)变量定义的变量就不要用长整型(long int)
(3)能不使用浮点型(float)变量就不要使用浮点型变量
(4)在定义变量后不要超过变量的作用范围
(5)不要带printf打印
4、减少运算强度
(1)查表
基本上不会在自己的主循环里搞什么运算工作,绝对是先计算好了,再到循环里查表。如果表很大,不好写,就写一个init函数,在循环外临时生成表格。(先把基站的坐标转换用初始化函数写好,然后单独写一个寻址的函数作为查表输出)
(2)求余
a=a%8; 可以改为: a=a&7; (主要是因为%是需要额外调用算法的,消耗资源)
(3)平方
a=pow(a, 2.0); 可以改为: a=a*a;
(4)用移位实现乘除法运算(只要是乘以或除以一个整数,要求是整数,不大会用,谨慎用)
a=a*4; b=b/4; 可以改为: a=a<<2; b=b>>2; (还可以这么操作?666)
(5)使用增量++和减量--操作符
(6)使用复合赋值表达式 (如a-=1及a+=1等)
5、结构体成员
(1)把结构体的成员按照它们的类型长度排序,声明成员时把长的类型放在短的前面。应该首先存放多字节数据,然后再存放单字节数据,
(2)频繁使用的指针型参数拷贝到本地变量。(怎么操作??)
避免在函数中频繁使用指针型参数指向的值
6、循环优化
(1)充分分解小的循环 ,(最好是单循环)
(2)对于一些不需要循环变量参加运算的任务可以把它们放到循环外面,这里的任务包括表达式、函数的调用、指针运算、数组访问等,应该将没有必要执行多次的操作全部集合在一起,放到一个init的初始化程序中进行。(相同的变量统一初始化)
(3)延时函数,主要是针对循环函数
for (i=0;i<1000;i++) ;改为 for (i=1000;i>0;i--) ;
但是在循环中有通过循环变量“i”读写数组的指令时,使用预减循环有可能使数组超界。
(4)在这两种循环中,使用do…while循环编译后生成的代码的长度短于while循环。
do{
sum=sum+i;
i++;
}
while(i<=100);
(5)无限循环
常用的两种方法是while (1) 和 for (;;),最终后者指令少,不占用寄存器,而且没有判断、跳转,
7、函数优化
(1)使用全局变量比函数传递参数更加有效率。这样做去除了函数调用参数入栈和函数完成后参数出栈所需要的时间。然而决定使用全局变量会影响程序的模块化和重入,故要慎重使用。
(2)所有函数都应该有原型定义 + 尽可能使用常量(const) + 把本地函数声明为静态的(static) + 假如返回值从来不会被用到,应该使用void来明确声明函数不返回任何值
8、变量
同时声明多个变量优于单独声明变量 + 短变量名优于长变量名 + 在循环开始前声明变量 + 在if结构中如果要判断的并列条件较多,最好将它们拆分成多个if结构,然后嵌套在一起
在最内层循环避免使用全局变量和静态变量 + 尽量避免把一个变量地址传递给另一个函数,虽然这个还很常用
a = b(); c(&d);