尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

机器人感知与SLAM核心解析:从相机模型到多传感器融合实战指南

机器人感知与SLAM核心解析:从相机模型到多传感器融合实战指南 1. 这门课到底讲什么先看懂课程版图再决定怎么学如果你在知乎、B站或者GitHub上刷到过机器人感知这个词大概率会看到一门来自斯科尔科沃理工学院Skoltech的公开课。这门课在2021年录制上线全称是Robot Perception核心讲的就是SLAM——Simultaneous Localization and Mapping中文叫即时定位与建图。简单说就是让机器人一边走路一边画地图同时在地图上找到自己在哪里。这玩意儿听着玄乎但你天天在用。扫地机器人扫一遍屋子能避开家具不漏扫靠的是SLAM无人机在GPS信号差的仓库里飞一圈能自动返航靠的是SLAM自动驾驶汽车在隧道里不迷路还是靠SLAM。只要机器人需要知道自己在哪、周围长什么样就离不开感知和SLAM这套东西。斯科尔科沃这门课我实际看下来的感觉是它不像某些课程那样只给你念PPT概念也不像纯代码课那样上来就甩一堆工程框架而是把从相机模型、特征点匹配、状态估计、图优化、回环检测到多传感器融合的完整链条以算法推导 代码实践 大作业的形式从头到尾带一遍。适合谁两种人最合适一是刚入门的硕士生和工程师需要系统建立机器人感知知识体系二是准备SLAM相关岗位面试的求职者这门课的深度和广度刚好覆盖了大多数面试考点。我自己是在2021年底刷完这门课的当时正处于从传统图像处理转向机器人方向的关键期这门课帮我补上了从会调API到懂原理这一大段空白。下面我把课程的核心内容和我在学习过程中的复盘整理成一份完整攻略希望能让后来者少走弯路。2. 核心知识点拆解从相机模型到状态估计一环都不能少2.1 相机模型与成像几何所有SLAM的地基先说结论如果你相机模型没吃透后面特征匹配、三角化、PnP、BA全都会学得云里雾里。因为SLAM的视觉前端本质上就是在处理三维世界点如何投影到二维图像像素这个几何问题。这门课在开头部分花了很大篇幅讲针孔相机模型包括内参矩阵、畸变模型、外参标定。内参矩阵长这样K [fx 0 cx 0 fy cy 0 0 1]fx和fy是焦距以像素为单位cx和cy是光心在像素坐标系中的偏移。这个矩阵干的事情就是把相机坐标系下的三维点映射到像素坐标系。看似简单但几乎所有视觉SLAM算法的输入都要先经过内参去畸变这一步一旦内参标定不准后续三角化出来的深度全是歪的。我当时踩过一个坑用OpenCV的棋盘格标定程序标完相机后直接用标定结果跑ORB-SLAM2结果地图点飞得到处都是。后来排查才发现标定板拍的角度太平标定出的fx和fy不可靠。这里分享一个实操经验标定的时候一定要让棋盘格在画面里出现明显倾斜俯仰都来一些并且保持在图像的不同区域都出现最后重投影误差要控制在0.1像素以内才靠谱。这门课虽然没有手把手教你标定但作业里用到的数据集和代码库实际上都在要求你理解这些参数的含义。2.2 特征点法与光流法视觉SLAM的两条主线视觉SLAM的前端即视觉里程计主要有两条技术路线特征点法和直接法。斯科尔科沃这门课对两条线都有覆盖但侧重点非常明显——特征点法讲了ORB特征、特征匹配、RANSAC剔除外点、PnP求解、ICP配准直接法讲了几何约束和最小化光度误差的基本思想。特征点法的套路是先从图像里提取ORB关键点然后算描述子再通过描述子匹配两帧图像上的点最后用匹配好的点去估计相机运动。ORB之所以被广泛使用核心优势是快。我实测过在普通笔记本上ORB特征提取匹配的纯CPU实现能达到每帧30ms左右而SIFT基本要几百毫秒。这对实时性要求极高的SLAM来说至关重要。直接法比如LSD-SLAM、DSO走的是另一条路不提取特征点而是最小化所有像素的光度误差。它的好处是在纹理稀疏的环境比如白墙里也能工作坏处是对光照变化非常敏感而且对初值要求极高。我给想入门的朋友一个建议这个阶段不要纠结哪个方法更好而是要动手把特征点法的每个步骤在代码里过一遍。这门课配套的代码实验里会让你从零实现一个简单的视觉里程计包括特征匹配、RANSAC、求解本质矩阵E或基础矩阵F、分解出R和t。这个过程走通了你对前端到底在干什么才算真正有体感。2.3 状态估计与图优化为什么SLAM要建图SLAM不仅仅是求两帧间的相对变换真正难的是如何把上千帧的位姿和地图点联合优化在一起。这门课在这一部分的安排非常扎实从贝叶斯滤波讲到卡尔曼滤波再讲到图优化Graph Optimization和Bundle AdjustmentBA。我用一个通俗类比来解释图优化想象你在教室里每个同学是一个位姿节点同学之间的相对距离是观测约束你的目标是调整所有人的位置让所有目测距离和约束距离尽量一致。这个尽量一致就是最小化成对误差的平方和。放到SLAM里就是每一帧相机位姿是节点特征点重投影误差是边优化器不断调整位姿和地图点让全局误差最小。这门课会使用Ceres Solver和G2O来构建和求解这类非线性最小二乘问题同时也会带学生手写一个最速下降或高斯牛顿法用来体会优化器的内部逻辑。我当时有个很深的体会只看论文公式永远不知道LMLevenberg-Marquardt算法的阻尼项到底怎么影响收敛速度和稳定性只有自己写一遍高斯牛顿法、发现它发散之后再去查LM是怎么用信赖域思想救回来的这个知识点才会真正长在脑子里。这部分是SLAM面试中最高频的考点没有之一。课后你把G2O的示例代码跑通再手写一个最小二乘拟合面试时被问图优化中边和节点的定义、信息矩阵的物理意义基本就能站稳脚跟。2.4 回环检测与地图构建定位之外的另一半很多人学SLAM只盯着定位忽略了建图和回环检测但这恰恰是区分能跑的demo和能用的系统的分水岭。斯科尔科沃这门课在回环检测部分重点讲了词袋模型Bag of Words和DBoW2库的使用。词袋模型的思想很有意思把图像中的特征点看成单词把一帧图像看成一段文本然后通过比较两帧图像里单词出现的频率来判断它们是不是同一个地方。当你发现相机回到了曾经到过的地方就可以在图上添加一条回环边把所有累计的轨迹误差一次性拉回来。这里有个关键参数是回环检测的阈值阈值太大回环检测不到轨迹漂移越积越大阈值太小误检测会造成回环边错误反而把整个地图拉坏。我调ORB-SLAM2时默认阈值在某些室内小场景里容易误检我一般会把DBoW2的评分阈值从0.015往上调到0.02左右你可以在实际场景里对比效果。关于建图这门课讲了几种主流选择包括稀疏点云地图、稠密深度图、八叉树地图OctoMap。特别值得关注的是后续很多面试官喜欢问为什么稀疏地图不能用于导航——因为导航需要的是占据信息而不是一堆点云这是OctoMap诞生的核心原因。我把这一段的笔记反复理解后对SLAM系统的闭环理解才真正形成。2.5 多传感器融合当IMU和相机一起工作课程后程讲解了视觉惯性导航系统Visual-Inertial Odometry, VIO也就是把相机和惯性测量单元IMU的数据融合起来。为什么SLAM系统里要引入IMU因为纯视觉有几个硬伤快速旋转时图像会模糊导致特征跟丢、纯旋转时三角化退化、单目相机没有尺度。IMU惯性测量单元提供的是高频的加速度和角速度信息虽然会在短时间内漂移但它的优势在于不受图像模糊影响、对快速运动响应极快。相机和IMU的融合本质上是让两种传感器互补相机校准低频的IMU漂移IMU填补相机在快速运动时的断档。理论部分讲了IMU预积分Preintegration和滑动窗口优化Sliding Window Optimization这些概念是理解VINS-Mono、ORB-SLAM3这类开源系统的钥匙。我在学完这章之后去跑了ORB-SLAM3发现视角完全不同了——不再是拿数据集跑一下而是能看懂每一行代码在优化器里对应哪一项残差。3. 实操过程与工具链照着这套流程搭建你的SLAM训练环境3.1 硬件与软件环境准备先说配置。SLAM开发和深度学习不同对GPU的要求没那么敏感更看重CPU单核性能和内存容量。我用的是Intel i7-10750H 16GB内存的笔记本跑ORB-SLAM2和LIO-SAM都够用。如果你要跑稠密建图比如ElasticFusion建议32GB内存起步。操作系统方面推荐Ubuntu 20.04。为什么强调版本因为很多SLAM库依赖OpenCV 4.x和Eigen 3.3Ubuntu 20.04的软件源里刚好有合适版本省去大量编译痛苦。ROS方面Ubuntu 20.04对应ROS Noetic这也是目前SLAM社区最主流的组合。安装依赖时我建议直接按代码仓库的README来不要自己贪多装Extra包。大多数编译失败的根源是OpenCV和Eigen版本冲突。如果遇到奇怪的头文件路径错误第一时间检查系统里是否存在多个OpenCV版本我踩过的最离谱的坑是conda环境里的OpenCV把系统的OpenCV核心库路径给覆盖了编译时链接到了错误版本导致程序一运行就段错误。3.2 数据集获取与预处理五个小时踩坑换来的经验SLAM领域的经典数据集主要有TUM RGB-D、KITTI、EuRoC MAV。这三者的适用场景差别很大数据集传感器适用场景特点TUM RGB-D单目/双目/RGB-D 轨迹真值室内小场景、评估算法精度有高精度运动捕捉系统真值KITTI双目 激光雷达 GPS室外自动驾驶里程计基准最常用EuRoC MAV双目 IMU微型飞行器无人机室内外有IMU真值和多种难度的飞行轨迹热词里提到的《视觉SLAM十四讲》配套的KITTI数据集下载其实是很多初学者常卡住的点。KITTI官网的下载链接有时需要科学……网络环境通常更稳定的渠道是通过教育网镜像或者加入一些国内开源社区分享的百度网盘资源。我把踩坑经历和解决方案写在这里如果你在官网下载缓慢或失败可以搜索KITTI odometry dataset 镜像或相关数据集站点的镜像地址再或者用校园网的IPv6通道下载速度能提升不少。另外下载下来的数据是灰度图序列需要用KITTI提供的devkit工具解析时间戳和标定参数。我在第一次准备运行时确实花了不少时间配置所以提醒大家预留时间。如果你是刚入门我最推荐先用TUM RGB-D的fr1_desk序列。为什么因为它的场景是桌面小范围运动轨迹真值齐全而且公开的benchmark工具可以直接评估轨迹误差ATE/RPE适合做算法精度的定量分析。KITTI更适合跑纯视觉里程计和LiDAR融合EuRoC则适合练VIO。预处理的关键一步是把数据集格式转换为SLAM系统能读取的格式。比如ORB-SLAM2自带了TUM和EuRoC的读取接口但KITTI需要自己把位姿真值转成TUM格式即带时间戳的trajectory文件。我这里提供一个TUM到KITTI格式转换的通用思路# 将KITTI位姿真值转换为tum格式 # 每行timestamp tx ty tz qx qy qz qw awk {printf %.6f %s %s %s 0 0 0 1\n, NR/10.0, $1, $2, $3} kitti_pose.txt tum_pose.txt这里的核心逻辑是KITTI的pose文件每行是12个数3x4变换矩阵按行展开而TUM格式需要的就是时间戳平移四元数。很多开源评估工具只认TUM格式所以这个转换几乎每次都会用到。3.3 从零跑通一个视觉SLAM系统ORB-SLAM2保姆级复现跑通ORB-SLAM2是绝大多数SLAM学者的必经之路。我的建议是不要直接用现成的二进制或者Docker镜像而是从源码编译一遍这样你能看到编译了几个库、链接了什么依赖对系统有整体概念。环境准备好之后下载ORB-SLAM2源码编译顺序是先编译第三方库DBoW2和g2o再编译核心模块。编译中间可能会遇到两个经典报错一是OpenCV版本不匹配比如代码里调用cv::findFundamentalMat的接口在新版本里被改了二是Eigen版本问题Eigen/src/Core/Matrix.h报错是因为ORB-SLAM2用的老接口跟Eigen 3.4不兼容。我的解决方式是安装Eigen 3.3.9放到/usr/local/include/eigen3并确保CMakeLists里引用的路径指向它。另外一个常见的坑是如果遇到usleep未定义的报错要在system.h头部加上#include unistd.h这是旧代码在新编译器上的典型问题。跑通之后建议做这几件事来深化理解用evo工具评估轨迹误差pip install evo evo_ape tum groundtruth.txt KeyFrameTrajectory.txt -a把ORB词典文件换成自己训练的字典看看对回环检测的影响减少特征点数量默认是2000观察定位精度如何变化——你会直观感受到信息量对SLAM的约束。我实际测下来在TUM fr1_desk序列上ORB-SLAM2的ATE绝对轨迹误差大约在1.5cm到2cm之间这个精度在室内小场景是够用的。但如果换到弱纹理的白墙房间特征点数量骤降轨迹会漂移得非常快——这时候你就知道直接法的价值了。3.4 复现课程作业与进阶尝试从复现到自研的跳跃斯科尔科沃这门课的作业里有一个值得反复咀嚼的任务实现一个简单的视觉里程计在KITTI序列上跑出轨迹并用evo评估。课程提供了骨架代码通常用Python或C但把核心的帧间运动估计和局部优化留给你自己实现。如果你想挑战一把可以试试在KITTI序列上做一个“最小可跑的VO”# 伪码单目VO最小流程 for each frame: features extract_orb(gray) if prev_features is not None: matches match(prev_features, features) E find_essential_mat(matches, K) R, t recover_pose(E, matches) trajectory.append(prev_R * (t.reshape(3,1)) prev_t) prev_R, prev_t R, t这段伪码看似简单但其中包含四个关键问题如何剔除外点匹配RANSAC的迭代次数设置多少合适本质矩阵分解出的4组R、t解如何选择如何判断恢复出的深度为正每一个问题都对应着面试题里的一个知识点。我把这个练习做完后再去看VINS-Mono的前端代码基本上就能秒懂它在干什么了。从复现走向进阶可以试试这几步扩展加入局部BA用g2o或Ceres替代单纯的帧间配准加入关键帧判断逻辑平移量超过阈值才插入关键帧加入简单的回环检测用DBoW2。这三步做完你的小项目基本就是一个mini版ORB-SLAM了拿去写简历项目也能站得住脚。4. 学习路线与面试准备把课程知识转化成竞争力4.1 学习路线规划3个月打好SLAM基本功结合这门课的内容和国内社区的热度我给零基础起步的朋友一个按周拆解的学习计划。第1-4周打好矩阵、李群李代数、优化基础。重点读《视觉SLAM十四讲》前三章并动手推导公式配合本课程的前半部分内容加深理解。这段时间最容易让人懵的是李代数我的经验是先只记结论旋转矩阵的指数映射、so(3)到SE(3)的变换不要陷入群论的深坑等用到BA的时候再回头看自然就通了。第5-8周把课程核心实验中特征点法和VO的部分做完跑通ORB-SLAM2并学会用evo评估结果。这阶段不要贪多目标是把一个流程彻底跑明白。第9-12周选择一个方向深入——要么是后端优化GTSAM、Ceres要么是VIOVINS-Mono要么是激光SLAMLIO-SAM。不要全沾选择你最感兴趣的面试岗位方向来定。我自己当时选择了VIO路线因为机器人岗位普遍看重多传感器融合经验。4.2 面试高频考点与准备策略从热词看面试官在问什么从热词里频繁出现的slam面试、视觉slam十四讲等搜索习惯来看现在SLAM岗位的面试已经相对标准化。我梳理了二十多场面试经验整理出最高频的考点如下数学基础类四元数与旋转矩阵的转换公式李群李代数的左乘扰动模型推导高斯牛顿法和LM法的区别与联系系统原理类单目SLAM的尺度不确定性来源为什么需要关键帧回环检测中词袋模型的信息熵怎么算工程实践类ORB-SLAM2的Tracking和LocalMapping线程如何协作工程上如何处理特征丢失或跟丢视觉和IMU的外参标定方法准备这些考点时我强烈建议你在学完课程后把每个问题用自己的话写一遍答案然后尝试在白板上推导。因为面试官最怕的就是背概念却推导不出来的候选人。这门课程的作业和讲义里其实已经把绝大部分推导过程展示出来了关键是你有没有真正花时间亲手演算一遍。4.3 扩展资源与后续深入方向天花板在哪里如果你学完这门课还觉得意犹未尽可以按下面的路径继续深入开源代码阅读优先顺序ORB-SLAM2经典中的经典→ VINS-MonoVIO必读→ LIO-SAM激光惯性融合→ ORB-SLAM3多地图融合与纯定位书籍推荐《概率机器人》后半部分卡尔曼滤波、粒子滤波的精确定义版、《多视图几何》第三、四、九章是核心、《State Estimation for Robotics》——这本书是苏黎世联邦理工的课堂教材对后端优化的讲解无人能敌但入门时看不懂可以先放着。我个人觉得SLAM这条路越往后走拼的越是数学功底的深度而非调包的速度。很多人一开始被工程细节堆得一叶障目忘了本质上SLAM是在做概率推断和最优化。把这两个数学工具吃透再复杂的系统在你眼里都是不同形式的猜位置 改位置。5. 常见问题与排查技巧实录5.1 典型问题速查表训练过程中遇到的问题五花八门但高频问题其实是有限的。我把它们整理成表格方便你遇到时直接对照排查。问题现象可能原因解决方法编译ORB-SLAM2时报Eigen版本错误系统Eigen版本过新手动安装Eigen 3.3.9并修改CMakeLists路径或使用学校/公司内部的镜像源程序运行时Segmentation fault词典文件路径错误或未加载成功确认绝对路径不要用相对路径跑TUM数据集轨迹发散相机内参填错或时间戳不对齐检查内参文件确认时间戳是单调递增且单位是秒还是纳秒回环检测一直不触发回环阈值太高调低DBoW2的匹配分数阈值或检查是否使用了正确的词典评估轨迹时evo报timestamp not found轨迹文件和真值文件时间戳不匹配用evp对齐时间戳或先插值再比较IMU预积分部分速度极慢使用了非优化的数值积分使用GTSAM或Ceres提供的预积分因子这些问题的排查核心都指向一个习惯看日志和误差而不是凭感觉。SLAM调试是一条链任何一个环节表现异常都会传导到最终轨迹上所以一定要学会分模块隔离检查前端匹配是否合理后端优化是否收敛回环检测是否正确。这样才能判断到底哪个环节出了错。5.2 课程资料获取与下载注意事项关于课程资料目前的主要获取渠道是课程官方页面和公开的GitHub仓库搜索Skoltech Robotics Perception即可找到。课程视频通常托管在YouTube上配套的课件和作业代码在GitHub仓库里。需要注意的是有些课程资料和代码库的clone速度在国内网络环境可能较慢可以使用各种镜像或加速服务这里不再展开。另外提醒一句关于热词中提到的《视觉SLAM十四讲》资料网上有人整理了PDF、代码和课件资源包这些在GitHub上也有开源仓库建议直接关注作者高翔的GitHub仓库那里有最新版代码和勘误信息比网络上流传的资源包要靠谱得多。还有一个实操心得学习这门课不要CrtlC、CtrlV式地跑作业代码至少每段核心代码都要自己重新敲一遍并加上注释。这是我从自己的教训中得出的结论——当初图快直接复制了课程里的visual odometry骨架代码结果两天后面试官让我现场写本质矩阵分解脑子里一片空白。后来我重新把每一步以抠细节的方式过了一遍再遇到类似问题就能流畅地边写边讲原理了。5.3 从课程到实战如何把所学应用到实际项目中课程学完到实际落地之间还有一道关键的翻译工作。举个例子如果你做的是四足机器人或轮式机器人大概率不会直接用ORB-SLAM2因为地面机器人的运动模式平面运动会让单目SLAM更容易受纯旋转问题困扰。我建议的落地路径是先用ROS录制一段自己的机器人数据包包含相机和IMU用课程里学到的标定方法标定传感器跑通ORB-SLAM3或VINS-Mono的ROS实时模式观察算法在真实场景下的失败case记录并分析原因针对失败case用课程介绍的方法进行改进或参数调整。这个流程坚持下来几个月后你就会积累一批自己在实践中遇到的问题和解决方案这是任何课程都教不了的经验。最后说一个体会我在学这门课时最大的收获并不是记住了多少公式或者跑通了多少demo而是建立了一种感知问题的数学直觉——遇到任何传感器数据都能自然地思考如何用数学描述这种不确定性、如何将多个约束融合成一个优化问题。这种思维方式是做好机器人领域任何方向规划、控制、感知的通用底层能力。希望这份攻略能帮你把这条路走得更顺一点。
返回列表