一、课程导论与预备知识
什么是视觉里程计?
视觉里程计,说白了就是让机器「用眼睛走路」。
你想想看,我们人类走路时,眼睛看路,大脑算距离,腿脚跟着动。视觉里程计(Visual Odometry,简称VO)干的事一模一样——它通过分析连续的视频帧,估算出相机在三维空间中的运动轨迹。
我在2016年刚接触这个领域时,做过一个地面机器人的项目。当时用的还是传统方法,跑在树莓派上,帧率只有10fps。嗯,那感觉就像让一个近视眼在雾天跑步,磕磕绊绊的。
VO的核心任务其实就两个:
- 估计相机的位姿——也就是每一帧图像对应的位置和朝向
- 构建局部地图——把看到的特征点记下来,方便后续定位
传统VO的流程大致是这样的:
- 提取图像特征点(比如ORB、SIFT)
- 匹配相邻帧的特征点
- 用对极几何或PnP求解相机运动
- 用BA(Bundle Adjustment)优化结果
听起来挺顺的,对吧?但实际跑起来,问题一堆。
传统VO的痛点——我踩过的坑
我曾经在一个室内仓库项目里,用ORB-SLAM2做定位。仓库里全是白墙、金属货架,纹理少得可怜。特征点提取出来,稀稀拉拉几十个,匹配还经常出错。结果呢?轨迹漂移得离谱,10米的路程能偏出1米去。
传统VO的痛点,我总结下来有这么几个:
| 痛点 | 具体表现 | 我遇到的真实案例 |
|---|---|---|
| 纹理缺失 | 白墙、地面、天空等区域提取不到特征点 | 仓库白墙导致跟踪丢失 |
| 光照变化 | 白天黑夜、阴影移动,特征点匹配失败 | 室外AGV从树荫下经过时直接崩了 |
| 动态物体 | 行人、车辆干扰特征匹配 | 商场机器人被路人带偏轨迹 |
| 累积漂移 | 长时间运行后误差越来越大 | 500米路径漂移了3米 |
为什么会这样?因为传统方法太依赖「手工特征」了。手工特征说白了就是人为设计的规则——角点怎么定义、描述子怎么算,都是人定的。但真实世界的图像千变万化,几条规则根本覆盖不了。
深度学习为何能解决传统VO的痛点?
深度学习解决这个问题的思路,其实很直接——让网络自己学特征,而不是人设计特征。
我2018年第一次用CNN做特征提取时,效果让我吃了一惊。在纹理缺失的场景下,深度学习提取的特征居然还能保持稳定。为什么?因为CNN学到的不是角点、边缘这些低级特征,而是更高层的语义信息——比如墙面和地面的交界线、物体的轮廓。
具体来说,深度学习在VO中的优势体现在:
- 端到端学习:直接从图像像素映射到位姿,跳过了手工特征提取和匹配
- 鲁棒的特征表示:对光照、视角变化更不敏感
- 深度信息估计:单目图像也能通过深度网络估计出场景深度
- 可微分优化:整个VO流程可以端到端训练,梯度可以回传
核心观点:传统VO是「规则驱动」,深度学习VO是「数据驱动」。前者靠人写规则,后者靠数据喂出规则。在复杂场景下,数据驱动的上限远高于规则驱动。
我个人的习惯是,把深度学习VO分成三类:
- 替代式:用深度学习替换传统VO中的某个模块(比如用CNN提取特征)
- 端到端式:输入图像序列,直接输出位姿(比如PoseNet系列)
- 混合式:深度学习+传统几何,取长补短(比如DROID-SLAM)
这三种方式各有优劣,我们后面的课程会逐一深入。
课程整体架构与学习路径
这门课一共30章,我把它分成了五个阶段。你想想看,学VO就像盖房子,得从地基打起。
下面这张图是我亲手画的课程知识体系,建议你保存下来,学习过程中随时对照:
学习建议:我个人建议你按顺序学,不要跳。尤其是第6-10章的传统VO部分,虽然我们讲的是深度学习VO,但传统几何是根基。我见过太多人一上来就搞端到端,结果连对极几何都不懂,调参时一脸懵。
课程的具体安排是这样的:
- 第1-5章(基础篇):VO基础概念、相机模型、坐标系、数据集与评估指标
- 第6-10章(传统VO):特征提取与匹配、对极几何、PnP、BA优化、ORB-SLAM2解析
- 第11-15章(深度学习基础):CNN架构、RNN与LSTM、注意力机制、Transformer、自监督学习
- 第16-25章(深度学习VO):PoseNet、DepthNet、光流估计、可微分BA、DROID-SLAM、多传感器融合
- 第26-30章(实战部署):模型量化、TensorRT部署、嵌入式平台优化、实车测试、项目总结
避坑提醒:我曾经在学VO时犯过一个错误——太关注算法本身,忽略了工程实现。比如BA优化,论文里写得天花乱坠,但实际部署时,内存占用、计算延迟才是大头。所以这门课我会特别强调「工程思维」,每个算法都会讨论它的实际部署代价。
好了,第一章的内容就到这里。你准备好了吗?接下来我们就要进入相机模型和坐标系的世界了。这些东西看着枯燥,但它们是VO的「语言」,不懂这些,后面寸步难行。