
最近把这篇关于动态环境下的视觉SLAM与SfM综述完整读了一遍读之前我觉得自己心里有数动态环境问题不外乎就是把特征点里的外点剔一剔加个语义分割网络筛一筛再不行就换鲁棒核函数硬扛。但整篇读下来我发现这个领域的问题层次比我平时手头处理的那点工程难题要大得多——它不是一个加某个模块就能解决的问题而是从传感器、特征提取、几何约束到地图表示甚至后端优化整条链路都在被动态这两个字重新要求。这篇笔记我会按自己的理解重新组织综述的内容重点不是复述论文而是把动态环境这个词背后的技术脉络、方法分类和落地时容易踩的坑梳理出来希望能帮正在做视觉SLAM、或者准备入门这个方向的同学节省一些找路的时间。1. 综述在解决什么问题把动态环境变成一条清晰的技术主线1.1 静态假设这个地基有多容易被晃塌整个视觉SLAM和SfM的底层逻辑几乎都建立在一个静态假设上相机周围的世界是静止的观测到的像素变化完全来自相机自身的运动。基于特征点的系统假设匹配点对应的是同一个三维空间点于是三角化、对极约束、PnP求解才能成立基于直接法的系统假设某个像素在相机运动前后亮度不变于是光度误差才能被最小化。一旦场景里有行人、车辆、摆动枝叶、移动的家具甚至飘动的旗帜这个假设就变成了一个到处漏风的筛子。动态物体会带来两个层面的破坏第一特征匹配阶段会出现大量几何上不可能对应的匹配对比如同一个行人在两帧图像里的位置完全不同但纹理相似特征描述子依然会强行匹配成功第二即便匹配成功了这些点的多视图几何一致性也很差它们不但不会帮助位姿求解收敛反而会把优化结果往错误方向拖。更麻烦的是动态物体往往纹理丰富、特征密集人身上的衣服、车辆的车身图案都是特征提取器的最爱而静态背景反而可能纹理稀疏这就导致动态特征在数量上可能覆盖掉静态特征卡尔曼滤波也好、图优化也罢都会被这些看起来很可靠其实不可靠的观测带偏。综述里给出的一个核心判断我非常认同动态问题不像加噪、模糊那样是一种可以被当作噪声统计特性来处理的问题它是一种结构化干扰。动态物体的像素构成一个连通的、有语义含义的模式传统鲁棒估计比如RANSAC和Huber核只能把它当作孤立外点处理一旦外点比例超过一定阈值鲁棒估计的失效速度是很快的。这就是为什么整个领域要单独为动态做检测、分割和剔除而不是把所有希望寄托在后端优化上。1.2 综述的分类视角动态程度与场景类型这篇综述在处理动态环境这个宽泛概念时没有简单粗暴地把所有带运动的场景混为一谈而是按动态程度做了分层。我读完梳理下来大约可以分为这样几个档次第一档是刚体动态最典型的是行驶的车辆、走动的行人、搬运中的箱子。物体整体在移动但自身形状不变可以用刚性变换描述。这一档相对容易处理因为目标检测、实例分割和几何一致性方法都能派上用场。第二档是准静态或半静态比如停着的车后面突然有人走出来、室内被挪动的椅子、暂时静止后重新开始移动的物品。这类物体在某些时间窗口内满足静态假设在另一个时间窗口内又违反它给长期建图带来很大的干扰——如果你把一辆暂时停在路边的车当作永久静态结构放进地图下一次运行时它一旦移动整个地图就出现一个幽灵结构。第三档是非刚性动态最典型的就是人。人体的手臂、腿、衣摆在运动但运动模式不能用刚体变换建模再加上人的外观变化衣服褶皱、局部遮挡这一档最难处理。此外还有流体和风动物体比如树叶晃动、水面波动、烟雾飘移它们的运动规律更接近随机过程几乎不可能被精确建模。针对这些程度不同的动态综述把现有方法大体划为几何驱动、学习驱动、几何学习融合三类。这个分类是全文的主线下面我按这个框架来拆解。2. 三大主流检测路线几何、学习与两者之间的灰色地带2.1 几何一致性方法用多视图矛盾来揪出会动的东西几何方法的历史最长思想也很直接给定相机的位姿如果一个三维点真的是静态的那么它在不同帧里的投影之间必须满足对极约束如果某个匹配点严重违反这个约束它就很有可能是动态的。在RGB-D系统里这个检验会更直观可以直接比深度值和重投影深度的一致性差值超过阈值就标记为动态。实际做法一般是用多视图重投影误差作为判据先估算一个初始位姿通常用静态假设下的帧间匹配来算然后把各帧特征点往当前帧投影计算残差。残差大的点被标记为动态候选然后在后续优化中降低权重或者直接剔除。这里有一个关键细节初始位姿本身可能已经被动态点污染了所以综述里强调了几何方法通常需要迭代策略——先剔除明显外点重估位姿再重新检验反复多轮。这个思路的优点是机制透明、不依赖训练数据、对未见过的物体类别也有效只要是会动的刚体都能被揪出来。但缺点也很显然单目相机下尺度模糊和基线短的问题会让几何检验本身充满噪声纹理稀疏的动态物体几乎无法被特征匹配捕捉更麻烦的是如果动态物体占据了视野的大半初始位姿估计可能从一开始就偏了几何检验也就成了无源之水。另外几何方法只能告诉你这个点不一致不能告诉你这个物体是什么。对于后续更高级的语义地图、避障规划来说信息量是不够的。2.2 学习方法的介入从目标框到像素级掩码深度学习方法进入动态SLAM基本是沿着先检测、后剔除的路线走的。最早的尝试是做目标检测用成熟的2D检测器框出人、车等常见动态类别然后粗鲁地把框内所有特征点全部丢掉。这个做法实现起来很快效果在简单场景里也不错但问题也很明显检测框是轴对齐的矩形边界一定不贴合物体轮廓框内可能包含大量的静态背景直接把整块特征丢弃会损失许多有效特征反过来实例之间互相遮挡时检测框无法区分前景和背景。所以后来主流路线转向实例分割和语义分割。实例分割能输出每个动态物体的像素级掩码可以精确剔除属于动态物体的特征点而不波及背景。这一类方法的代表流程是前端的语义分割网络给出动态类别掩码→特征提取阶段或匹配阶段剔除掩码内特征→剩余特征参与位姿求解。综述里专门讨论了模型的泛化性分割网络在训练数据集上表现好但换到未见过的场景、天气、光线条件下分割质量下降误删或者漏删会影响整体系统的鲁棒性。这也引出了一个问题——纯学习方案在封闭场景里优秀在开放世界里却不一定稳定。另外还有一条不那么主流但很有意思的方向直接把光流或场景流引入动态判断。通过光流预测可以检测出那些几何一致性与静态假设差异大的区域从而识别运动物体。这类方法算是一种介于几何和学习之间的方案不需要语义标签但需要大量光流训练数据。它的优势在于能够捕获看起来正在移动的像素而不是依赖于物体类别——一个不在训练类别里的动态物体也能被发现。2.3 语义几何融合目前系统性最强的组合单纯语义方法的问题在于它判断的是这个物体属于动态类别而不是这个物体此刻正在动。一辆停在路边的车按类别来说属于车但它此刻是静止的一个坐在椅子上不动的人全身掩码都在输出人可并不在产生运动。如果直接按类别真值表过滤会把大量静态特征也误删掉严重消耗可用于位姿解算的特征数量。综述里把语义几何的融合方案评价为当前动态SLAM最系统工程化的思路我非常同意。典型做法分两步第一步用语义分割给出候选动态区域不是直接删掉而是作为疑似区域标记第二步在疑似区域内用几何一致性检验逐个特征点确认只有那些既属于动态类别、又在几何上确实不一致的点才被剔除。这样既保留了停在路边的车上的特征它们几何一致又能把正在移动的人身上的特征删干净它们语义和几何双重确认。这种语义提名、几何仲裁的组合方式在实操中还有一个额外好处降低了对分割精度的依赖。即便分割网络把某些背景误标成动态类别只要几何检验显示这些点符合静态模型它们还是会被保留。反过来如果分割网络漏检了某个动态物体几何检验仍然能作为兜底发现它。两条信息通道互为校验整个系统的容错能力明显提升。综述还提到融合方案还可以进一步升级例如把语义信息作为权重而非硬开关——动态置信度高的点权重设为0动态置信度中等的点权重打折而非直接删除。这种软策略在优化稳定性上往往比硬剔除更好。3. 从检测到系统集成动态信息到底该怎么用3.1 剔除时机与筛选策略不是所有动态点都该被删很多初学动态SLAM的人以为核心工作量全在把动态物体检测出来但真正实现一个可用的动态SLAM系统后会发现检测结果如何与原有估计流程耦合才是决定成败的关键。综述里隐含了一条处理链我把它拆成三个阶段。第一阶段是特征提取与匹配阶段。语义分割掩码可以在特征提取前就生效直接把动态区域排除在特征提取范围之外这样可以减少后续无效匹配的计算量也避免了动态特征点被误匹配后在后端造成污染——这是效率最高、最干净的介入方式但前提是分割网络足够可靠如果误删了太多静态特征在纹理稀疏环境里会加速位姿退化。第二阶段是匹配后、优化前的几何检验。这个环节适合对已经产生的匹配对做一致性过滤一般会结合鲁棒估计一起用。需要注意阈值选择重投影误差阈值设得太小会把正常尺度的误差当成动态剔除设得太大又会放过真正的动态点。我在实践中倾向让阈值稍微宽松一点宁可让几个动态点混进来也要保住几何约束的完整性因为后端的鲁棒核还能再兜一层反过来阈值过紧导致特征数量猛降系统就真的无解了。第三阶段是优化阶段中的加权处理。不需要把所有动态点从优化变量中移除而是给它们设置一个与动态置信度相关的权值。语义分割置信度高、几何残差大的点权重给到0.1甚至0残差中等、置信度中等的点给0.5。这样做的哲学是我们对动态的判断本身是有噪声的与其做非此即彼的硬决策不如用一个软映射来减少错误决策的影响。3.2 建图端与优化端动态信息如何影响地图和位姿最终输出动态信息的影响不只在前端估计更关键的体现在地图构建上。传统稠密建图或稀疏特征地图会把所有观测都融进全局地图。一个动态物体如果被当作静态结构融入地图之后每次相机回访这个区域都会产生持续性的重投影误差这种误差无法被后端优化消除因为矛盾出在地图本身。综述中提到的普遍做法是地图端将动态物体单独处理要么不把动态物体的点加入全局地图要么把它们存成独立的动态地图层。对于需要长期运行的机器人来说动态地图层其实很有价值——例如配送机器人需要知道某个区域经常有人经过或者某扇门经常被开关这些信息对路径规划很有用。因此现在越来越多的系统不再把动态简单当作障碍而是把动态作为地图的一种属性来建模。后端优化层面一个值得注意的设计是先做位姿图优化、再做动态点剔除、最后再来一轮精细化优化的循环结构。因为初始位姿不准时几何检验的判据也会不准可能误删正常点。所以在实现上很多系统会跑两到三轮优化第一轮用标准过程得到粗略位姿利用粗略位姿在世界系中检验点的动态性然后删掉被判为动态的点对剩余点做第二轮精细优化。综述把这类位姿与动态性交替估计称为一种鸡生蛋问题的工程解法非常有实践意义。3.3 我实测中踩过的参数坑带着这些框架去复现和调参时有一些阈值和策略是常规论文不细讲的但实际影响极大。第一是重投影误差阈值。不同分辨率相机、不同标定精度的设备对残差尺度的要求差别很大不要直接照搬默认值。推荐做法是先跑一段静态场景统计残差的均值和标准差然后以均值的N倍标准差作为动态检验的初始阈值再根据实际动态剔除率微调。第二是动态物体占视野比例与关键帧选择的耦合。当动态物体占据大半画面时有效静态特征可能只剩不到几十个位姿解算精度会断崖式下降。这时候与其死磕动态剔除不如考虑在时间维度上做文章动态物体通常不会每个时刻都充满画面可以在跟踪线程中动态调整关键帧选取策略在动态占比高的时间段多选几个帧靠多帧冗余来弥补单帧特征的不足。第三是半动态区域的迟滞处理。由于分割和几何检验都有噪同一个点在不同帧之间可能在动态/静态之间来回跳会导致地图点质量不稳定。我通常会给动态判定加一个迟滞区间某个点连续K帧被判动态才真正剔除或者某次被判静态后需要连续N帧动态才会重新被判定为动态。这个K和N的取值要结合实际帧率调帧率越高可以取得越大。4. 评测怎么评动态场景下的指标、数据集与失败模式4.1 常用评价指标与高动态序列设计动态SLAM系统的评测比静态SLAM更讲究因为在动态场景里轨迹精度高和动态剔除好并不完全是一回事需要同时看几个维度。最常用的还是两类基础指标一类是绝对轨迹误差衡量估计轨迹与真值轨迹在全局意义下的一致性另一类是相对位姿误差衡量的是局部短时段的位姿漂移。在动态环境中绝对轨迹误差更多反映系统在长时间运动中的累积特性而相对位姿误差能更敏锐地捕捉到动态外点瞬间冲击位姿的尖峰。除了轨迹误差综述里特别提到区域级指标比如动态区域特征保留率、被误删的静态特征比例、动态物体检测的召回率等。这些指标本身不是衡量SLAM精度的但它们能解释SLAM精度为何下降——如果系统轨迹误差很大可能是动态剔除不够好也可能是误删静态特征导致位姿退化只有把轨迹指标和区域指标一起看才能在根因上定位问题。数据集方面主流做法是在室内场景中设置若干条动态序列序列里的动态目标包括来回走动的行人、坐在桌前办公的人、以及静止人偶的对照实验。设计这些序列的意图很明确对比同一场景在动态与静态条件下的精度差并测试系统能否正确处理不同动态程度的目标。室外自动驾驶相关数据集则更关注车辆和行人评估点偏向于多传感器融合与实时性。我在看综述的实验对比表时注意到一个现象很多方法在行人慢慢走动的序列里都能做到几乎不掉精度但在多人同时走动加上部分遮挡的高动态序列中误差会放大好几倍。所以评估一个系统不能只看平均误差要看它最差的那条序列撑不撑得住。4.2 动态SLAM的典型失效模式与排查口诀根据综述内容和我自己的调参经验动态SLAM系统最常翻车的场景高度集中我整理成了一套排查口诀。第一个失效场景是动态物体长期静止一个行人站在画面里不动几何检验认为它满足静态假设于是它的特征点被保留下来一旦这个人开始移动系统就会经历一个短暂的瞬态混乱。应对方法是给地图点或特征点增加时间戳属性当某个区域的有效运动性一旦超过阈值就触发一次针对该区域的重检。第二个失效场景是遮挡边界误检行人从柱子后面走出来遮挡区域的背景点被误标记为动态而删除导致背景特征稀疏化。这类问题在几何检验中尤其常见因为遮挡边界处的深度/光度确实发生剧烈变化但原因并不是物体运动而是视差变化。排查口诀是先查遮挡再言动态当某个区域检测到大量动态点但动态物体本身轮廓不完整时优先考虑遮挡因素。第三个失效场景是高动态低特征重复区多人走动的场景彼此遮挡、纹理又重复特征匹配大量失败语义分割也把整个人群当成一个实例。这种极端情况下几乎所有方法都很难靠纯视觉扛住。我个人的体会是不要期望在这种序列里仍保持和静态场景一样的精度合理的做法是降低期望、减少优化窗口长度或者引入IMU/轮式里程计作为额外的先验来约束位姿视觉只负责修正漂移。第四个失效场景是长时间运行后的动态污染累积在长时间建图过程中动态物体偶尔被当成静态地图点混了进去这些点不多但一直在地图里之后每次运行都会在这个区域产生小的误差累积。排查口诀是经常回查旧图、定期清理幽灵点可以通过把当前帧观测与地图点投影残差做统计把那些长期处于大残差状态的地图点标记为可疑动态点在后台自动删除。5. 综述留给我印象最深的开放问题5.1 半静态与长时静态物体的时间一致性重返同一个场景时如何判断某个物体是一直静止还是上次在跑这次停了这个问题恰恰是长期自主导航系统的命门。以室内机器人巡检为例一次运行中办公室里人来人往椅子被拖来拖去系统把很多区域标记为动态并排除建图。第二次运行时椅子被搬到了另一处机器人需要快速意识到地图里这个位置不应该有椅子残影同时这条通道以前被标记动态但现在安全了。这本质上要求SLAM系统具备跨会话的记忆机制——一张地图不仅要记录几何和外观还要记录每个区域的动态状态及其时间演化。综述把它总结为动态物体的时间一致性建模问题。现有方案大多是对同一区域进行多次访问的统计分析但还没有一个优雅的统一框架。我自己觉得这里很可能是未来几年动态SLAM最有价值的突破口之一因为解决它的意义已经远超定位本身它牵涉到长期地图维护、环境变化检测和语义更新。5.2 先有分割还是先有位姿的循环依赖动态SLAM系统面对的另一个深层次悖论是要得到准确的位姿需要先知道哪些特征是动态的要知道哪些特征是动态的又需要相对准确的位姿来提供几何参照。综述里讨论的解决思路基本是交替优化先给一个粗略位姿然后在这个位姿下做动态性判读剔除动态点后再优化位姿如此迭代。这个方案在大多数场景有效但收敛性没有保证特别是初始位姿很差时判读结果也乱整个系统可能在两三个错误假设之间来回震荡。更根本的出路可能是把分类和位姿放进一个统一的概率图模型里同时求解但这样做的计算复杂度很高很难满足实时性要求。另一个方向是引入额外的传感器模态比如用事件相机的高时间分辨率捕捉微小运动或者用毫米波雷达直接获得某些区域的运动速度。这些都不依赖视觉位姿作为先决条件能在一定程度上解开循环。这让我想到一个类比这就像在旋涡里试图抓住自己头发把自己提起来。静态SLAM可以靠几何约束闭合成环动态SLAM里所有的闭环都被运动打断信息通路的相互依赖变强了。6. 总结一篇综述读完之后平时做SLAM的人能带走什么整篇综述读完我最想提醒大家的就是别把动态SLAM当成加一个分割网络这么简单。动态环境是一种系统级挑战从特征提取到后端优化、从地图表示到评测指标每个环节都被它重塑了一遍。对一个正在做实际系统的人来说这篇综述最有帮助的地方在于它明确给出了方法选择的边界纯几何方法轻量但脆弱纯学习方法依赖场景但效果直接语义几何融合是目前最稳妥的工程路线而时间和概率模型是未来的大概率方向。具体到动手阶段我的建议是先从语义提名、几何仲裁这个架构入手它模块化程度高便于替换不同的分割网络和几何检验策略。做的过程中一定要建立自己的动态评测序列和指标不要只盯着整体轨迹误差要细分到动态区域召回率和静态误删率。调试时优先处理半静态和遮挡这两个容易被忽视的场景它们往往才是实际部署时最磨人的地方。如果你也正在动态环境下做视觉SLAM或SfM我建议把这篇综述作为自己的技术地图每次碰到一个具体问题就回到分类框架里对号入座。我个人在读过之后最大的改变是思考动态问题时不再只想着做剔除而是开始考虑动态信息本身有没有价值——动态地图层、动态感知融合、动态物体轨迹预测这些下游能力也许才是动态SLAM真正的长期价值所在。