课程导论与预备知识: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前端。敬请期待。