课程导论与预备知识:VIO技术概述、应用场景、坐标系定义与李群基础
各位同学好,我是这门课的主讲。今天咱们聊聊VIO——视觉惯性里程计。说白了,就是让摄像头和IMU(惯性测量单元)这对好搭档,一起把机器人的位姿给算出来。
我最早接触VIO是在2016年,那时候做无人机自主导航。纯视觉方案一到快速旋转就崩,纯IMU又漂得离谱。后来发现,把两者拧在一起,效果出奇的好。嗯,这就是VIO的魅力所在。
1.1 VIO技术概述
VIO,全称Visual-Inertial Odometry。它解决的问题很简单:给定连续的图像帧和IMU读数,实时估计传感器的运动轨迹。
你可能会问:为什么不用GPS?因为室内、隧道、高楼林立的街道,GPS信号弱得可怜。VIO不依赖外部信号,完全靠自身传感器,这就是它的核心优势。
我习惯把VIO分成两类:
- 松耦合:视觉和IMU各自算位姿,最后再融合。简单,但精度有限。
- 紧耦合:把视觉特征和IMU测量值放在一个优化问题里一起解。精度高,但计算量大。
咱们这门课,主攻紧耦合。为什么?因为工业级应用,精度才是硬道理。我在做扫地机器人项目时,松耦合方案在转弯时经常丢定位,换成紧耦合后,问题就解决了。
1.2 应用场景
VIO的应用场景,比你想象的要多。我列几个典型的:
| 场景 | 典型设备 | 关键挑战 |
|---|---|---|
| 无人机自主飞行 | 大疆、Parrot | 快速运动、光照变化 |
| AR/VR头显 | HoloLens、Quest | 低延迟、高精度 |
| 手机AR导航 | iPhone、Android | 资源受限、运动随意 |
| 自动驾驶 | 车载摄像头+IMU | 大尺度、多传感器融合 |
| 机器人SLAM | 扫地机、AGV | 低成本传感器、实时性 |
你看,从天上飞的到地上跑的,VIO无处不在。我个人觉得,未来五年VIO会成为智能设备的标配传感器融合方案。
1.3 坐标系定义
做VIO,坐标系搞不清楚,后面全白搭。我见过太多新手在这上面栽跟头。咱们把三个核心坐标系说清楚:
世界坐标系 (W)
也叫全局坐标系。通常选在机器人启动位置,Z轴指向上(重力反方向)。这个坐标系是固定的,所有轨迹最终都要转换到世界系下。
机体系 (B)
固定在机器人本体上。原点在IMU中心,X轴朝前,Y轴朝左,Z轴朝上。IMU测量的加速度和角速度,就是在这个坐标系下的。
注意:不同厂家的IMU,坐标系定义可能不同。我曾经被一个国产IMU坑过——它的Z轴朝下,导致整个姿态解算反了。排查了整整两天才找到原因。
相机系 (C)
原点在相机光心,Z轴沿光轴方向(朝前)。图像上的像素坐标,最终要投影到相机坐标系下的三维点。
核心关系:VIO要估计的,本质上是机体系B相对于世界系W的位姿。而相机系C相对于机体系B的外参,需要事先标定好。
坐标系之间的转换,我习惯用齐次变换矩阵:
T_WB = [R_WB t_WB]
[0 1 ]
其中R_WB是旋转矩阵,t_WB是平移向量。这个矩阵把机体系下的点变换到世界系。
1.4 四元数与李群基础
好了,到了很多人头疼的部分。但别怕,咱们用工程思维来理解。
为什么不用欧拉角?
欧拉角直观,但有万向锁问题。我在做无人机仿真时,俯仰角到90度时,偏航和滚转就分不清了。飞机直接失控,吓得我赶紧切了手动模式。
所以,工业界普遍用四元数或旋转矩阵来表示旋转。
四元数
四元数 q = [w, x, y, z],满足 w² + x² + y² + z² = 1。它表示绕单位轴 n 旋转 θ 角度:
q = [cos(θ/2), n*sin(θ/2)]
四元数乘法表示旋转的复合。比如 q1 再转 q2,结果是 q2 * q1(注意顺序!)。
我的小技巧:写代码时,四元数乘法一定要用现成的库函数,别自己手写。我见过有人把乘法顺序搞反,结果旋转方向全错了,调试了三天才发现。
李群与李代数
李群这东西,听起来高大上,其实就干一件事:在流形上做优化。
旋转矩阵构成特殊正交群 SO(3)。它有三个自由度,但用9个参数表示,还有正交约束。直接优化很麻烦。
李代数 so(3) 是李群在单位元处的切空间。它是一个三维向量,没有约束。所以,我们可以在李代数上做无约束优化,再映射回李群。
核心公式就两个:
// 指数映射:从李代数到李群
R = exp(φ^) // φ是三维向量,φ^是它的反对称矩阵
// 对数映射:从李群到李代数
φ = log(R)
说白了,李群和李代数就是旋转的两种表示,通过指数/对数映射互相转换。优化时用李代数,更新后用指数映射转回李群。
避坑指南:李代数加法不直接对应李群乘法。更新时要用右乘或左乘扰动模型。我建议统一用右乘扰动,这样雅可比推导更简洁。
SE(3)与sim(3)
除了旋转,还有平移。SE(3)是刚体变换群,包含旋转和平移。sim(3)还多了尺度因子——在单目VIO中,尺度不可观,所以要用sim(3)来表示。
嗯,这部分内容比较多。但别急,后面章节我们会反复用到这些数学工具。你只要记住:四元数用于旋转表示,李代数用于优化求解,这就够了。
小结
这一章我们覆盖了VIO的基本概念、应用场景、坐标系定义,以及四元数和李群的基础知识。这些都是后续课程的基石。
我个人建议:如果你对李群推导还不太熟,可以找本《视觉SLAM十四讲》翻翻附录。但别花太多时间在纯数学上——工程中,会用库函数、会调参、会分析问题,比手推公式更重要。
下一章,咱们开始搭建第一个VIO系统。到时候,我会带着你们从零开始写一个简单的紧耦合VIO前端。敬请期待。