ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

真实世界建图的核心难点:SLAM中关键点、平方面与尺度漂移的深度解析

真实世界建图的核心难点:SLAM中关键点、平方面与尺度漂移的深度解析 最近在调一台巡检机器人绕着一间办公室跑了几圈建出来的地图用肉眼看已经很像样了可一旦让它从走廊这头走到那头、再折返回原点机器人自己反而开始犯迷糊它知道每个房间大概长什么样却不知道这些房间在全局地图里的相对位置有没有悄悄歪掉。这种问题就是做真实世界建图Real-World Mapping最让人头疼的地方。我在网上搜“mapping”相关资料的时候发现这个词挺有意思的。前几页里至少有一半内容跟今天要讲的东西没什么关系——有Java的mapping processor内部报错排查有RTOS场景里OS partition mapping的配置甚至还有PL mapping之类的东西。它们都叫Mapping但本质上是完全不同的领域。所以先把话说清楚这篇文章要聊的Real-World Mapping指的是让机器人或视觉系统在真实物理空间里行走、观察、理解环境并最终构建出一张能支撑定位与导航的空间地图。它的核心载体是SLAMSimultaneous Localization and Mapping同时定位与建图这一整套算法体系以及它在真实环境落地时躲不开的那些坑。这是Real-World Mapping系列的第一篇。我打算用一个很具体的切入点视觉SLAM里为什么有人用关键点有人用平方面square plane而像UcoSLAM这类把关键点和平方面融合在一起的做法又是怎么在真实世界里补齐彼此的短板。顺便会把坐标系、回环、尺度漂移这些概念用大白话拆开讲。如果你是正从仿真走向实体设备或者已经跑通了某个SLAM开源框架但总感觉地图不够可靠那这篇应该能帮上忙。1. 真实世界建图的难点在于地图必须“自洽且可用”1.1 建图不是画地图是回答“我在哪”很多人刚接触SLAM时会有一个直觉建图不就是在空间里测量一圈然后画出来么。但真做起来就会发现机器人和测量员有本质区别。人画一张建筑平面图可以站到外面俯瞰全局可以拿卷尺丈量可以用已知的参照物校核比例。但机器人没有这种“上帝视角”它只能通过传感器看到自己的局部视野一边走一边估计“我在哪”一边把新看到的区域拼到地图里。问题出在这个估计本身。机器人的定位需要地图而构建地图又依赖于定位。拿着相机走过一个陌生房间你每走一步都需要用一个“当前推测的位置”去把新观测到的墙、桌角、灯架放进地图但地图本身又是你判断位置的依据。这就是SLAM领域说的“鸡生蛋、蛋生鸡”问题。我常跟朋友打这个比方你闭着眼在一个大房间里边摸边走同时拿笔在纸上画这个房间的布局。每一步落笔都得先大概判断自己站在哪儿而判断的依据恰恰是你前面画的、可能已经有点歪的布局。真实世界建图就是这个过程的自动化版本只不过传感器的视野更窄环境的复杂程度更高。1.2 累积误差真实建图最大的敌人单次观测和单次位姿估计的误差其实很小通常以厘米甚至毫米计。但真实建图往往不是跑几步就结束的事情而是持续几分钟、几小时跨越几十米甚至几公里的过程。每一步的小误差都会叠加到后续所有步骤上这个现象叫累积漂移accumulated drift。举一个我实际见过的例子。一台设备在一条走廊里来回走了三遍如果不打开回环检测三遍走过的轨迹会在同一段位置上错开地图上的墙会重影、门的位置会在不同“层”里各出现一次。严重的场景里轨迹闭合处能差出好几米而这台设备的单帧位姿估计误差其实只有几厘米。换句话说地图不是“画歪了一点”而是整张图发生了缓慢的、不易察觉的空间扭曲。消解累积误差最有效的机制就是回环检测loop closure。当机器人绕了一圈回到曾经去过的地方系统识别出“这里以前来过”就会生成一个从当前位置指向历史位置的强约束后端优化通常是最小二乘图优化再把这个约束传遍整个位姿图把长期积累的漂移“拉回”到正确对齐的状态。所以你看好的建图系统不光是会画还得会认路、会纠错。回环的触发频率、约束的权重设置直接决定地图最终是清爽还是扭曲。1.3 动态物体与场景变化真实环境还有一个很麻烦的特点它不配合你做静态假设。人推门进来走廊的灯被打开树影在风里晃动其他机器人从你的相机前经过这些都是真实世界建图中几乎每天都会遇到的情况。动态物体如果不处理建出来的地图上会出现“鬼影”。人站在那里时特征点在那个位置人走开后同一个特征点又从另一个位置被观测到。系统无法判断这些点是不是同一点结果就是同一个物理位置在地图里存在多个互相冲突的点局部地图被“糊”成一片。处理动态点的通用思路是用多视图几何一致性做过滤一个三维空间点只有当它被足够多、足够分散的视角观测到时才允许进入地图。RANSAC这样的鲁棒估计方法在里面扮演了很好的角色它会在大量匹配点里找到主流几何关系把偏离主流关系的动态点当成外点剔除。但也要诚实地说纯几何一致性在动态物体占画面比例很大的时候效果会下降。比如人贴着镜头走过大面积动态特征可能反过来干扰几何模型。这个阶段往往需要更高层的语义信息进来帮一把比如人形检测、可通行区域分割。真实世界建图到后期早已不是单纯几何算法的问题。2. 坐标系与地图表示先搞明白机器人到底建了一张什么图2.1 三个坐标系贯穿所有建图过程真实世界建图虽然名字里有“真实世界”但机器人并不直接知道“东经多少度、北纬多少度”这种绝对位置。它建出来的图本质上是一个自洽坐标系里保存的一组空间关系。理解这一点对后面理解平方面路标很重要。视觉SLAM里常涉及几个坐标系世界坐标系或者叫地图坐标系是整个地图的基准传感器/本体坐标系随着机器人运动不断变化地图点、路标则作为世界坐标系下的静态位置。每一次视觉观测实际上是在传感器坐标系里测得某个特征点的位置再通过当前位姿变换到世界坐标系下。整个建图过程就是不断重复“观测 - 匹配 - 变换 - 优化”这个循环。我见过不少初学者在调算法时卡在“为什么我的地图坐标系看起来是乱的”这个问题上。其实大多数情况下不是算法崩了而是对坐标系的定义没理清。尤其是当你用二维码或者ArUco标记做路标时标记自带一个标记坐标系你需要明确它到世界坐标系的变换关系才能把标记观测变成真正的地图约束。2.2 单目的尺度问题一张“没有尺度的图”为什么危险单目视觉SLAM有个经典坑特征点只能提供相对几何关系缺少绝对尺度。同样是走一段走廊相机轨迹和地图点如果统一放大10倍在纯视觉的投影几何里几乎看不出区别。换句话说单目相机建出来的地图形状是对的但尺寸是“相对尺寸”不是真实的米制尺寸。这对真实世界建图是致命的。因为真实建图最终要服务于测量、导航、抓取这类物理交互任务。导航程序需要知道“前方通道宽度能否让机器人通过”抓取程序需要知道“目标物体的三维尺寸是否匹配夹具”这些都必须建立在绝对尺度的地图上。打破尺度不确定性的方法很直接引入一个已知物理尺寸的参照物。平方面/ArUco标记正好提供这一点。方形标记的边长是已知的比如0.15米那么四个角点在标记坐标系里的坐标就是确定的。相机观测到标记后通过PnPPerspective-n-Point求解就能直接恢复出带绝对尺度的相机位姿。这也是为什么后面我们要专门聊UcoSLAM——它大量利用了平方面的这个特性。2.3 地图表示的取舍稀疏、半稠密与稠密真实应用对地图的需求不总是一样的。做路径规划关心的是可通行区域做避障关心的是障碍物表面做尺寸测量关心的是精确的三维点位置。不同任务需要不同形态的地图单一表示往往不够用。经典的做法是三种地图共存特征点地图sparse map负责定位几十上百个三维点足够让相机完成匹配和位姿解算速度快、内存小占据栅格地图occupancy grid map负责导航把空间切成格子标记“有障碍”“无障碍”“未知”这是2D激光雷达导航时代就普及的形式八叉树地图Octomap则用概率更新把稠密点云转成可查询的三维占据信息适合机械臂避障。在建图系统设计层面你通常需要先想清楚“这张图给谁用”。给定位模块用的地图追求的是特征分布均匀、可重复观测给人看的地图追求的是视觉完整、没有空洞给规划器用的地图追求的是障碍物边界清晰。UcoSLAM这类方案吸引人的地方在于它同时维护关键点地图和平方面地图不同表达方式服务不同的用途在系统层面做到了“组合拳”。这给我们自己的建图方案设计提供了很好的参考不要试图用一种数据结构解决所有问题而是把不同表示放在一起让它们各司其职。3. 关键点与平方面UcoSLAM如何把两类路标拧成一股绳3.1 特征点法为什么撑起了视觉SLAM的半边天过去十几年视觉SLAM最主流的技术路线是特征点法。ORB、SIFT、SuperPoint这些提取器会在图像里找到角点、斑点、边缘交点等显著结构为每个点生成一段描述子让算法在后续帧里认出同一物理点。特征点的优势非常明显匹配量小、对光照和视角有一定的耐受性、天然适合帧间位姿估计和回环检测。以ORB为例它用Oriented FAST检测关键点再用Rotated BRIEF计算带旋转不变性的二进制描述子配合图像金字塔实现尺度不变性。实际在机器人上跑的时候纯特征点法的计算负担并不大CPU上也能跑得很流畅这也是它成为各种开源SLAM框架默认选择的原因。但特征点也有自己的软肋。它遇到重复纹理区域时会“脸盲”一排长一样的货架横梁提取出来的特征点描述子高度相似匹配时很容易错位遇到白墙这类无纹理区域则根本没有足够的关键点可以提取。这两种场景在真实世界都极其常见尤其是仓库和楼道。3.2 平方面/ArUco人为布置的几何锚点平方面square plane这个说法在视觉SLAM语境里通常指ArUCo这类方形平面标记。ArUco标记由黑色边框和内部二进制矩阵构成边框负责快速检测内部编码负责提供唯一的ID。只要图像中检测到一个ArUco标记系统就能根据预先知道的物理尺寸比如边长0.15米结合四个角点的投影位置直接解算出标记平面在相机坐标系下的位姿。这意味着平方面在三个维度上优于普通特征点第一它是“有身份”的每个标记的ID是唯一的不会像特征点那样匹配错误第二它是“带尺度”的物理尺寸已知给系统提供了真实的绝对尺度第三它是“强约束”的一个平面就能提供非常丰富的几何约束四个角点加上平面法向几乎把相机和标记之间的相对位姿钉死了。一个生动的类比是普通特征点像素描里的连续灰线能勾勒出轮廓但缺少一个统一的尺寸基准平方面像你在画纸边缘贴的一把刻度尺随时提醒你“这条线到底画多长”。在长走廊、集装箱、手术室这类结构化程度高的场景里人工布置少量ArUco标记就能给整套建图系统提供极强的时间一致性约束。3.3 融合而不是替换UcoSLAM的双地图思想如果平方面这么好为什么大家不干脆全部用ArUco建图因为平方面也有代价它需要人工布置覆盖不了整个环境而且当标记离镜头太远、角度太斜、或被遮挡时检测就失效了。所以更合理的思路是把关键点和平方面放在同一个框架里各管一头。UcoSLAM的做法概括起来就是维护一套双地图机制。公开资料和论文里可以看到它的核心理念一边是用关键点构成的常规视觉地图负责连续跟踪、帧间运动估计和大多数情况下的定位另一边是平方面构成的全局路标地图负责提供带有绝对尺度的强约束。相机每帧观测时系统会同时处理这两种观测能看见平面标记就更新平方面约束能匹配到关键点就更新点约束。后端优化时这两类约束共同进入因子图参与位姿和路标位置的联合优化。从网上能找到的技术报道和开源使用情况来看UcoSLAM对平方面和其他传感器信息的结合做得相当灵活。关键帧的选取、local map的维护、回环检测这些常规模块它都做了配置项支持。特别是在同一个场景里它的平方面地图可以兼容不同ID的标记这使得长期运行或跨多次建图时新布置的标记可以增量并入地图而不是重新构建一切。这类融合思想其实已经超出了“用A替代B”的范畴变成“在什么条件下选谁”的决策问题。实现层面最简单的策略是如果当前帧检测到的平方面足够多就优先信任平方面约束如果平方面检测不足就退回到关键点跟踪。稍微进阶一点是把两类约束按照置信度建模同时丢进优化器里让求解器自己权衡。后者的鲁棒性更好前期标定和调参工作量也更大。3.4 直观效果一个室内场景的实测对比把思路落到实际场景来看更有说服力。假设你要为一个室内仓储环境建图环境里有一些货架、少量设备、大片白墙、地砖纹理很弱走廊重复性强。纯关键点系统在这样的环境里会表现得很挣扎。纹理稀疏区提取不到足够特征相机位姿估计被迫依赖IMU积分或匀速运动模型几秒钟内就会开始漂移重复纹理区又会出现大量误匹配地图里同一面墙可能出现“多个版本”。整体结果就是地图虽然能看但边缘错位、尺寸不可靠长期运行后更明显。纯ArUco系统则遇到另一个问题你要保证相机视野里始终有足够多的标记否则系统立刻失去定位依据。这意味着你得在环境的每个位置都贴标记工作量巨大而且室外或非结构化场景基本行不通。把两者融合之后效果就务实得多了。特征丰富的区域关键点地图正常发挥作用进入白墙走廊这类贫纹理区只需要在转角、门口等几个关键位置贴上ArUco标记平方面就能接管定位阻止漂移积累。整个系统从“需要处处有特征”变成“只需要在关键节点有锚点”这在工程上是一个巨大的可行性提升。4. 传感器选型与融合配置真实世界的建图从来不是单打独斗4.1 从单目到RGB-D传感器的选择决定地图的“底子”聊完算法层再往上游看硬件选型。同一个UcoSLAM系统你接单目、双目还是RGB-D建图结果和鲁棒性差别很大。单目相机是成本最低的方案一个普通工业相机或者手机摄像头就可以。它的缺点是启动时需要初始化深度而且长期运行中的尺度漂移需要靠回环或外部参照物来不断“校正”。这也是为什么平方面标记对单目系统特别有价值——你在墙上贴一个已知尺寸的ArUco标记就相当于给系统持续输送绝对尺度信息尺度漂移会被明显压制。双目相机通过左右眼的视差直接计算深度不需要初始化尺度在标定完成后就是确定的。但它的有效测距范围受到基线长度的限制基线越长远处深度越准结构体积也越大。对无人机、AR眼镜这类对体积敏感的设备来说双目的物理极限很快就能摸到。RGB-D相机比如Kinect、RealSense系列在室内中近距离表现最轻松像素级深度直接提供稠密信息室内建图的门槛大幅降低。但它在强光、户外和远距离场景下效果衰减很快而且多台设备同时使用时可能互相干扰。选型时一定要先想清楚使用场景仓储AGV在室内用RGB-D很合适户外巡检无人机更稳妥的做法是双目融合IMU长期运行的室外机器人则要考虑加GPS这类绝对信息源。4.2 IMU短时运动估计的救火队员不管选哪种视觉传感器IMU惯性测量单元几乎都是标配。IMU以很高的频率输出加速度和角速度能对短时间内的运动做出预测。视觉系统在快速转动、画面被遮挡、光照突变的瞬间往往会短暂失效这时候IMU提供的预测值可以填补空白保证系统的状态估计连续。你可以把IMU理解成一个“闭着眼也能感觉到自己在动的感官”。它的问题是传感器噪声会持续积分分数秒内还好时间一长就漂得离谱所以它不能单独用来建图。视觉和IMU结合的主流做法是紧耦合把IMU的预积分结果作为帧间约束放进优化器和视觉重投影误差一起联合求解。你会发现融合了IMU之后系统对快速运动、纯旋转、短暂遮挡的容忍度大幅提高这套组合在无人机、手持设备、以及需要频繁转向的机器人上几乎是标配。4.3 绝对信息源GPS、海拔计、磁力计视觉IMU组合能解决短期估计的稳定性但解决不了长期大范围下的累积漂移。这时候就需要绝对信息源出场。GPS在开阔的室外场景里提供全局位置约束让系统每隔一段时间就把估计结果拉回真实位置附近海拔计提供高度约束磁力计提供航向参考。它们都不是高精度的传感器但的好处是误差有界恰好弥补视觉长期漂移无界的缺点。室内环境下GPS不可用问题就得换个思路。要么用UWB室内定位系统做绝对约束要么用预先布置的ArUco标记本质上都是“人工基准站”。我在实际项目中的经验是不必追求绝对信息源覆盖整个环境只需要在关键路径节点、转角、长期漂移的“高风险区”设置基准就能显著改善整体地图的一致性。这里有一个很实用的选型原则先问自己“我的地图误差上限是多少”。如果允许5厘米误差那视觉相对定位少量的绝对锚点就够了如果要求全局1厘米以内的精度那你需要铺设更高密度的绝对测量手段比如全站仪或高精度UWB算法再聪明也弥补不了传感器的物理上限。4.4 UcoSLAM可接入的传感器组合从UcoSLAM论文和开源仓库披露的情况看它的输入接口设计得很宽支持单目、双目、RGB-D同时可以融合IMU甚至GPS这类外部观测。这意味着你不需要为了用平方面路标而被迫采购特定硬件手头有什么传感器组合都可以拿它来跑。配置思路上常见组合大致可以这么分室内机器人用RGB-DIMU平方面人工布设在货架和门框上建图精度和鲁棒性都比较好户外无人机用双目IMU平方面主要布设在起点、充电站、降落坪这类关键位置用于返航时的精度保障移动测量推车用单目IMU平方面用来抑制长距离尺度漂移成本可以压得很低。真正到具体项目里我得提醒一句不要一上来就追求所有传感器全开先把视觉和平方面跑顺再逐步加入IMU、GPS一步步消解变量出问题的时候才能快速定位。5. 真实环境实测中的翻车现场与调参思路5.1 场景一白墙走廊——纹理缺失时的“裸奔”建图机器人最怕的不是夜晚是白墙。白色的、没有任何挂件的墙面在特征点提取器眼里就是一片空白。ORB在整张画面可能只提出十几二十个点根本不足以支撑稳定的六自由度位姿估计。更麻烦的是走廊通常狭长相机看到的画面有很大区域是白墙剩下的一点地面纹理还因为反光一变再变。我处理过这类项目最直接有效的手段是人工布置标记。不需要贴满只需要在走廊的转角、岔路口、每间隔五六米的一面墙上贴一个ArUco标记整个走廊的建图稳定性立刻不一样。如果实在不想贴纸也可以试着依赖地脚线和地面拼缝这类自然的弱纹理结构但它们的检测可靠性远不如人为设计的标记因为光照一变这些弱纹理可能就隐形了。另外降低特征提取阈值可以“硬挤出”一些弱纹理点但这会显著增加误匹配和噪声我只建议在短期实验中使用不推荐作为长期运行的方案。5.2 场景二重复纹理——货架、地砖、天花板重复纹理是另一个大坑典型场景是仓储货架区一整排货架的颜色、形状、间隔完全一致ORB提取出来的特征点描述子几乎一样。算法在匹配时并不知道自己看的是第3个货架的横梁还是第5个货架的横梁系统性误匹配会把地图搞成一团乱麻。解决重复纹理问题的突破口就是打破周期性。平方面在这里的优势很明显贴一个ID唯一的ArUco标记系统就能确定自己看的是“哪一个”货架而不是被一堆相似特征点带偏。实际操作中我建议在每个周期单元比如每组货架的端头、拐角位置各布设一个不同ID的标记把周期性区域“锚定”成可区分区域。如果双目光流和IMU可用它们提供的连续帧间约束也能起到一定的“防跳变”作用让匹配不至于直接跳到下一个周期单元上去。5.3 场景三动态行人——地图里的“鬼影”前面提到过动态物体的“鬼影”问题这里再多说几句实操层面的教训。最原始的做法是在建图时尽量避免行人在视野里出现比如深夜施工、在封闭区域建图。但很多现场做不到。退一步建图后遗症不是“行人进了图”而是“行人特征被当作静态特征后续建图时反复被错误观测”。现代SLAM系统在处理动态点上已经有了不少手段。视觉帧间几何验证是底线一个特征点如果它偏离主流视差模型太远把它标成动态候选不为它建立地图点。更强的做法是引入语义分割网络直接把人的区域mask掉不提取那里的特征点。后者的计算开销大对前端性能敏感的设备不太友好但效果立竿见影。我自己在部署这类系统时会同时保留两套策略先用几何验证过滤大部分动态点再选择性开启语义mask作为高动态复杂场景的加强手段。5.4 场景四长时间大范围——尺度漂移与回环依赖跑一个小时以上的建图任务你会发现地图局部看起来始终正常但整体慢慢在“扭”。这是因为系统在很长一段时间内没有回环误差在轨迹方向上顺着走无法得到反向修正。回环检测一旦成功图优化会释放强约束把历史轨迹拉回来但前提是回环检测必须还真能触发。如果环境变化太大——白天和晚上光线完全不同视角差太多——回环检测可能识别不出那是同一个地方。针对这种场景最有用的策略是“主动打断漂移”。别让系统一口气跑完全程而是在每个片区结束的地方布置一些可识别的路标比如ArUco标记让系统在跨越片区边界的时候有一个确定的“重新校准点”。一旦片区间建立了绝对约束后面的漂移就没法往前传了。这个思路跟GPS差分站布设非常像本质上都是在误差传播路径上设置“止损点”。5.5 调参经验集合最后整理一份我自己的调参顺序表按“先标定、再小场景闭环、再大场景验证”的顺序走能省掉大量返工。参数常见范围影响我的经验特征提取数量500-2000太多则计算量大且误匹配多核心问题不是多而是分布均匀特征提取阈值视传感器而定决定低纹理区的检测数量过紧白墙区域会跟丢过松噪声爆炸最小匹配距离阈值视视角和场景动态决定帧间跟踪的宽松度过紧快速运动会跟丢过松匹配会错乱关键帧间距视轨迹弯曲程度影响地图密度和回环识别转弯、进入新区域时密度要加大ArUco标记尺寸0.1m - 1.0m决定尺度解算精度同一场景里尽量统一尺寸布设要正对相机IMU采样率100Hz - 400Hz影响快速运动预测至少要跟视觉帧率差一个数量级先说标定。相机内参、畸变、相机-IMU外参这些如果不准后面所有约束都在往错误方向上推算法代码写得再漂亮也没用。ArUco标记的物理尺寸要用游标卡尺量别只相信打印参数打印机的缩放误差在实际项目中真的踩到过。再说到建小场景。我会先建一个5米乘5米的房间跑通闭环确认地图没有明显错位再往大场景扩展。大场景建图时我习惯每完成一个片区就暂停复盘一次轨迹和地图而不是等工作全部跑完再检查因为真到那时已经很难定位是哪一段开始飘了。为了能让问题可复现我强烈建议从项目第一天就把完整的传感器数据用rosbag或自定义格式记录下来。调参时只需要回放同一段数据对比不同参数下的建图结果而不用每次都在现场折腾。你会发现很多看似“偶尔出现”的漂移问题其实是确定性触发的只是触发条件太隐蔽没有反复回放很难发现。还有一点容易忽略不同光照条件下同一场景建出来的地图会有差异。如果系统要在夜间和白天都运行最好分别建图或者在建图时加一些光照增强预处理。否则你白天建好的地图晚上跑起来定位成功率可能会直线下降。真实世界就是这样光线、湿度、行人、震动每个变量都会在地图上留下痕迹能不能hold住这些变量才是真实世界建图能力的分水岭。UcoSLAM给我的启发是它不试图用某一种特征解决所有问题而是把关键点的连续追踪能力和平方面的全局硬约束能力放在一个框架里各司其职。你不需要在每个地方都贴满标记只需要在关键节点放上几个“锚”整个地图就有了骨架。这种思路放到任何传感器方案里都成立。Part 1就先到这里。下一篇我打算把UcoSLAM在真实场景下的标定、构建与导出流程完整跑一遍用实际数据对比有回环和没有回环时地图的变形程度重点把“平面标记布置的密度到底多少才够”这个问题给量化出来。如果你也在做类似的项目欢迎在评论区聊聊你踩过的坑。
返回列表