把这份文档想象成带你参观一个工厂。
我先带你站在门口,看清楚这个厂子到底在造什么东西(第一章);然后一条生产线一条生产线地走, 每到一个工位就停下来,让你亲眼看机器怎么转(动画),再告诉你这个工位为什么这么设计;最后告诉你哪几个工位还没修好(最后一章)。
术语不用背。术语只是厂里的人给机器起的外号——你先把机器长什么样看明白了,外号自然就记住了。
把一个机器人放进一栋它从没见过的楼里。它必须同时搞清楚两件事: ① 我在哪(这叫"定位"),② 周围长什么样(这叫"建图")。 难点在于这两件事互相依赖——不知道自己在哪,地图就画不准;地图不准,又定位不了。 SLAM 就是一套让两者互相纠正的办法。
下面这张图是一个房间的俯视图(从上往下看)。房间里有沙发、书架、圆桌、长桌和绿植。 蓝色的小点是机器人,它正沿着墙边慢慢走。
① 蓝点是机器人,它正沿着墙边慢慢走一圈。绿色扇形是它的"视线"——它不停地在转圈扫描, 每转向一个方向就量一次距离,就像蝙蝠发出声波听回声一样。
② 绿点 = 它记下来的地图。它走到哪儿,就在墙上留下几个点,表示"这里有一堵墙"。 注意这些点不是一次记全的,而是走到哪儿记到哪儿——地图是慢慢长出来的。
③ 红色虚线 = 它以为自己在走的路线。机器人主要靠"轮子转了多少圈"推算走了多远, 但轮子会打滑、地面有起伏,所以走着走着,"它以为"就偏离了"实际"。这就是漂移。
④ 黄色闪光 = 回环检测。绕完一圈回到出发点附近时,它通过扫描发现"这里的墙和我出发时看到的一模一样", 于是知道自己回来了。这一瞬间,它就能算出自己一路上累积了多少误差,然后把整张地图连同轨迹一起校正。
要记住的一句话:没有回环,机器人只能越走越偏;有了回环,它才能走很久都不迷路。
你可能会想:先定位、再建图,不是更简单吗?答案是做不到——因为这两件事互为前提,形成了一个死循环。
"我在哪"这个问题,真正的意思其实是"我看到的东西,和地图上的哪一块对得上"。所以没有地图就说不清自己在哪。 就像拿着一张没标任何地名的地图,你是无法说出"我在哪个城市"的。
"这里有一堵墙"这个记录,必须配上"我是在哪个位置看到它的"才有意义。 不知道自己位置的话,你只能记下"我面前有堵墙",没法把它拼到地图上的具体位置。
实际做法是:先随便给个初始位置(比如"我在原点"),用这个假设去建图;建出来的图又反过来告诉你 "你的位置好像不太对",于是修正位置;修正后的位置又让地图更准……反复迭代,两者一起收敛。
这就是"SLAM"这个名字的字面意思:Simultaneous Localization And Mapping(同时定位与建图)。
因为不断迭代也解决不了"误差累积"这个根本问题——每一步都有小误差,而下一步是在上一步的错误结果上继续算的。
只有当你回到一个之前来过的地方时,才能一次性算出"我这一路总共偏了多少",然后全部修正掉。 举个直观的数字:每步只错 0.1%,走 1000 步就偏了整整一米;但只要有一个回环,这一米能被一次性抹掉。
室外可以,但 GPS 有三个短板:① 精度不够——民用大概几米,不足以让机器人避开墙角; ② 更新太慢——每秒一次左右,机器人走快了根本来不及;③ 室内完全没有信号——卫星信号穿不透楼板。
所以 GPS 通常只当"低频的辅助锚点"用,防止长时间漂移,而不是主要定位手段。
不是。这是很常见的误解。SLAM 造的是"机器人自己能用的地图",不是给人看的效果图。 激光 SLAM 的地图可能只是一堆没有颜色的点;神经表示 SLAM 的地图甚至是一段能求导的函数。 只要够机器人定位和导航就行,好不好看不是重点。
因为"能渲染"本身也有用:AR/VR 需要把虚拟物体叠在真实画面上;机器人需要渲染一个"没拍过的角度"来确认自己是否来过这里。 而且能渲染就意味着它把外观也记住了,这反过来能帮助定位。这是最近几年最热的方向之一(第七章会讲)。
如果把 SLAM 二十年发展压缩成一句话:地图从"一堆稀疏的点",变成了"一个能算、能求导、能自我修正的三维表示"。 每一次大换代,都是因为旧地图在某个场景下撑不住了,于是换了一种"装地图的容器"。
用"记笔记"来理解这五次变化。假设你要把一间会议室的样子记下来,供以后使用。
① 只记路标 —— 你在本子上写"西南角有个饮水机、门边有个白板"。 好记,但信息太少:出了这几个点,你什么都不知道。而且每个点你还得标注"我有多确定它在这"。
② 记关系网 —— 你改成写"饮水机在白板东边 3 米""白板正对门"。相对关系比绝对坐标稳定得多, 不容易被误差带偏。这就是"图"。
③ 记格子 —— 你拿一张坐标纸,逐格涂色标出哪里是墙、哪里是空的。 信息最全,但你必须涂满整个房间才罢休,纸不够用。
④ 记成一个公式 —— 你不画图了,直接写一句话:"凡距白板 1.5 米以内都是墙。" 极其紧凑,一句话描述整间屋子。但这句话太笼统,桌子腿、墙角这些细节全被抹掉了。
⑤ 记成一堆橡皮泥 —— 你直接捏一堆彩色橡皮泥团摆在桌上,有形状有颜色。 想看哪儿就把它们投影到那个方向,几乎瞬间看到结果。但泥团越摆越多,桌子放不下。
下面这张图里,五个面板描述的是同一个场景:一面墙、墙上挂着一幅画、墙前放着一把椅子。 区别只在于"用什么方式把它记下来"。
五个面板画的是同一个场景(一面墙 + 墙上挂的画 + 墙前的椅子),区别只在"用什么记下来"。 每个面板底部写着这一代的致命弱点——这正是下一代出现的原因。
① 路标点:只记三个点,每个点还带一个"我有多不确定"的圈。点少时没事,点一多,这些圈就会互相打架, 数学上表现为一张巨大的表格算不动了。
② 关系网:把点连成网,记录"谁在谁的哪边"。关键洞察是:这张网里绝大多数格子是空的, 所以可以只算非空的部分,计算量一下降下来。
③ 方块(体素):把空间切成小方块逐个填。信息最全,但内存随房间体积线性增长。
④ 函数:整间屋子压成一段可训练的函数。极小,但太笼统,细节都被平均掉了。
⑤ 彩球(高斯):一堆彩色椭球,投影到镜头就出画面。渲染快、能画没拍过的角度,但球会越加越多。
要记住的一句话:每次换代都是"换容器",而每个新容器都会带来新的麻烦——这就是下一代的起点。
把上面那条时间轴拉成因果链。每一条都写清了"谁失效了、为什么、谁解决了":
不是。它们更像不同工具,各自还都在用:小场景用滤波反而更简单可靠; 大场景用因子图;要渲染就上高斯。新技术不是替代旧技术,而是多了一种选择。
因为地图表示决定了你能做什么运算。稀疏点云能算"最近邻居",但没法渲染画面; 体素能渲染但改起来贵;神经网络能渲染又能求导,但会糊; 高斯能高速渲染又容易优化,但内存吃紧。 不是你有了算法再选表示,而是表示本身划定了算法的边界。这就是为什么每次换表示都会带来一波新方法。
建议按顺序理解,但重点学第二代和第三代——因子图是今天几乎所有系统的骨架, 体素/TSDF 是理解主流的必经之路。第四代之后都是在这两者之上的改进。第六代(高斯)是当前的研究热点。
激光 SLAM 二十年的故事可以概括成一句话:它一直在想办法"少算一点"。 先是想少看几个点(只挑重要的),后来发现挑点这件事本身太累,干脆全看(不挑点), 于是压力全压到了"怎么快速找到最近的那个点"上——结果这条线后半程的突破,几乎全是数据结构的突破,而不是算法的突破。
想象你站在一个漆黑的房间里,手里只有一支会旋转的激光笔和一块秒表。
你朝正前方按下激光笔,它打到墙上反弹回来,你掐表——用了 0.00000002 秒。 因为光速是已知的(约每秒 30 万公里),时间就能换算成距离:这面墙离我 3 米。
然后你把激光笔转一个很小的角度,再量一次;再转,再量……转完一圈,你就把整个房间的轮廓量了一遍。
激光雷达就是把这件事全自动化的机器:它每秒转 10–20 圈,每圈在不同高度上同时发出几十束激光(叫"几十线"), 每秒钟产生几十万到上百万个测距结果。
下面这三个面板,展示的是点云是怎么一个点一个点攒出来的。
① 一束激光 = 一个点。雷达转到一个方向,发一次脉冲,量出到障碍物的距离,得到唯一一个坐标点。 就这么简单——它不"拍照",它只是不停地在量距离。
② 转一点,就多一个点。角度每变一点,就多一个点。点越攒越多,轮廓就慢慢浮现出来。
③ 转完一圈,得到这一圈的完整轮廓。这一圈的几百到几千个点打包在一起,就叫一帧 (这里"帧"的含义)。 第二圈再扫一遍,就得到第二帧。一直扫下去,点云就越来越密。
要记住的关键点:点云里的点没有编号、没有行列、没有顺序。 你没法说"第 3 行第 5 列那个点",只能说"离这个坐标最近的点是哪个"。 后面所有的技术难点,都源于这一点。
假设雷达一秒给你 100 万个点。你打算怎么用?
早期方法(LOAM 那一代)的想法很自然:这么多点太浪费了,先挑出有信息量的用。 哪些点有信息量?墙角(能确定两条墙的交线)和墙面(能确定一个平面)。其余的点丢掉。 这个动作叫 特征提取。
但十几年后,FAST-LIO2 反过来说:挑点这个动作本身才是最大的麻烦,不如不挑。 这不是偷懒,论文给出的理由有三条:
判定"哪些点算墙角",需要人工设计一套规则。问题是:机械旋转式雷达和固态雷达的扫描图案完全不同, 上一套规则在新型号上就不管用了。每换一种设备,就要重新调一遍。
真实环境里有很多"不太像墙角也不太像平面"的结构——桌腿、门槛、栏杆、电线。 严格的特征规则会把它们当噪声丢掉,而这些细节恰恰在某些场景里是唯一能用来定位的东西。
全部点直接参与计算,就没有"特征提取模块"。代码量大幅下降,出错的地方也少了。 代价只是计算量变大——而计算量可以用更好的数据结构解决。
两个面板画的是完全相同的场景(一条走廊 + 一个墙角 + 一件家具),区别只在"用哪些点"。
左边(老办法):只有绿点(平面点)和红点(边缘点)被选中参与计算,灰点全部丢弃。 注意那件家具——它的腿和边缘既不完全是平面也不完全是棱角,很容易被规则当成噪声扔掉。
右边(新办法):所有点都参与,蓝色小点轮流闪烁表示"大家都在被计算"。 左下角那三个零碎点的位置,正是"不够规整、容易被丢掉"的结构。
这个转变的意义:问题从"怎么设计更好的挑点规则"变成了"怎么让所有点都算得够快"。 于是战场就转移了——转移到下一节这个数据结构问题上。
"不挑点"听起来很爽,但马上就遇到一个问题:你凭什么知道新扫到的点,和地图里哪个点是"同一个地方"?
做法是比较——对每个新点,在地图里找离它最近的几个点,看距离够不够近、方向对不对得上。 这个动作叫"找最近邻居"。雷达一秒给 100 万个点,每个点都要问一次, 所以"找最近邻居"这个操作会被执行几百万次——它的快慢,直接决定整个系统能不能实时跑。
为了快速回答这个问题,人们发明了专门的"数据容器"。最有名的是 k-d 树—— 它把空间反复二分,像查字典一样层层缩小范围。
但传统 k-d 树有个致命前提:它假设数据是一次性给齐、排好序、之后不再变的。 而 SLAM 完全相反——机器人一边走一边往地图里加点,还要删掉走远了的老点。 每次加点都要重建整棵树?那就不用跑了。
用"找书架上的书"来理解这件事。
最笨的办法:书乱七八糟堆在地上。要找《三体》,只能一本本翻,翻到第 47 本才找到。
k-d 树的办法:把书按字母分到 A–F、G–L、M–R、S–Z 四个书架;每个书架内部再细分。 找《三体》先去 S–Z 那格,再找"三",三步就找到了。这就是"树"的意义——层层缩小范围。
SLAM 的麻烦在于:新书在不停地运进来,而且有些书还得下架。 如果每次运进一本新书,你就把整个书架推倒重排一遍,那你这辈子都在整理书架。
ikd-Tree 的解法:新书先随手插到对应格子里;当发现某个格子塞得太满、深得离谱时,只把那一格重新整理一下—— 不碰其他格子。这样既不耽误使用,又保持了"找书快"。
左边是问题。地图不停地加点,如果都按"比它大放右边、比它小放左边"的规则硬塞, 树就会越来越偏、越来越深。找最深处那个点时,得一层一层走 5 步。 在实时系统里,这种偶发的"慢一下"足以导致跟踪丢失。
右边是解法。发现某条分支太深时,就把那一小块局部拆开重排,让树重新匀称。 同样多的点,层数从 5 降到 3,查询快一倍——关键在"只动那一小块",不推倒全部重来,所以不会让机器人卡顿。
ikd-Tree 一共比传统 k-d 树多做了四件事(后两条在图外补上):
① 边跑边加点,不用重建整棵树;② 能删除过期的点;
③ 能在树上直接做"抽稀",控制地图规模不会无限膨胀;④ 发现某边太深时局部旋转重平衡。
要记住的一句话:这四条合起来,解决的就是"地图必须能边建边改"这个实时 SLAM 的硬需求。 后来的 Faster-LIO 干脆放弃树结构、改用"按格子分桶"的 iVox,又快了一大截——但那是同一个思路的延续:换容器。
这个问题很隐蔽,但很致命。
雷达"转一圈"需要时间,比如 0.1 秒。而在这 0.1 秒里,机器人一直在动—— 它可能往前走了 20 厘米,也可能转了 3 度。
结果就是:同一帧里的第一个点和最后一个点,其实是从两个不同位置、不同角度看到的。 如果算法假装它们来自同一时刻、同一位置,算出来的墙就是歪的。这叫 帧内运动畸变。
上面那张是"不管它"的后果。真实的墙是笔直的(深灰粗线),但因为扫描的 0.1 秒里机器人一直在往前跑, 算法把最后扫到的点当成"从起点看到的",于是它算出来的墙面是斜的(红色虚线)。走得越快,歪得越厉害。
下面那张是 Point-LIO 的思路。它承认"这些点不是同时采到的", 然后给每个点单独补偿——按它被扫到的那一时刻、机器人所在的位置,把它挪回正确的地方(绿色点沿着箭头滑向墙)。 挪完之后,点重新落回一条直线。
顺带解决了另一个问题。如果能逐点处理,就不必"攒够一整帧再算"。 这意味着机器人的运动估计可以更新得极快——论文里这正是它能跟踪"人类挥舞手臂"那种剧烈运动的原因。
把前面这些串起来,就是激光 SLAM 的完整演进。每张卡右边写的是它卡在哪,下面写的是它怎么破:
| 系统 | 后端怎么算 | 地图用什么存 | 挑不挑特征 | 最本质的那个不同 |
|---|---|---|---|---|
| LeGO-LOAM | 两步 LM 优化 | 特征点云 | 挑(边缘/平面) | 加了地面约束和去噪,主打轻量嵌入式 |
| LIO-SAM | 因子图 | 局部关键帧子集 | 挑 | 多传感器因子融合 + 只对局部配准 |
| FAST-LIO2 | 迭代 EKF | ikd-Tree | 不挑 | 原始点直接配 + 增量 k-d 树 |
| Faster-LIO | 迭代 EKF | iVox | 不挑 | 并行近邻查询,1000–2000 Hz |
| Point-LIO | 迭代 EKF | 逐点(不攒帧) | 不挑 | 点在采样时刻就融合,没有帧内畸变 |
| KISS-ICP | 优化 | 抽稀后的点云 | 不挑 | 不用 IMU,极简,换雷达免调参 |
| iG-LIO | 迭代 EKF | 增量体素 | 不挑 | GICP 与惯性约束统一在最大后验框架里 |
| LOG-LIO | 迭代 EKF | 体素 + 面片 | 不挑 | Ring FALS 实时法向估计 + 分层匹配 |
激光能测准"东西在哪",但不知道"它长什么样";摄像头能看到纹理和颜色,但说不清"它离多远"。 这两个缺点刚好互补,所以把两者合起来几乎是必然的选择。这条线二十年的进展不在于"要不要合", 而在于怎么合——从"各跑各的、最后拼一下",到"合起来放进同一张地图互相约束"。
三个面板画的是同一张沙发,分别是三种传感器配置"眼中的它"。
① 只有激光:绿色的点勾出了沙发的形状——你能看出"这里有个东西,大概这么高、这么宽", 但它是沙发还是箱子,你分不出来。因为激光只测距离,不记录颜色。
② 只有相机:这不是点云,而是照片式的实心色块。你一眼就认出"这是红色的沙发", 但它离你 2 米还是 5 米?照片完全看不出来——因为把物体放大一倍、距离也拉远一倍,投影到照片上一模一样。
③ 融合之后:点云保留了激光的准确形状和距离,每个点又带上了从照片取到的颜色。 于是你同时知道"是红色沙发"和"离我 3.2 米、宽 1.4 米"。
这条线二十年的核心难点就一句话:怎么知道照片里的哪个像素,对应激光点云里的哪个点? 两个传感器视角不同、频率不同、还各自有误差。"怎么对齐"就是全部的难度所在。
摄像头是所有传感器里最便宜的(几十块钱)、信息最丰富的(一张照片几百万个像素), 但它有三个天生的缺陷:① 一个摄像头看不出真实大小;② 怕光照变化和白墙; ③ 分不清"是东西在动"还是"我在动"。视觉 SLAM 的整部历史,基本就是在跟这三个硬伤搏斗。
硬伤① 难在哪?给你看一张照片,里面有栋楼。你能看出它是 10 米外的三层小楼,还是 100 米外的三十层大楼吗? 看不出。因为把物体放大 10 倍、距离也拉远 10 倍,投影到照片上完全一样。 这叫尺度不可观测。
硬伤② 难在哪?特征法靠"找有特点的小块图案"来跟踪,但白墙、走廊、磨砂玻璃上没有任何可辨认的图案,算法就瞎了。 而且它对光照很敏感——同一面墙,中午和黄昏的照片差很远。
硬伤③ 难在哪?镜头里有个路人走过。从像素角度看,"路人向右移动 50 像素"和"相机向左移动"产生的效果几乎一样。 这就是动态物体为什么这么难处理。
面对一张照片,第一件事是决定用哪些像素来做计算。这个选择决定了整个方法的性格。
三个面板是同一个房间(有窗户、家具、还有一块什么都没有的白墙),区别只在"用多少个像素来算"。
① 特征法:只在有辨识度的位置挑点(蓝色十字——窗户角、家具角、墙角)。白墙那块(红色闪烁) 一个点都挑不出来,所以那片区域等于"看不见"。好处是算得少,而且因为比较的是"角点的位置"而不是"亮度", 它对光照变化不敏感。
② 直接法:整个画面铺满网格,每个像素的亮度都参与计算,白墙那块也一样(绿色小点均匀闪动)。 好处是白墙、弱纹理也能用;代价是"亮度"成了唯一的依据,所以光照一变(比如自动曝光),算法就乱了。
③ 半直接法:折中——只挑几个小块(橙色方框)来快速求位姿,但每块内部算全像素。 极快极轻,代价是需要一个还不错的初始位姿(因为它靠小块对齐来找位姿,初始差太远就对不上)。
一句话记住这个区别:特征法用位置(角点在哪),直接法用亮度(像素值多少),半直接法两者都用一点。
左边是单目的困境。取景框里那棵树,"0.5 米高的小树苗长在 2 米外"和"5 米高的大树长在 20 米外", 拍出来的照片完全一样。所以算法无法判断真实尺寸——它只能给出"形状正确、但整体大小任意"的地图。
右边是加 IMU 之后。IMU(惯性测量单元,一个测加速度和角速度的小芯片)能测出相机的实际加速度, 积分两次就得到真实位移。一旦"我从 A 移动到了 B,距离 1.2 米"这个事实确定, 再结合两条视线的夹角(视差),三角形的形状就唯一确定了——树高 5.2 米、距离 18.4 米,都能算出来。
为什么这条线后面还有那么多论文?因为 IMU 自己也不干净——它有零偏漂移、有噪声, 而且必须先估出"重力朝哪个方向"。怎么把视觉和惯性揉在一起、怎么在刚启动时快速收敛、 怎么处理旧数据——每一个都是难啃的骨头。这就是 VIO(视觉惯性里程计)这十几年的主战场。
它的流程是:先纯视觉恢复结构,再做视觉-惯性对齐——一次性算出尺度、重力方向、速度、IMU 零偏; 然后用紧耦合的非线性优化来跟踪;回环用一个 4 自由度的位姿图保证全局一致,还能存地图、读地图、合并地图。
ORB-SLAM3 把这条推得更远:连 IMU 初始化阶段也完全靠最大后验估计, 并且用多地图系统配合改进的场景识别,在长时间丢失跟踪之后还能重新接上。
MSCKF 的核心贡献是推导出一个测量模型,用来表达"同一个静止物体被多个相机位置看到"产生的几何约束。 妙处在于这样就不用把每个三维点的位置放进状态向量,计算量对特征数量只是线性增长。
ROVIO 走的是"直接法 + 卡尔曼滤波"。OpenVINS 作为研究平台, 特别强调 FEJ 一致性处理——通俗说就是"别让估计过于自信",同时内置在线标定和仿真器。
两帧图像之间可能有上千次 IMU 测量。如果每个都塞进优化,问题会大到算不动。
IMU 预积分(2017)把这上千次测量打包压缩成一个"相对运动约束"。
难点在于旋转发生在"流形"上——通俗说就是"三个角度不能像普通数字那样简单相加" (转 350° 再转 20°,结果不是 370° 而是 10°)。这篇论文给出了正确的处理方式和可用的求导公式,所有现代 VIO 都建立在它之上。
要精度、有算力 → 优化派(VINS-Mono / ORB-SLAM3)。这是目前大多数系统的选择。
要省算力、要快 → 滤波派(MSCKF / OpenVINS)。嵌入式平台更合适。
要快速验证算法 → OpenVINS 内置仿真器,可以先在电脑上跑通了再上硬件。
单目:最便宜,但有尺度问题(必须配 IMU),而且初始化麻烦。
双目:靠两个镜头之间的固定距离直接算出深度,尺度天然已知,不用 IMU 也行;代价是要标定、算量大、体积大。
RGB-D(彩色图 + 深度图,比如 Kinect):直接给深度,最省事;但深度相机靠红外投影工作,室外阳光下会失效,量程也有限。
选择建议:室内小场景用 RGB-D 最省心;室外用双目 + IMU;预算极紧用单目 + IMU。
不完全是一回事。里程计(Odometry)只负责推算"我移动了多少",不管全局地图,走久了必然漂移。 SLAM 则额外包含回环检测和全局优化,所以能长时间保持准确。
实践中常说"VIO",往往是一个 SLAM 系统里的前端部分。论文标题里写 VIO 的系统,通常也带轻量回环。
前五章的地图都是"存着一堆东西"——点、体素、面片。2021 年有人换了个思路:地图不存东西了,改成一段函数。 问它"坐标 (x, y, z) 这里是不是墙",它回答"是"或"不是",还顺便告诉你"这里是什么颜色"。 函数当然比一堆数据小得多,但它有两个天生的毛病:会糊(细节被平均掉)和不好改(修正误差时没法局部揉一下)。 这条线后面所有论文都在解决这两个问题。
先理解"隐式"是什么意思。
显式地图=一本相册。你想知道"客厅有沙发吗",得翻到客厅那张照片看。信息实实在在存在那儿。
隐式地图=一个会画画的人。你问他"客厅有沙发吗",他凭记忆现场给你画一张。 他没存任何照片,但能根据你的提问生成答案。信息藏在他的"记忆"里——也就是网络的参数里。
好处是:这个人能回答任何你没拍过的角度,因为他在"生成"而不是"查找"。 坏处也很明显:他会记混、会把细节画糊;而且你让他"把沙发往左挪 20 厘米",很难只改这一处而不影响别的记忆。
它的工作流程可以用一句话概括:沿着视线问一路,"这里有没有东西?什么颜色?"然后累加起来,得到一个像素。
上半部分:相机朝一个方向看出去,算法沿着这条视线(橘色虚线)撒一串采样点(紫色圆点)。 每个点都拿去问神经网络:"你这里有多少东西挡着?是什么颜色?"
注意圆点越靠近真实表面越大越亮——这表示网络在那个位置的回答是"这里密度很高,有东西"。 过了表面之后,圆点又变小变暗了。
下半部分:把沿途所有答案按远近加权累加。近处的贡献大、远处的贡献小。 累加出来的结果就是这个像素应该是什么颜色(那个红方块)。
最后一步很关键:把这个颜色和真实照片上同一位置的像素对比,差多少就反过来调整网络参数,让它下次答得更准。 反复几万次,网络就"记住"了整个场景。这个过程就叫训练,而地图就是训练完的网络本身。
它和传统方法的根本区别:传统方法在"查找"地图,神经方法在"生成"画面。 所以神经方法能做到传统方法做不到的事——渲染一个你从来没拍过的角度。 代价是它算起来慢得多(每个像素都要问几十次网络),而且在实时 SLAM 里还得边跑边训练。
iMAP 用一个小神经网络充当整张地图。它证明这条路可行,但也暴露了一个根本缺陷——这个缺陷花了三四年才被绕开。
左边是 iMAP 那一代的困境。整个场景的信息都被压进一个"全连接"网络—— 每层的每个节点都连到下一层的每个节点。这种结构的后果是:为了记住"这里有个墙角",几乎所有参数都得调整, 而调整的副作用会把别处的细节一起抹掉。最后重建出来的墙角,就成了一团糊(对比左下角"想要的"和"实际得到的")。
右边是解法:在空间上铺一层"特征格子"。每个格子存一小段数字(叫特征向量,可以理解为"这一小块地方的小抄")。 要记住墙角,只改那一格就够,网络本身保持很小很专注,不再牵一发动全身。右下角可以看到墙角被保住了。
这一招的代价:格子本身要占内存,格子越细内存越大。所以后面几篇论文就是在"格子怎么设计更省"上做文章—— NICE-SLAM 用多层次网格;Vox-Fusion 用八叉树,只给"有东西的地方"开格子; ESLAM 用三个轴对齐的平面代替三维格子(省一个维度);Co-SLAM 用两种编码混合(一种负责平滑、一种负责高频细节)。
就是"不直接把答案存起来,而是存一套能算出答案的规则"。
打个比方:显式地图像一本相册——想知道客厅什么样,去翻照片;隐式地图像一个会画画的人——你问他,他现场画给你。 所以隐式表示能回答"你没拍过的角度",代价是它可能画错、画糊。
因为它有两个硬伤:① 算得慢(每个像素都要问几十次网络,实时跑很吃力); ② 回环修正困难(发现前面走偏了,要把整张地图挪一下,而隐式地图"挪"起来很别扭)。
所以实践中,神经表示目前更多用在"重建和渲染",而不是"稳定定位"。要定位,激光或视觉惯性方案仍然更可靠。
3DGS(三维高斯泼溅)是这几年视觉领域最轰动的一件事。它的想法简单到有点粗暴: 与其用一个神经网络去"算"每个像素的颜色,不如直接在空间里摆一堆半透明的彩色椭球, 把椭球"泼"到屏幕上混合起来,画面就出来了。这样做渲染快了几个量级, 坏处是——椭球会越摆越多,显存顶不住。这条线在 SLAM 里的进展,就是"怎么边跑边建,同时控制椭球的数量和位置"。
用橡皮泥捏房间来理解。
NeRF 的做法:请一位雕塑家。你问他"朝这个方向看能看到什么颜色",他凭记忆现场描述给你听。 灵活,但每问一次都要等,而且他给出的永远是"描述"不是实物。
3DGS 的做法:直接抓一把彩色的半透明橡皮泥团摆在空间里。你想看哪个角度, 就把这些泥团投影到那个视角的玻璃上叠起来——一秒出结果。因为泥团是"实物",投影这件事可以高度并行,快得飞起。
那问题在哪?泥团会越摆越多。想看清细节就得摆更多更小的泥团; 一个房间摆几百万团之后,你的桌子(显存)就放不下了。 而且想把整堆泥团整体挪一下(回环校正),比挪一张网格难得多。
左边:空间里摆着一堆半透明彩色椭球。每一个椭球带四项信息:在哪(位置)、多大什么形状、什么颜色、有多不透明。 一堆椭球凑在一起,就"堆"出了场景的样子(图中这几个椭球合起来大概是一张沙发)。
中间:"投影 + 混合"。把这一堆椭球投影到"镜头看到的那个平面"上,按远近和透明度叠加起来。
右边:屏幕上就出现了画面。注意这个画面是朦胧的、有点"发光"的——因为椭球是半透明的, 叠加后会互相渗透。这正是 3DGS 的视觉特征。
为什么它比神经方法快?神经方法要"逐个像素去问网络",而高斯方法是"把一堆现成的东西投影下来叠加"—— 后者天生适合显卡并行计算,几毫秒就能出一整帧。
但注意左边的三条红字:椭球会越加越多,显存吃紧;而且椭球是散的, 想把它们整体挪动一下(比如发现前面走的路线偏了,要整体校正)非常困难。这两点就是 2024–2025 年那批论文在解决的问题。
因为原版 3DGS 的前提是"你已经告诉它每张照片是从哪儿拍的"——它需要先用传统方法(SfM)算出精确位姿,然后再优化场景。
而 SLAM 恰恰要自己算出这个位姿。所以直接搬过来是循环依赖,用不了。MonoGS 那一批论文做的,就是把"位姿"也变成可优化的量。
两个:① 椭球数量随场景线性增长(去个大商场,显存就爆了); ② 回环校正困难——发现前面走偏了,要把这一大堆椭球整体挪动,代价很高。
(对比一下:神经点方案因为点本身"能形变",做这件事就轻松得多,这是 PIN-SLAM 的优势。)
建议先不要当主定位方案。高斯 SLAM 目前更适合"重建与可视化"—— 比如让你有个好看的三维地图、能渲染没拍过的角度。定位的稳定性和实时性,激光/视觉惯性方案仍然更成熟。
如果确实想用,可以看看 Photo-SLAM(2024),它是少数明确标榜"能在嵌入式平台实时跑"的方案。
深度学习进入 SLAM 的方式很有讲究:它没有一上来就替换整个系统, 而是先从两个"最像模式识别"的子问题下手——①两张图里哪些点在描述同一个东西(特征匹配)、 ②这张图我来过没有(场景检索)。这两个问题的答案都难以用公式写全,但人一看就知道对不对, 正好是神经网络最擅长的。等这两块站稳了,才逐渐有了端到端方法和基础模型。
为什么从"匹配"和"检索"下手?因为这两个问题有个共同点:答案很难用规则写出来,但人一看就知道对不对。
"这两张照片里,哪个点在拍同一个墙角?"——传统做法是给每个点算一串数字(叫描述子),希望"同一个墙角在不同角度下这串数字相近"。 但"相近"这件事很难写全规则:换了光照呢?换了角度呢?换了尺度呢?这正是神经网络的主场——给它大量例子,它自己学出"什么算像"。
而 SLAM 的主干(怎么优化位姿、怎么维护地图)反而一直是传统方法占优, 因为那些部分有明确的数学模型,可解释、可控,出了错也知道错在哪。神经网络在这些地方反而容易犯"说不清为什么"的错。
上面是同一个房间在前后两个时刻的两张照片(相机稍微移动了一点)。蓝色小点是算法挑出来的"有辨识度的位置" (窗户角、家具角、墙角、地面上的点)。
算法要做的事是:判断左边照片里的某个点,和右边照片里的哪个点,是空间里的同一个东西。 绿色连线是判断正确的匹配;红色虚线是判断错误的——比如地面上的点,在两张图里看起来都很像,就可能被配错。
为什么一个错误匹配很要命?因为后面算相机位置时,会把这些匹配当作"约束"。 一个错误的约束会把算出的位置往错的方向拉,导致整个轨迹歪掉。
深度学习带来了什么改变?传统做法是"分别给每个点算一串数字特征,然后比谁最像"—— 只看单个点,不看全局。而 SuperGlue 把两张图的所有点放在一起, 用注意力机制全局地推理:"如果 A 点和 B 点匹配,那 C 点就不该和 D 点匹配"。 它还会输出一个"这个匹配有多可信"的分数,让不可靠的匹配被剔除掉。
SuperGlue(2020)用图神经网络 + 可微最优传输,把两组特征点放在一起联合求解匹配关系,还能拒绝"根本没法匹配"的点。
LightGlue(2023)重新审视了 SuperGlue 的多个设计决策,给出更简单有效的改进。 它最关键的品质是自适应:图像对容易匹配时(重叠大、外观变化小)推理明显更快,内存和算力都更省。
LoFTR(2021)换了条思路——干脆不检测特征点:先在粗糙层做逐像素的稠密匹配,再到精细层精化,靠 Transformer 的自注意力和交叉注意力提取特征。
DBoW2(2012)用"二进制词袋"做快速场景识别——把图像里的局部特征归类成"单词",整张图就变成一个"词袋",比较词袋就知道像不像。它是 ORB-SLAM 系列回环检测的技术基础。
Scan Context(2018)另辟蹊径:不做直方图、不需要训练,直接记录"可见空间的三维结构", 因此对视角变化(比如反方向重访同一个地方、转弯)不敏感。Scan Context++(2022)进一步做到对横向偏移也鲁棒——针对的是城市道路上不可避免的车道级变化。
LCDNet(2022)同时做地点识别和 6 自由度相对位姿估计,用非平衡最优传输构造可微的相对位姿模块,在反向回环这个难点上大幅领先。
LCR-Net(2024)把回环检测和重定位统一进一个框架,用位姿感知的注意力,不再依赖耗时的鲁棒位姿估计器。
DeepVO(2017)第一次证明单目视觉里程计可以端到端做——直接从 RGB 图像估计位姿,不需要先验知识或额外参数来恢复绝对尺度。
UnDeepVO(2018)用无监督方式,训练时借助立体像对来获得带绝对尺度的位姿和稠密深度。
DROID-SLAM(2021)是转折点:通过一个 Dense Bundle Adjustment(稠密光束法平差)层, 对相机位姿和逐像素深度做循环迭代更新——精度大幅提升,而且灾难性失败显著减少。
DPVO(2023)把稠密光流换成跟踪图像小块的循环网络结构,保持精度的同时大幅降低计算量。
DUSt3R(2024)提出 pointmap(点图)表示——网络直接预测规范坐标系下的三维点图, 同时保留"每个像素对应场景中哪个三维点"这层隐式关系。好处是统一了单目和双目的三维重建, 而且不需要相机标定、不需要初始位姿。
MASt3R-SLAM(2025)是第一个以双视图三维重建先验为基础的实时 SLAM: 做点图匹配、跟踪与局部融合、图构建与回环、二阶全局优化,还能处理"通用且随时间变化的相机模型"。
SLAM3R(2024)用前馈网络直接从 RGB 视频预测统一坐标系下的三维点图。
DINOv2 / SAM 作为特征提取和分割的基础模型,被下游 SLAM 直接调用 (比如 WildGS-SLAM 就用 DINOv2 特征判断"哪里可能是动态物体")。
多台机器人各自建图,然后互相交换信息、拼成一张大图。听起来只是"跑很多遍单机 SLAM 再合并", 但真正难的地方在于:两台机器都以为"我们到过同一个地方",其实其中一台认错了。 这种错误一旦被采信,整张地图就会被拧成一团。所以这条线的演进方向是:从"能协同",走向"能自动识别并拒绝错误协同"。
想象三个朋友分头逛一个陌生商场,然后通过对讲机汇总路线。
甲说:"我在优衣库门口。" 乙说:"我也在优衣库门口。" ——如果两人真的在同一个门口,他们的地图就能对齐,这是好事。
但如果商场里有三个优衣库(或者乙看错了楼层),他们就会把两张不相干的图强行拼在一起, 结果整张商场地图被拧成麻花,而且比不拼还糟。更麻烦的是,事后很难发现是哪儿出的错。
所以这条线的核心技术问题就是:怎么在没人监督的情况下,判断"这次协同到底是不是真的"。
左边是集中式:每台机器人(蓝色小圆点)把数据发给中央服务器,服务器统一算完再发回去。 优点是全局信息完整、容易做对;缺点是服务器一挂整队就瘫,而且机器人一多,带宽就顶不住。
右边是分布式:每台机器人只和自己通信范围内的邻居直接交换数据,没有中心。 优点是没有单点故障、通信量小。
注意那根红色虚线和旁边的 ✕。它表示"两台机器误以为到过同一个地方"的错误协同—— 右下角那个绿圈里的叉号,表示这个错误被算法自动识别并剔除了。
为什么"剔除错误协同"是这条线最重要的事?因为一旦错误的协同被采信,整张地图会被拧成一团,而且事后很难发现。 分布式系统里没有中心可以统揽全局判断,所以每台机器都必须自己有能力识破这种错误—— 这就是 DOOR-SLAM 的"分布式一致集最大化"、Kimera-Multi 的"分布式渐进非凸"在解决的事。
| 系统 | 架构 | 最本质的那个不同 |
|---|---|---|
| Multi-UAV-SLAM 2017 | 集中式 | 协同 SLAM 的早期架构原型:一台中央服务器 + 多个智能体 + 无线通信 |
| DOOR-SLAM 2020 | 完全分布式 | 用分布式两两一致测量集最大化(PCM)剔除机间伪回环——因为不怕虚假回环了,就可以用更激进的参数而不牺牲召回率;只靠点对点通信,前端不交换原始传感器数据(省带宽) |
| COVINS 2021 | 集中式 | 面向"多智能体 + 多用户 AR"的大规模协同视觉惯性 SLAM |
| Kimera-Multi 2022 | 完全分布式 | 用分布式渐进非凸(GNC)做鲁棒位姿图优化,能识别并拒绝由感知歧义导致的机间和机内错误回环;最终输出全局一致的度量-语义三维网格(不只是轨迹,还有带语义的模型) |
| LAMP 2.0 2022 | 集中式 | DARPA 地下挑战赛 Team CoSTAR 的方案:一个能适配不同里程计来源的单机前端接口 + 可扩展的多机前端 + 鲁棒的多机后端;回环检测模块能处理并优先排序迅速增长的候选 |
| DiSCo-SLAM 2022 | 分布式 | 第一个把轻量的 Scan Context 描述子用于多机 SLAM,实现数据高效的机间观测交换;两阶段(全局 + 局部)优化应对"不知道彼此初始位置"的情况 |
| Swarm-SLAM 2024 | 去中心化 | 四个性质:可扩展 / 灵活 / 去中心化 / 稀疏;邻机管理模块持续跟踪"谁在通信范围内、已经交换过什么数据";机间回环优先级排序降低通信量、加快收敛;ROS 2 实现在五个数据集 + 三种自组网上实测 |
| D²SLAM 2024 | 去中心化分布式 | 面向空中集群:区分近场估计(近距离的精确相对状态)和远场估计(一致的全局轨迹);前端同时支持立体和全向相机以应对空中视场受限;分布式优化在网络延迟下仍保持扩展性和韧性 |
| DCL-SLAM 2024 | 完全分布式 | 前端无关——可以快速迁移到不同的激光雷达 / 平台 / 场景;机间回环用三级通信流水线做到数据高效 |
普通相机每秒拍 30 张完整照片;事件相机不拍照片。它每一个像素只干一件事: 一旦这个像素的亮度变化超过阈值,就立刻发一个信号说"我这里变了",并附上是变亮了还是变暗了。 这样做的好处简直是作弊——没有运动模糊、明暗反差能到 120 dB(普通相机约 60 dB)。 坏处也很致命:场景不动的时候,它什么都不输出。
把普通相机想象成每 1/30 秒拍一张全班合影;把事件相机想象成一个坐在教室后排的记录员。
合影的问题在于:如果有人在快门那一瞬间快速挥手,照片上就是一道糊影——你不知道手到底在哪。
记录员不一样:他不管谁坐着不动,只记"谁动了"。所以哪怕有人飞速挥手, 他也能精确记下"第 3 秒手抬起来了,第 3.02 秒放下了"——时间精度极高,而且完全没有"模糊"这回事。
但如果全班纹丝不动呢?记录员的本子上就是一片空白。 所以事件相机不能单独用,它必须和普通相机(或 IMU)搭配。这也正是这条线上所有论文的共同结构。
上面是普通相机的困境。快门打开的这段时间里,球一直从左边移到右边, 于是照片上留下的不是"一个球",而是一道糊影。球动得越快、糊得越长,"它此刻到底在哪"这个信息就丢了。
另外还有两个问题:逆光场景里亮的全白、暗的全黑,中间层次全丢;动态范围只有约 60 dB。
下面的事件相机完全换了个机制。它不"拍"画面,而是每个像素自己盯着自己的亮度。 亮度变了就发一个带时间戳和正负号的信号;没变就一声不吭。 所以你会看到:静止区域一片空白,运动轨迹上爆出一串点。
这个机制带来的两个特性,也决定了它的两个用途:
① 没有运动模糊 + 极高动态范围 → 适合高速运动和极端光照(无人机穿越、隧道出入口);
② 静止时没输出 → 必须和普通相机或 IMU 配合使用——这正是这条线所有系统都是"事件 + 帧 + IMU"三件套的原因。
不会。它们采集的是两种完全不同的信息:普通相机记录"哪里亮", 事件相机记录"哪里变了"。
静止的时候事件相机一片空白——你没法用它来看一张照片、识别一个静止的物体。 所以它是互补关系,不是替代关系。目前所有主流方案都是"事件 + 普通帧 + IMU"三件套。
三个典型场景:① 高速运动(无人机快速穿越、机械臂高速动作); ② 极端光照(隧道出入口的高对比、夜间、强逆光); ③ 要求极低延迟(事件相机的响应延迟是微秒级)。
如果你的机器人是在光照良好的室内慢慢走,用不上——省下这个钱。
下面这些词在读论文时会反复出现。每个都给了"一句话大白话"和必要的补充,按主题分了组。
SLAM —— Simultaneous Localization And Mapping,同时定位与建图。一边走一边搞清楚"我在哪"和"周围什么样",两件事互相纠正。
定位 / 建图 —— "我在哪" / "周围什么样"。两者互为前提,必须一起解。
里程计(Odometry) —— 只靠自身传感器推算"我移动了多少",不管全局地图。走久了必然漂移。
漂移(Drift) —— 误差滚雪球。每步错一点点,累积成大偏差。像闭眼走直线。
回环检测(Loop Closure) —— 认出"这地方我来过",从而一次性修正累积误差。SLAM 能长时间运行的关键。
位姿(Pose) —— 位置 + 朝向,一共 6 个数字(3 个位置 + 3 个角度)。
紧耦合 / 松耦合 —— 紧耦合是"把多个传感器的数据放进同一个方程里一起解";松耦合是"各自解完再合并结果"。紧耦合更准,更难写。
退化(Degeneracy) —— 环境缺少足够的几何特征,导致某个方向的位置算不出来。比如一条笔直无特征的隧道里,前后方向就是退化的。
因子图(Factor Graph) —— 把估计问题画成图:圆点是待求的量(位姿、路标),方块是已知的约束(一次观测、一段惯性积分)。求解 = 调整圆点让所有约束尽量同时满足。
BA(光束法平差) —— 同时优化"相机位置"和"三维点位置",让它们投影回图像后和观测到的位置尽量吻合。SLAM 最核心的优化。
卡尔曼滤波 / EKF —— 一种"边走边修正"的递推估计方法,只维护当前状态和它的不确定性。EKF 是它的非线性版本。
ESIKF —— 误差状态迭代卡尔曼滤波。FAST-LIO 系列用的后端。"误差状态"指只估计小偏差而不是绝对量,数值上更稳定。
协方差矩阵 —— 一张"谁和谁有关、各自有多不确定"的表格。EKF 时代它的大小是状态数的平方,所以扩展到大规模就崩。
边缘化(Marginalization) —— 滑动窗口优化时"丢掉旧数据"的操作。不可逆,而且会锁死当时的线性化点。
延迟边缘化 —— DM-VIO 提出的技巧:推迟边缘化,维护第二张图,以便需要时用新的线性化点重建先验。
流形(Manifold) —— 通俗说就是"三个角度不能像普通数字那样直接相加"的空间(转 350° 再转 20° 等于 10°)。旋转就发生在流形上。
IMU 预积分 —— 把两帧之间成百上千次 IMU 测量"打包"成一个相对运动约束,免得每个采样都塞进优化。
鲁棒核函数 —— 一种"降低异常数据影响"的技巧。有它之后,少数错得离谱的匹配不会把整体结果带偏。
点云(Point Cloud) —— 一堆三维坐标点的集合,没有行列结构,通常也没有颜色。
体素(Voxel) —— 三维的"像素",把空间切成小立方体。
TSDF(截断符号距离场) —— 每个体素存"离最近的真实表面有多远",正数在外、负数在内,只看表面附近一定范围内的值(截断)。
k-d 树 —— 专为"找最近邻居"设计的数据结构,像查字典一样层层二分缩小范围。
ikd-Tree —— FAST-LIO2 提出的增量 k-d 树,能边跑边加点/删点、还能局部重平衡。解决"地图要能边建边改"的问题。
iVox —— Faster-LIO 用的增量体素结构,放弃树、改用"按格子分桶",支持并行近邻查询。
surfel(面片) —— 用一个带位置、法向、半径的小圆片代表一块表面,比点信息更多、比网格更轻。
八叉树(Octree) —— 一种"只在有东西的地方继续细分"的树,用来省内存。
特征网格 / hash 网格 —— 在空间里铺格子,每格存一小段数字(特征向量)。让神经网络"只看局部就改局部",避免全局牵动。
球谐系数 —— 用来表达"同一个点从不同方向看颜色不同"(也就是反光和光泽)的一组数字。
特征点 / 角点 —— 图像里有辨识度的小块图案(墙角、斑点),可以被稳定地在多张图里找到。
描述子 —— 把一个局部图像块压成一串数字,希望"同一个物理点在不同角度下这串数字接近"。
光度误差 —— 直接比较"预测的像素亮度"和"实际拍到的亮度"的差距,而不是比较角点位置。
重投影误差 —— "这个三维点投影回图像后应该落在哪"和"实际观测到落在哪"的差距。特征法用的指标。
NeRF(神经辐射场) —— 用神经网络表示场景:给它位置和视线方向,它回答"这里的密度和颜色"。渲染时沿视线累加。
隐式表示 —— 地图不存数据,而是一段能回答问题的函数。信息藏在网络参数里。
可微渲染 —— 渲染过程本身可以求导,所以"画面和照片的差距"能反向传播回去调整场景表示。
3DGS(三维高斯泼溅) —— 用一堆显式的半透明彩色椭球表示场景,渲染时把它们投影到屏幕叠加,速度比 NeRF 快几个量级。
过度平滑 —— 神经网络倾向给出"平均答案",导致尖锐的角落也被渲染成一团糊。
pointmap(点图) —— DUSt3R 提出的表示:网络直接预测每个像素对应的三维点,同时保留像素与场景的对应关系。
LiDAR(激光雷达) —— 靠"发射激光 + 测量返回时间"来测距的传感器,输出点云。精度高,但没有颜色和纹理。
IMU —— 惯性测量单元,一个小芯片,测加速度和角速度。频率高(几百 Hz),但会漂移。
GNSS 原始观测 —— 卫星原始信号(伪距、多普勒),而不是已经算好的位置。信息更多,更容易和其他传感器联合优化。
帧内运动畸变 —— 一帧点云内部的点其实来自不同时刻、不同位置,导致这帧自身就是扭曲的。
事件相机 —— 不拍画面,只报告"哪个像素亮度变了"。没有运动模糊、动态范围极高,但静止时没输出。
time-surface —— 事件相机里的一种表示:把最近每个像素"最后一次变化的时间"做成一张图,用来提取边缘。
VIO / LIO / LIVO —— 视觉惯性 / 激光惯性 / 激光-惯性-视觉里程计。按使用哪几种传感器命名。
RGB-D —— 彩色图 + 深度图一起输出的相机(比如 Kinect)。
帧(frame) —— 一次完整的传感数据采集(一张图、一圈激光扫描)。
关键帧(Keyframe) —— 不是每一帧都值得存,挑出来的有代表性的帧。用来平衡精度和算力。
滑动窗口 —— 只保留最近一段时间的状态一起优化,旧的自然丢掉。控制算力规模的通用手段。
ATE / RPE —— 绝对轨迹误差 / 相对位姿误差。评测 SLAM 精度的两个标准指标。
Hilti-Oxford 数据集 —— 用毫米级真值、微米级验证的外参、硬件时间同步,把 SLAM 评测从"相对排名"推向"绝对精度"。
DARPA SubT —— 美国国防部的地下挑战赛。这个领域的"极限压力测试",很多方法都是为它开发的。
GNC(渐进非凸) —— 一种鲁棒优化策略:先宽容地接受所有数据,再逐渐收紧、逐步剔除异常项。Kimera-Multi 用它剔除错误回环。
ROS 2 —— 机器人操作系统第 2 代,机器人软件的通用框架。
这个领域没有"最好的方法",只有"适合你场景的方法"。下面按常见场景给了推荐路线和理由。
这一节的内容来自一篇被广泛引用的综述(那个地下挑战赛的赛后总结)。它的价值在于说了实话: 在很多场景下 SLAM 确实"基本解决了",但真正让机器人失败的原因,跟论文里优化的那些指标基本无关。