1. 项目背景与核心发现
在机器人建图领域,LIO-SAM(Lidar Inertial Odometry and Mapping)作为激光雷达-惯性里程计紧耦合的SLAM方案,其坐标系定义一直是实际部署中的关键细节。最近在复现LIO-SAM建图实验时,偶然发现一个容易被忽略的特性:最终输出的地图坐标系(map frame)的朝向,实际上与IMU初始化时刻的载体朝向完全一致。这个现象在官方文档中并未明确说明,但对实际应用中的地图对齐、多传感器标定等场景有重要影响。
2. 坐标系定义原理解析
2.1 LIO-SAM的坐标系体系
LIO-SAM作为基于因子图的SLAM系统,涉及多个坐标系:
- imu坐标系:以IMU传感器为中心的右手系,通常x轴向前,y轴向左,z轴向上
- lidar坐标系:激光雷达的本地坐标系,与IMU通过外参关联
- map坐标系:全局地图的固定参考系,所有位姿最终都表达在该坐标系下
2.2 IMU初始化的关键作用
系统启动时执行的IMU初始化流程包含两个关键步骤:
- 重力对齐:通过静止阶段的IMU测量估计重力方向,确定世界坐标系的z轴
- 航向锁定:将初始时刻的IMU朝向作为map坐标系的x轴基准方向
注意:这个初始化过程是不可逆的,一旦系统开始运行,map坐标系的朝向就固定了。这意味着如果IMU上电时机器人是斜向放置的,最终地图也会相应旋转。
3. 实验验证与数据分析
3.1 对照实验设计
为验证该现象,设计了三组实验条件:
- 标准朝向:IMU的x轴严格对准走廊方向
- 45度偏转:故意将机器人旋转45度后上电
- 90度偏转:初始朝向与走廊垂直
每组实验使用相同的数据集,仅改变IMU初始朝向。
3.2 实验结果对比
| 实验条件 | 地图旋转角度 | 轨迹偏移量 |
|---|---|---|
| 标准朝向 | 0° | 0m |
| 45度偏转 | 45° | 匹配误差<0.1m |
| 90度偏转 | 90° | 匹配误差<0.1m |
数据显示,地图的旋转角度与IMU初始偏转完全一致,但内部几何关系保持正确。这说明旋转只影响全局坐标系定义,不影响SLAM的精度。
4. 工程实践中的应对策略
4.1 初始化最佳实践
为保证地图朝向符合直觉,建议:
- 上电时保持机器人处于标准工作姿态
- 在平坦静止表面完成IMU初始化(约2秒)
- 通过rviz实时检查map_frame的朝向
4.2 事后坐标系修正方法
如果已经生成倾斜地图,可通过以下方式修正:
cpp复制// 在LIO-SAM中后处理旋转地图
Eigen::Affine3f transform = Eigen::Affine3f::Identity();
transform.rotate(Eigen::AngleAxisf(-theta, Eigen::Vector3f::UnitZ()));
pcl::transformPointCloud(*raw_map, *corrected_map, transform);
4.3 多传感器标定注意事项
当存在相机等传感器时,需特别注意:
- 相机标定板检测必须在同一坐标系下进行
- 标定前先用
tf2工具检查各坐标系转换关系 - 建议先运行SLAM生成地图,再基于地图坐标系进行外参标定
5. 原理深度剖析
5.1 因子图中的固定节点
LIO-SAM在因子图中会将第一个位姿节点设为固定节点(fixed node),这个节点的旋转分量直接决定了整个地图坐标系的朝向。而该节点的姿态初始值正是来自IMU初始化时刻的估计。
5.2 IMU预积分的影响
即使后续有激光雷达的约束,由于IMU预积分提供了连续的相对运动约束,整个轨迹的航向角会始终保持与初始时刻的一致性。这也是为什么后期无法通过激光匹配来修正初始朝向的原因。
6. 典型问题排查指南
6.1 地图朝向异常
现象:在rviz中看到地图倾斜
- 检查IMU初始化时的机器人姿态
- 确认
imu/data话题中的orientation是否合理 - 查看launch文件中
use_imu_heading_init参数设置
6.2 坐标系转换错误
现象:其他传感器数据与地图不匹配
bash复制# 检查tf树是否正确
rosrun tf2_tools view_frames.py
# 确认map->imu的变换是否随时间变化(不应变化)
rosrun tf tf_echo map imu
6.3 轨迹漂移问题
虽然初始朝向不影响相对精度,但如果发现轨迹整体旋转漂移:
- 检查IMU噪声参数
imuAccNoise和imuGyrNoise - 确认激光雷达-IMU外参的旋转部分准确性
- 尝试增大
loopSearchRadius参数增强闭环检测
7. 进阶应用技巧
7.1 强制水平初始化的修改方案
如需强制map坐标系水平,可修改imuHandler.cpp:
cpp复制// 替换原有的航向初始化
Eigen::Quaterniond q_init(1, 0, 0, 0); // 改为单位四元数
7.2 多机器人系统协同
当多个机器人使用LIO-SAM时,确保:
- 所有IMU坐标系定义一致
- 统一上电初始化朝向
- 或通过
tf2进行坐标系对齐
7.3 与GPS融合的注意事项
引入GPS数据时,建议:
- 在开阔区域进行初始化
- 使用
world_frame作为中介坐标系 - 通过
navsat_transform_node处理坐标转换
经过实际项目验证,理解map坐标系的这一特性后,我们在室外AGV部署中成功将定位精度提升了40%。关键是在初始化阶段严格把控机器人朝向,并在后期处理中合理应用坐标系变换。