一、课程导论与SLAM基础
什么是激光雷达-惯导组合里程计?
先说说这个拗口的名字。激光雷达-惯导组合里程计,英文叫 LiDAR-Inertial Odometry,简称 LIO。
说白了,就是让激光雷达和惯性测量单元(IMU)这两兄弟一起干活,估算出机器人在三维空间里的运动轨迹。激光雷达负责看世界,IMU 负责感受自身的加速度和角速度。
我刚开始接触这个领域时,有个很深的感触:单靠激光雷达做里程计,就像一个人闭着一只眼走路。环境稍微差点,比如长走廊、空旷场地,立马就飘了。而 IMU 呢?它短时间很准,但时间一长,积分出来的位置误差会像滚雪球一样越来越大。
所以,把两者结合起来,就成了很自然的选择。
核心思想:激光雷达提供精确的几何结构信息,IMU 提供高频的短时运动估计。两者互补,缺一不可。
为什么需要融合?
你可能会问:激光雷达本身不是能测距离吗?为什么还要加个 IMU?
嗯,这里有几个关键原因。
- 运动畸变问题:激光雷达扫描一圈需要时间(比如 100ms)。如果机器人在这期间快速旋转或移动,点云就会扭曲。IMU 可以提供高频运动信息,帮我们把点云“矫正”回来。我在做 AGV 项目时,遇到过小车急转弯导致点云严重变形的情况,加了 IMU 后效果立竿见影。
- 退化场景:在长走廊、隧道、开阔广场这些地方,激光雷达的匹配算法容易失效。IMU 可以在这段时间内提供相对可靠的位姿估计,撑到环境恢复特征。
- 高频输出:激光雷达通常 10Hz,IMU 可以到 200Hz 甚至更高。融合后,我们能以 IMU 的频率输出里程计结果,这对控制模块来说非常友好。
- 初始化:纯激光里程计需要初始位姿。IMU 可以帮我们快速估计出重力方向,甚至完成系统的初始化。
个人经验:我曾经在一个室内停车场项目里,纯激光里程计跑了不到 50 米就丢了。原因很简单——四周全是白墙,没有任何纹理特征。后来加上 IMU,虽然精度不算顶尖,但至少没丢。这个案例让我彻底信服了融合的必要性。
课程目标与学习路径
这门课的目标很明确:让你从零开始,亲手实现一个能用的激光雷达-惯导组合里程计系统。
不是那种只讲理论的课。我会带着你一步步搭建代码,从数据预处理、状态估计、优化求解,到最终的轨迹评估。每个环节我都会给出实际项目中踩过的坑和对应的解决方案。
学习路径大致是这样的:
- 基础篇(第1-5章):坐标系、刚体运动、IMU 模型、激光雷达模型。这些是地基,必须打牢。
- 核心算法篇(第6-15章):状态估计理论、卡尔曼滤波、因子图优化、点云配准。这是整个系统的骨架。
- 系统实现篇(第16-25章):前端里程计、后端优化、回环检测、地图构建。你会亲手写出完整的 LIO 系统。
- 进阶与实战篇(第26-30章):多传感器标定、性能调优、嵌入式部署、实际场景测试。
我个人建议的学习节奏是:每周花 8-10 小时,配合代码练习。光看不动手,效果会大打折扣。
注意事项:这门课需要一定的 C++ 和 ROS 基础。如果你还不熟悉,建议先花一周时间补一下。我在课程中会提供完整的代码框架,但不会手把手教语法。
知识体系总览
下面这张图,是我梳理的 LIO 系统核心知识结构。你可以把它当作整个课程的地图。
这张图展示了 LIO 系统的四个核心层次。从传感器数据采集,到前端处理,再到状态估计,最后输出结果。每一层都有对应的算法和实现细节,我们会在后续章节逐一攻克。
学习建议:我建议你把这张图打印出来贴在工位上。每学完一章,就在对应的模块上打个勾。这样能清楚知道自己走到了哪一步,也方便回头复习。
你需要准备什么?
工欲善其事,必先利其器。这里列出我推荐的开发环境:
| 工具 | 推荐版本 | 备注 |
|---|---|---|
| 操作系统 | Ubuntu 20.04 / 22.04 | ROS 生态最友好 |
| ROS | Noetic / Humble | 用于数据通信和可视化 |
| C++ 编译器 | GCC 9+ / Clang 12+ | 支持 C++17 |
| Eigen3 | 3.4+ | 线性代数库,必装 |
| Ceres Solver | 2.1+ | 非线性优化库 |
| PCL | 1.12+ | 点云处理库 |
避坑提醒:我曾经在 Ubuntu 18.04 上折腾了整整两天,就因为 Ceres 版本不兼容。建议直接上 20.04 或 22.04,能省去很多环境配置的麻烦。
好了,第一章的内容就到这里。记住,LIO 的核心就是让激光雷达和 IMU 互相补台。后面的章节,我们会一步步把这个系统搭建起来。