多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

无标记多机协同SLAM:基于视觉的机器人检测与6D位姿估计实战

无标记多机协同SLAM:基于视觉的机器人检测与6D位姿估计实战 1. 项目缘起当一群机器人“看不见”彼此时在机器人研究领域多机协同SLAM同步定位与地图构建一直是个充满魅力的方向。想象一下一个仓库里几台移动机器人需要协作搬运货物或者一个灾难现场多台搜救机器人需要协同绘制地图。理想情况下它们各自搭载传感器如激光雷达、摄像头一边构建环境地图一边确定自身在地图中的位置还能实时感知到队友的位置从而实现高效、无碰撞的协作。但这里有个很现实的问题它们怎么“看见”并认出彼此传统的多机SLAM方案往往依赖于预先设定的、显式的“标记”。比如给每台机器人贴上醒目的二维码如AprilTag、特殊的反光板或者让它们主动发射特定频率的无线信号如UWB。这些方法确实有效但它们引入了额外的硬件依赖和部署成本。二维码可能被遮挡、污损反光板需要特定光照UWB基站需要提前布置。更重要的是这些“标记”让机器人显得不那么“原生”——它们是为了被识别而刻意添加的“外挂”。于是“无标记”Markerless的机器人检测与位姿估计就成了一个极具吸引力的研究方向。它试图让机器人仅凭自身的视觉传感器如RGB或RGB-D相机像人眼一样在动态、复杂的环境中实时识别出另一个移动的机器人并精确估计其三维位置和三维朝向合称6D位姿。这个能力正是实现真正灵活、自适应多机协同SLAM的关键拼图。没有它机器人群体要么是“盲”的容易相撞要么就得依赖那些不那么优雅的外部标记。我最近就在一个多机器人编队项目中深入实践了这套技术栈。我们的目标是让三台搭载Intel RealSense D435i相机的移动机器人在一个未知的室内办公环境中实现协同探索与建图。核心挑战就是如何让它们在不使用任何额外标记物的情况下稳定、准确地相互感知。这个过程踩了不少坑也积累了一些心得接下来我就把这个从理论到落地的完整链条拆开揉碎了讲清楚。2. 技术栈拆解从“是什么”到“为什么选它”要实现“Markerless Robot Detection and 6D Pose Estimation for Multi-Agent SLAM”我们需要串联起几个核心模块。这不像调用一个现成的API那么简单而是一个需要精心设计和选型的系统工程。2.1 视觉感知前端检测与分割第一步是从相机的一帧图像中把“机器人”这个目标找出来。既然是“无标记”我们就不能依赖特定的图案而需要依靠机器人的外观特征。这里主要有两条技术路径基于深度学习的目标检测这是目前的主流和首选。你可以使用YOLO系列如YOLOv8、Faster R-CNN或DETR等模型。我们需要收集或制作一个包含我们目标机器人比如Clearpath Husky、TurtleBot3等的图像数据集进行标注和训练。模型会输出图像中机器人的边界框Bounding Box。为什么选它速度快尤其是YOLO精度高能直接给出目标位置非常适合实时系统。对于外观特征明显的机器人效果很好。实操注意点数据数据数据你需要在不同光照、不同角度、不同遮挡程度下拍摄机器人的图片。如果机器人有多款最好一起训练。轻量化模型如YOLOv8n是部署在机器人嵌入式平台上的关键。实例分割比目标检测更进一步它不仅能框出机器人还能精确地分割出机器人的每一个像素Mask。代表模型是Mask R-CNN。为什么选它分割提供的像素级掩码对于后续的6D位姿估计有巨大好处。我们可以只对属于机器人的像素点进行后续处理极大地排除了背景干扰。实操注意点分割模型的训练和推理开销都比单纯检测大。标注成本也更高需要多边形或像素级标注。在实际系统中我们往往采用一个折中方案先用轻量级检测模型快速框出目标如果检测框置信度高再对框内区域进行分割或直接用于后续步骤。在我们的项目中由于机器人平台算力有限我们选择了YOLOv8n进行检测。我们先在服务器上用约5000张包含目标机器人的图片在实验室、走廊、有杂物环境等场景下拍摄训练了模型然后使用TensorRT将模型转换并部署到机器人的Jetson Xavier NX上实现了约30FPS的实时检测。2.2 6D位姿估计核心如何从2D到3D检测框告诉我们机器人在图像中的大概区域但SLAM需要的是机器人在三维世界中的精确位置X, Y, Z和朝向偏航Yaw俯仰Pitch横滚Roll。这就是6D位姿估计要解决的问题。对于无标记情况主流方法又可以分为两类基于关键点的方法思路预先定义机器人3D模型上的一组“关键点”例如机器人的四个角点、顶面中心、激光雷达安装点等。在推理时模型如PVNet, PVN3D不仅检测物体还预测图像中这些关键点的2D位置。然后通过PnPPerspective-n-Point算法结合已知的机器人3D关键点坐标和相机内参求解出机器人的6D位姿。为什么选它物理意义清晰精度较高PnP求解是一个成熟的优化问题。对于刚体机器人效果稳定。实操坑点关键点的定义和3D坐标测量必须非常精确任何误差都会直接传递到位姿结果中。此外在严重遮挡下关键点预测可能出错导致PnP求解失败。直接回归法思路让神经网络端到端地直接输出6D位姿参数。通常姿态部分旋转会表示为四元数Quaternion或旋转矩阵的9个元素。为什么不常选它实现简单。但问题也很明显旋转空间的非线性导致直接回归很难模型泛化性差对训练数据分布敏感精度通常不如基于几何约束的方法。基于稠密对应的方法当前研究热点思路为机器人3D模型表面的每一个点预测其在图像中对应像素的2D坐标或者反过来为图像中属于机器人的每一个像素预测其在机器人3D模型上的3D坐标。然后通过类似PnP的优化或投票机制得到位姿。DenseFusion, PVN3D等都属于这类。为什么选它利用了更多的像素信息理论上对遮挡更鲁棒精度潜力更高。实操心得这类方法通常需要RGB-D数据彩色图深度图。RealSense D435i这类相机正好提供。我们项目最终采用了改进版的PVN3D思路。我们先使用检测框裁剪出RGB和深度图区域然后用一个网络分支预测每个前景像素在机器人归一化3D模型中的坐标另一个分支预测语义标签。最后通过一个投票层得到位姿。这种方法在部分遮挡时比如只看到机器人前半部分表现远好于仅用几个关键点的方法。2.3 多机SLAM后端融合位姿信息如何用起来估计出队友机器人的6D位姿后这只是一个相对测量值相对于当前观测机器人的相机坐标系。多机SLAM的核心在于如何将这些分散的、带噪声的相对观测融合到一个全局一致的地图和位姿估计中。这通常依赖于多机器人状态估计框架例如基于滤波器的如扩展卡尔曼滤波器EKF或基于优化的如位姿图优化Pose Graph Optimization。坐标变换链这是最容易出错的一步。假设机器人A观测到了机器人B。我们有机器人A的相机观测到的机器人B的6D位姿T_cameraA_to_robotB。我们需要知道相机固定在机器人A身上的安装位姿T_robotA_to_cameraA这是一个固定的外参需要提前标定。那么机器人A坐标系下看到的机器人B的位姿为T_robotA_to_robotB T_robotA_to_cameraA * T_cameraA_to_robotB。最后如果机器人A知道自己在全局地图中的位姿T_world_to_robotA这是它自己SLAM的结果那么就能估算出机器人B在全局地图中的位姿T_world_to_robotB_est T_world_to_robotA * T_robotA_to_robotB。数据关联与融合机器人B自己也有一个SLAM系统输出它认为的自身全局位姿T_world_to_robotB_slam。现在对于机器人B的位姿我们有了两个信息源它自己的SLAM估计和来自机器人A的视觉观测估计。这两个估计通常不一致。后端优化器如Ceres Solver, g2o的作用就是构建一个优化问题。它以所有机器人的轨迹一系列位姿和地图点为优化变量以机器人自身的里程计/激光观测、以及机器人之间的视觉相对位姿观测为约束条件最小化整体误差。当机器人A看到B时就在A和B对应时刻的位姿节点之间添加一条边Edge边的观测值就是我们计算出的T_robotA_to_robotB信息矩阵则反映了这个视觉观测的置信度比如检测框的置信度、位姿估计的不确定性可以转化为信息矩阵。注意这里的信息矩阵设置是个经验活。视觉观测的噪声模型复杂我们通常根据经验将平移分量的不确定性设得比旋转分量大一些并且与观测距离成正比距离越远估计越不准。这个权重直接影响优化结果中“相信谁更多一点”。在我们的系统中我们采用了分布式位姿图优化。每个机器人运行自己的激光SLAM如Cartographer生成局部位姿图同时将检测到的队友相对位姿作为“闭环检测”约束通过一个轻量级的通信层ROS2的DDS与其他机器人交换这些约束异步地进行全局优化。这样即使某个机器人短暂失联系统也能在其回归后快速修正轨迹。3. 实战链路与避坑指南理论很美好但把这一套跑通每一步都有坑。下面我以我们的项目为例梳理从数据准备到系统集成的完整流程和关键陷阱。3.1 数据采集与模型训练魔鬼在细节里步骤1机器人3D模型准备如果你采用基于关键点或稠密对应的方法一个精确的机器人3D模型通常是.ply或.stl格式的网格文件是必须的。最好能从机器人制造商那里获得CAD模型。如果没有可以使用三维扫描仪重建但精度会打折扣。拿到模型后你需要定义一个与模型固联的本体坐标系Body Frame。通常以机器人的几何中心或驱动轮中心为原点前进方向为X轴向左为Y轴向上为Z轴。这个定义必须贯穿整个项目始终。步骤2定义关键点或采样点对于关键点方法在模型上选取8-12个易于在图像中辨识且分布均匀的点如顶角、突出传感器边缘并精确记录它们在本体坐标系下的3D坐标。对于稠密对应方法则需要在模型表面均匀采样成千上万个点形成点云。步骤3合成与真实数据混合纯用真实图像标注训练成本太高。主流做法是使用BlenderPyBullet等工具进行大量合成数据渲染。你可以随机设置机器人位姿、相机位姿、光照、背景使用COCO等数据集图片并自动生成精确的2D检测框、分割掩码、关键点2D投影或每个像素的3D模型坐标标签。坑点1领域鸿沟合成数据看起来假模型可能学不到真实世界的纹理、光照变化。必须进行领域随机化随机化机器人纹理贴图、地面材质、光照颜色和强度、加入运动模糊、噪声等。坑点2数据分布不要只渲染“完美”的视角。要多生成机器人被部分遮挡、只露出一半、极端光照过曝、阴影、运动模糊的图片。这能极大提升模型的鲁棒性。 我们的策略是生成10万张合成数据预训练再用2000张精心标注的真实数据覆盖各种挑战场景进行微调Fine-tuning。步骤4模型训练与部署使用PyTorch或TensorFlow训练你的检测/位姿估计网络。训练时损失函数的设计至关重要。对于位姿估计通常结合分类损失是什么物体、平移损失L1或L2距离和旋转损失如基于四元数的角距离。坑点3旋转表示直接回归旋转矩阵或欧拉角非常困难。推荐使用四元数并归一化或者使用6D表示法Rotation Matrix的6个元素。后者在最近的研究中表现出更好的性质。 训练好后使用TensorRT或ONNX Runtime将模型转换为适合边缘设备如Jetson, Raspberry Pi的格式并测试推理速度是否满足实时性要求通常10Hz。3.2 系统集成与标定误差的来源与驯服环节1相机-机器人外参标定这是整个系统精度的基石。T_robot_to_camera必须精确标定。我们使用经典的手眼标定方法AXXB。在机器人前方放置一个棋盘格标定板。让机器人移动到多个至少15个不同位姿在每个位姿下记录机器人底盘里程计给出的T_base_to_worldA。用相机识别棋盘格计算出T_camera_to_checkerboardB。通过求解A * X X * B方程组得到外参X T_base_to_camera。关键技巧机器人移动的位姿变化要足够大既有旋转也有平移标定板要在相机视野内清晰可见。完成后必须通过重投影误差来验证标定结果。我们使用AprilTag板代替棋盘格因为检测更稳定精度更高。环节2时间同步机器人A的相机在时刻t拍摄图像并检测到B同时机器人A的SLAM系统输出它在时刻t的位姿。这两个数据必须时间对齐。我们使用ROS2的message_filters模块中的ApproximateTime策略对图像消息和里程计消息进行近似时间同步。虽然存在毫秒级延迟但对于低速移动的机器人影响在可接受范围内。环节3观测不确定性估计不能把所有视觉观测都同等对待。一个在图像边缘、被严重遮挡、检测分数低的观测其位姿估计结果肯定不可靠。我们需要量化这个不确定性并传递给后端优化器。简单方法用目标检测的置信度confidence score作为一个权重因子。或者根据检测框的大小和图像位置经验性地给一个固定协方差矩阵。进阶方法训练一个不确定性估计网络或者使用位姿估计算法本身提供的残差信息。在我们的实践中我们采用了一种启发式方法不确定性协方差矩阵的缩放因子与(1/confidence_score) * (estimated_distance)^2成正比。距离越远不确定性呈平方增长。3.3 多机SLAM后端实现要点我们基于ROS2和Cartographer构建了分布式多机SLAM系统。每台机器人独立运行一个Cartographer实例构建局部子图Submap。视觉检测模块作为ROS2节点运行当检测到队友时发布一个自定义的RelativePoseStamped消息包含观测者ID机器人A被观测者ID机器人B时间戳相对位姿T_robotA_to_robotB观测的信息矩阵协方差矩阵的逆一个中央优化节点也可以分布式部署订阅所有机器人的位姿话题和相对位姿观测话题。它维护一个全局位姿图。当收到新的相对位姿观测时就在对应时间戳附近的位姿节点间添加约束。我们设置了一个优化触发器每累积10个新的跨机器人观测或者每过5秒就触发一次全局位姿图优化。优化完成后将修正后的全局位姿广播给各机器人各机器人据此调整自己的局部轨迹和地图。通信挑战我们最初使用ROS1的TCP通信在多机WiFi网络不稳定时经常丢包。切换到ROS2 DDS采用FastRTPS后基于UDP的发现和数据分发机制更适应动态网络可靠性显著提升。初始化问题系统启动时各机器人位姿图之间没有约束优化无法进行。我们采用了一个简单有效的策略让机器人在开始时聚集在一个可视范围内通过相互观测快速建立初始连接。也可以引入一个短暂的、基于UWB的绝对位置初始化阶段。4. 性能评估与典型问题排查一套系统搭起来能不能用好不好用需要量化评估。我们设计了室内和走廊两个场景让两台机器人沿“8”字形和矩形轨迹运动评估了以下指标检测召回率与精度在测试集上我们的YOLOv8n模型达到了95%的mAP。但在实际动态场景中当机器人快速转向导致运动模糊或处于强光背光环境时召回率会下降到80%左右。对策在图像送入网络前增加了自适应直方图均衡化CLAHE预处理对背光场景有改善。位姿估计精度这是核心指标。我们使用Vicon运动捕捉系统提供毫米级精度的真值。评估相对位姿误差RPE和绝对轨迹误差ATE。平移误差在3米距离内平均误差约5-8厘米标准差3厘米。距离越近误差越小。旋转误差偏航角Yaw平均误差约3-5度。俯仰和横滚角误差更大因为从单目RGB-D图像中估计这些角度本身就很模糊。发现误差不是均匀的。当机器人被观测到侧面特征更丰富时精度高于被观测到正面或背面。改进我们在位姿估计网络的特征提取部分加入了注意力机制SE Block让网络更关注纹理丰富的区域旋转精度提升了约15%。多机SLAM整体精度对比仅使用单机SLAM和融合了视觉相互观测的多机SLAM。在20m x 20m的封闭走廊循环测试中多机系统的绝对轨迹误差ATE降低了约40%。更重要的是当一台机器人短暂进入一个特征匮乏的长走廊“退化环境”时其自身SLAM漂移加剧但通过另一台在特征丰富区域的机器人的观测其位姿能被及时纠正避免了彻底迷失。典型问题排查清单问题检测时有时无极不稳定。检查相机帧率是否稳定网络推理时间是否波动过大检查机器人移动速度过快会导致运动模糊。尝试在推理前对图像进行高斯模糊或中值滤波有时反而能提升对模糊图像的检测鲁棒性。问题位姿估计值跳变严重。检查首先检查相机内参标定是否准确。然后检查3D机器人模型尺寸是否输入正确单位是米还是毫米。接着检查PnP求解器如OpenCV的solvePnP使用的算法推荐SOLVEPNP_ITERATIVESOLVEPNP_REFINE和初始值。如果使用稠密对应方法检查预测的3D模型坐标是否归一化到正确范围。问题多机SLAM优化后地图出现明显错位或扭曲。检查这是最复杂的情况。首先逐一验证每一条视觉观测约束。将观测到的相对位姿与当前优化变量中的两个机器人位姿计算出的相对位姿进行对比计算残差。找出残差巨大的“离群观测”。往往是这些观测把图“拉歪”了。对策引入鲁棒核函数如Huber核。在优化问题中它对误差大的边给予更小的权重而不是完全丢弃能有效抑制离群值的影响。我们使用了Ceres Solver中的LossFunction *huber_loss new ceres::HuberLoss(0.5);。检查时间同步是否准确错误的时间关联会导致把t1时刻的观测错误地关联到t2时刻的位姿上。终极调试手段将优化过程可视化。把机器人轨迹节点、视觉观测边、激光闭环检测边都画出来。观察是哪条“坏边”导致了图的扭曲。这是一个非常有效的调试方法。5. 进阶思考与未来方向实现基础功能后我们开始思考如何让系统更智能、更鲁棒。这里分享几个我们正在探索或认为有价值的方向1. 动态目标建模与运动预测目前的系统将队友机器人视为静态刚体进行“快照”式观测。但实际上队友是运动的。这会导致“观测滞后”问题当我处理完图像算出你的位姿时你已经移动了。一个思路是引入运动模型。假设队友机器人是匀速运动我们可以用卡尔曼滤波器来预测它在当前时刻的可能位姿并将视觉观测作为更新。更高级的做法是将队友的状态位置、速度也作为优化变量加入到后端位姿图中进行联合优化。2. 异质机器人与未知模型我们的项目假设所有机器人的3D模型是已知的。但在实际应用中你可能需要与不同型号、甚至未知外观的机器人协作。这就引向了类别级Category-Level6D位姿估计和模型检索的研究。例如训练一个网络不仅能估计位姿还能估计目标相对于其类别标准模型的尺寸变化Deformation。或者先检测并粗略分类机器人如“差速轮式底盘”然后从一个预设的模型库中检索一个最接近的3D模型用于位姿估计。3. 纯视觉SLAM与检测的紧耦合我们现在是“先检测/位姿估计后SLAM优化”的松耦合流程。一个更优雅的方案是紧耦合将机器人检测和位姿估计直接作为一个约束项与视觉SLAM的特征点重投影误差、IMU预积分误差等一起放在同一个非线性优化框架中求解。这能实现更深层次的信息融合理论上能获得更高的一致性和精度。例如可以将队友机器人上的特征点如角点、边缘也作为可地图化的路标点当它被多次观测时这些路标点能形成更强的约束。4. 通信带宽与隐私考量在我们的分布式架构中机器人之间需要传输位姿和观测信息。如果机器人数量很多或者需要传输图像特征等高维数据通信可能成为瓶颈。未来的方向包括研究更高效的语义压缩只传输关键信息如检测框和位姿以及联邦学习式的模型更新让机器人能在不共享原始数据的情况下协同改进检测模型。从一行代码开始到让三台机器人在实验室里流畅地相互识别、协同建图这个过程充满了挑战。最大的体会是无标记多机感知不是一个算法问题而是一个系统工程问题。它要求你对计算机视觉、状态估计、机器人学、系统编程甚至网络通信都有所涉猎。每一个模块的微小误差都会在系统链路上被放大。但当你看到机器人群体在没有外部辅助的情况下自主形成有序队形共同探索未知区域时那种成就感是无与伦比的。这项技术正从实验室走向仓库、农田、矿山它让机器人集群变得更像一群有默契的伙伴而不是一堆需要精心编排的程序。
返回列表