LIO-SAM学习笔记-整体框架

开源SLAM系统:LIO-SAM源码解析 | 攻城狮の家

LIO-SAM在LEGO-LOAM上的改进

1. 由于支持手持设备,因此没有对地面点进行特殊处理

2. 紧耦合的lidar+imu融合模块,充分利用了imu数据,对快速旋转的场景有更好的鲁棒性

3. 融合GPS,全局地图可以在没有回环的情况下有更好的全局一致性

4. 框架易于扩展

 

其代码的组织结构来看,和LEGO-LOAM区别不大:

  • imageProjection.cpp:点云投影成深度图,并分类,利用ring和time给每个点去畸变。
  • featureExtraction.cpp:提取边缘点和平面点特征。
  • mapOptmization.cpp:基于因子图,构建点线、点面约束,回环,GPS等各种因子,最后增量平滑全图位姿。
  • imuPreintegration.cpp:联合优化激光odom和imu数据,估计IMU偏差,进行实时的里程计估算。

大多数IMU坐标系为NED(北、东、下),robot_localization假定的IMU数据使用ENU坐标系

当k时刻的状态发生变化,则通过imu积分得到的k+1时刻的状态也会发生相应变化,而基于滑动窗口的后端优化或者因子图优化中,这些状态量会经常进行调整,如果每次状态调整都要重新计算imu积分,计算量太大。发现预积分量和k以及k+1时刻的状态无关,因此当k时刻状态发生变化时,不需要将imu数据重新积分。

由于imu的零偏会随时间发生变化,因此零偏也是系统的优化变量之一,虽然预积分量与两帧之间的速度和姿态无关,但与零偏相关。为了避免零偏的变化导致预积分重新积分,考虑到零偏的变化在段时间内变化非常小,因此将零偏一阶泰勒展开近似。

预积分量关于零偏的雅克比矩阵会在预积分计算的时候一起计算,因此,当零偏被优化调整之后,根据计算好的雅克比矩阵对预积分量进行更新即可。

实际系统是离散的,因此,每收到一帧新的imu数据后更新一次预积分量,这是一个求和的过程

预积分如何使用?

预积分约束了相邻两帧的状态量,两帧之间的零偏几乎相等。imu累计会漂移,在VIO中imu预积分和重投影误差共同约束两帧之间的状态量。

 蓝色圆圈代表关键帧位姿,蓝色矩形代表关键帧速度和零偏,橙色矩形代表 IMU 预积分约束,可
以看到,它可以约束相邻帧的位姿、速度和零偏,绿色矩形代表 lidar 里程记的帧间约束,其约束相邻两帧的位置和姿态

imu标定方法

【学习总结】Lidar与IMU标定_larry_dongy的博客-CSDN博客_lidar和imu标定

lidar坐标系与imu坐标系不一致。手眼标定算法,即使先计算出两帧 lidar 之间的旋转(通过 ICP 、 NDT 等点云配准算法),然后计算出两帧 IMU 之间的旋转( IMU 陀螺仪积分),然后通过手眼标定的方式求解出外参

lidar和imu之间的旋转外参比平移外参对性能的影响更大 。

以带有IMU加速计和gps信号的小车为例,用EKF滤波和图优化方法求解某一时刻小车行驶的位置(t=0时,位置为0)

EKF:

假设已知IMU和gps传感器的噪声方差

  1. 预测。 假设已知t-1时刻小车的位置(后验),将其与(t-1)~t时间段内imu的积分相加,可以预测t时刻小车的位置(先验)
  2. 更新。 计算卡尔曼增益,用t时刻的gps数据更新预测的位置,得到t时刻的位置(后验)。

(这里有点递归的感jio。。。)

图优化:

小车在t-1时刻的位置加上(t-1)~t时间段内的imu积分,得到t时刻预测的小车位置。将该值与t时刻gps观测数据相减后做平方和,得到一个代价函数,其中,小车位置是待优化变量。最后用最优化方法求解即可。

猜你喜欢

转载自blog.csdn.net/luoyihao123456/article/details/125191299
今日推荐