LeGO_LOAM的IMU处理

第一部分,是在 featureAssociation.cpp

1)预处理

Core函数:imuHandler、AccumulateIMUShiftAndRotation

1、imuHandler记录每帧imu的下标-imuPointerLast和时间戳-imuTime;实现imu坐标系由x前y左z上  ==>  z前x左y(为了与相机系统一),线加速度解算,除去重力加速度影响;得到欧拉角-imuRoll等、加速度-imuAcc、角速度-imuAngularVelo;

参考:LOAM中消除IMU重力影响解析_大箱子123的博客-CSDN博客_imu 去除重力

2、AccumulateIMUShiftAndRotation换算上一步最终得到的imu系下的加速度(zxy固定轴)到世界坐标系下,用于并且根据匀加速运动积分求解位移(imuShift)、线速度(imuVelo)、角度(imuAngularRotation);

注意:imuShift位移数据好像后面没用到!

2)帧间匹配预备阶段

Core函数:adjustDistortion、updateInitialGuess

1、adjustDistortion将分割后的点云segmentedCloud,计算每个点的扫描时刻,插值该点对应的得到imuRollCur等、imuVeloCur、imuShiftCur,对于每帧的第一个点初始化imuRollStart等、imuVeloStart、imuShiftStart、imuAngularRotationCur(两次差值的得到imuAngularFromStart);

updateImuRollPitchYawStartSinCo:计算imuRollStart等3个角的sin/cos,用于函数VeloToStartIMU和TransformToStartIMU;

VeloToStartIMU:速度转换,yxz旋转,相对于该帧的起始时刻,输出imuVeloFromStartCur;

TransformToStartIMU:点云坐标系转换,zxy旋转过去,再yxz旋转回来;

ShiftToStartIMU:位移转换,yxz旋转,输出imuShiftFromStartCur;(貌似没有调用!!,但是后面又用到了imuShiftFromStartCur数据);

        ==》处理完毕之后,重新保存进segmentedCloud;

2、updateInitialGuess:利用imuAngularFromStart-姿态、imuVeloFromStartCur-积分得位移,给予初始猜想值transformCur;

3)帧间匹配完成阶段

Core函数:integrateTransformation

integrateTransformation:得到上一步帧间匹配的输出transformCur,调用一下2个函数,输出前端里程计的最终结果transformSum;

AccumulateRotation:transformXX的0~2是旋转分量,3~5是位移分量。其中transformSum是在

checkSystemInitialization函数里初始化了[0][2]两个角度。该函数主要是计算当前帧终点相对于世界坐标系的欧拉角,即上一帧的位姿结合当前帧的运动量,累加计算出来当前帧的世界坐标系位姿,yxz旋转得到tx、ty、tz的位移输出。

PluginIMURotation:将上个函数计算的欧拉角rx、ry、rz,累加上imu的旋转变化量,完成最终的姿态更新;

这两个函数推导参考:LOAM中关于坐标转换与IMU融合_chengwei0019的博客-CSDN博客_imu去除重力加速度

                                      

第二部分在mapOptmization.cpp里面

4)scan2map部分

Core函数: transformUpdate        

transformUpdate: 在函数scan2MapOptimization里调用,只使用imu的imuRoll和imuPitch。在后端优化完成后,插值得到对应时间的imu数据,采用一阶低通滤波器融合后端优化的输出结果transformTobeMapped与imu的imuRoll角和imuPitch角。

最后,几个变量的含义说一下:


map.cpp里transformAssociateToMap函数下的意义:
 * transformSum: k时刻激光里程计的位姿
 * transformBefMapped: k-1时刻激光里程计的位姿
 * transformAftMapped: k-1经过mapping优化的位姿(scan2map)
 * transformTobeMapped: 利用 激光里程计 估计的AfteredMapped的位姿, 估计值

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要将IMU信息添加到LEGO-LOAM中,需要进行以下步骤: 1. 首先,需要在代码中添加IMU数据的读取和处理功能。可以使用ROS中的IMU消息类型来读取IMU数据,并将其转换为适合LEGO-LOAM使用的格式。 2. 接下来,需要将IMU数据与激光雷达数据进行同步。可以使用时间戳来将两者同步,确保它们在同一时刻被处理。 3. 最后,需要将IMU数据与激光雷达数据进行融合,以提高定位和建图的精度。可以使用卡尔曼滤波或扩展卡尔曼滤波等技术来实现融合。 总之,将IMU信息添加到LEGO-LOAM中需要进行一些代码修改和算法调整,以确保IMU数据能够与激光雷达数据有效地融合。 ### 回答2: LEGO-LOAM是一个基于LEGO Mindstorms EV3硬件平台和三维激光雷达(3D Lidar)的开源SLAM系统。在实际的应用场景中,通常需要加入IMU(惯性测量单元)信息来提高其定位精度和鲁棒性。那么,LEGO-LOAM如何加入IMU信息呢? 在LEGO-LOAM中,IMU信息是通过IMU传感器进行获取的。具体来说,IMU传感器能够测量设备的加速度和角速度信息,通过对这些信息进行积分可以获取设备的位置和姿态信息。因此,将IMU传感器的输出信息与3D Lidar的测量数据进行融合,便可以提高LEGO-LOAM系统的定位精度和鲁棒性。 在LEGO-LOAM中,可以通过以下步骤将IMU信息加入到系统中: 1.将IMU传感器与LEGO Mindstorms EV3设备相连接,通过EV3软件获取IMU传感器的输出数据。可以使用EV3DEV系统配合Python命令行工具对IMU传感器进行操作。 2.利用IMU传感器获取到设备的加速度和角速度信息,并进行积分得到设备的位置和姿态信息。 3.通过将IMU信息与3D Lidar测量数据进行融合,得到更可靠和精准的定位信息。 4.在代码实现中,可以运用卡尔曼滤波等算法进行IMU信息的融合和滤波,进一步提高系统的精度和稳定性。 总之,在LEGO-LOAM系统中加入IMU信息,能够显著提高系统的定位精度和鲁棒性,为实际的应用场景带来更多便利和价值。 ### 回答3: LEGO-LOAM是一种基于激光雷达的无人驾驶系统,它利用点云数据进行建图和定位。但是,对于具有运动状态的无人车辆而言,仅仅使用激光雷达并不能很好地实现建图和定位。因此,LEGO-LOAM需要结合IMU(惯性测量单元)的信息。 惯性测量单元(IMU)是一种能够测量物体姿态和运动状态的仪器。它通常包括加速度计和陀螺仪。加速度计可以测量物体的加速度,从而可以得到物体的姿态信息。而陀螺仪可以测量物体的角速度,从而可以得到物体的旋转信息。 在LEGO-LOAM中,可以通过将IMU的信息加入激光雷达数据中,使得无人车辆能够更准确地进行建图和定位。 具体来讲,首先需要读取IMU的数据,并将其转换为IMU坐标系下的加速度和角速度信息。然后,需要将IMU坐标系和激光雷达坐标系之间的关系进行校准,从而得到准确的坐标系转换矩阵。最后,将转换后的IMU信息与激光雷达数据进行融合,从而得到更加准确的点云数据,进而进行建图和定位。 总的来说,加入IMU信息可以提高LEGO-LOAM的定位精度和建图效果,使得无人车辆能够更加准确和稳定地进行自主导航和控制。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值