十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

第258篇 动态环境SLAM——处理运动物体的挑战与方案

第258篇 动态环境SLAM——处理运动物体的挑战与方案 前面几篇聊的SLAM技术都有一个隐含假设环境是静态的。墙壁不会动桌子不会跑地面上的物体位置不变。但现实世界不是这样的——行人走来走去车辆进进出出门开了又关椅子被推来推去。动态环境对SLAM系统来说是一个实打实的挑战处理不好就会出大问题。动态物体对SLAM的影响有几个层面。在前端里程计中动态物体产生的特征点或点云会给出错误的运动估计导致轨迹漂移。在回环检测中动态物体改变了场景外观可能导致漏检或误检。在地图维护中动态物体被当作静态物体写入地图地图上就会留下一堆幽灵——车已经开走了地图上还有一辆车的点云。动态物体的检测方法处理动态物体的第一步是检测它们。检测不出来的话后面所有处理都白搭。基于视觉的方法通常用深度学习做语义分割或目标检测识别出行人、车辆等已知动态类别。YOLO、Mask R-CNN、语义分割网络都可以用。这种方法对已知类别的动态物体效果好但对没见过的动态物体比如一个滚动的球就无能为力了。# 基于深度学习的动态物体检测 def detect_dynamic_objects(image, detector): detections detector.predict(image) dynamic_mask np.zeros(image.shape[:2], dtypebool) for det in detections: if det.class_name in [person, car, bicycle]: dynamic_mask[det.bbox] True return dynamic_mask基于几何的方法利用多视图几何来检测动态物体。同一个物体在两帧之间的运动如果和相机的运动不一致就说明它是动态的。常用的指标有极线约束违反程度、深度一致性、光流残差等。这种方法不依赖语义信息理论上可以检测任意动态物体但对噪声比较敏感。实际项目中最好的做法是把两种方法结合起来。语义检测给出哪些物体可能是动态的先验几何验证给出这些物体确实在动的证据。两者都满足的才被标记为动态物体。动态物体滤除策略检测到动态物体后最直接的处理方式就是把它们从SLAM的计算中剔除掉。在视觉SLAM中动态物体区域的特征点不参与位姿估计和地图构建。ORB-SLAM3在跟踪线程中做了动态物体检测把动态物体上的ORB特征点直接忽略。在激光SLAM中动态物体产生的点云要从帧中移除。一种做法是用聚类把点云分成若干簇检查每个簇的运动状态运动的簇对应的点就删掉。另一种做法是维护一个静态背景模型只保留和背景模型一致的点。# 点云动态物体滤除 def filter_dynamic_points(current_scan, prev_scan, T_estimated): transformed apply_transform(current_scan, T_estimated) residuals compute_residuals(transformed, prev_scan) static_mask residuals threshold return current_scan[static_mask]滤除动态物体能解决大部分问题但不够完美。如果动态物体占据了画面很大比例比如一群行人挡住了大部分视野剩下的静态特征太少位姿估计的精度就会下降。这种情况下可能需要其他传感器比如IMU来辅助。动态SLAM的高级方案更高级的做法不只是剔除动态物体而是显式地建模动态物体的运动状态。SLAMMOTSLAM MOTMulti-Object Tracking把SLAM和多目标跟踪融合在一起。系统同时估计相机的运动和动态物体的运动。动态物体有自己的位姿和速度状态作为额外的节点加入优化图中。这种方法可以在地图上标注这里曾经有一辆车朝那个方向移动了。DynSLAM是另一个代表性工作。它用语义分割网络把场景分成静态背景和动态前景背景部分做传统SLAM动态物体部分做独立的目标跟踪和3D重建。最终输出的地图包含静态背景和动态物体轨迹两部分。# DynSLAM的核心思路 def dynslam_process(frame): # 语义分割 segments semantic_segmentation(frame) # 静态背景做SLAM static_map slam.update(segments.background) # 动态物体做跟踪 for obj in segments.dynamic_objects: tracker.update(obj.id, obj.pose, obj.velocity) return static_map, tracker.get_trajectories()半静态物体的处理有一类物体介于静态和动态之间半静态物体。比如一把椅子大部分时间是固定的偶尔被人推动。一扇门大部分时间是关着的偶尔被打开。半静态物体对SLAM的影响比较隐蔽。它们在短时间内看起来是静态的SLAM会把它们当作静态物体建入地图。但长时间来看它们位置变了导致地图上出现重影——同一个椅子在两个位置都有点云。处理半静态物体的一种思路是地图变化检测。把当前观测和已有地图做比较发现不一致的区域标记为变化的从地图中更新掉。这种方法需要维护一个可靠的地图差异检测机制计算量不小。另一种思路是给地图中的物体加上稳定性属性。经常出现在同一位置的物体稳定性高偶尔出现或位置变化的物体稳定性低。导航时优先使用稳定性高的物体做定位参考。面试追问环节面试官动态环境下SLAM的最大挑战是什么最大的挑战是区分我的运动和物体的运动。SLAM的核心是估计相机/机器人的运动但如果场景中有动态物体观测到的变化不全是机器人运动引起的。如果把动态物体引起的变化也当成自己的运动位姿估计就错了。特别是在动态物体占比很高的场景比如拥挤的商场静态部分太少这个问题就更突出。面试官纯激光雷达怎么检测动态物体激光雷达没有颜色和纹理信息检测动态物体比视觉更难。常用方法是多帧比较把当前帧变换到上一帧的坐标系下和上一帧做比较差异大的区域可能是动态物体。具体实现上可以用体素化后比较每个体素的占据状态或者用点到面距离的分布来检测异常区域。还有一些方法用扫描的时序信息同一个位置在不同时刻的深度不一致就是动态的。面试官DynSLAM和传统SLAM动态滤除有什么区别传统方法是消极处理检测到动态物体就扔掉假装它们不存在。DynSLAM是积极处理不仅检测动态物体还跟踪它们、重建它们的3D形状、估计它们的运动轨迹。这样最终的地图不只是静态背景还包含了动态物体的运动信息。对于需要理解环境动态性的应用比如自动驾驶这种丰富的地图更有价值。面试官实时性和精度怎么平衡动态物体检测特别是深度学习方案计算量不小可能影响SLAM的实时性。平衡方案有几种把检测放到独立线程和SLAM并行运行降低检测频率不是每帧都检测而是每隔几帧检测一次中间帧用上一帧的检测结果用轻量级网络替代大型网络牺牲一点检测精度换取速度。实际项目中独立线程降频检测是最常用的方案。面试官动态SLAM有哪些开源方案视觉方面ORB-SLAM3支持动态物体滤除DynSLAM有开源代码还有DynaSLAM用Mask R-CNN做动态物体检测。激光方面ERASOR和Removert专门做点云中的动态物体移除HDL-Graph-SLAM也可以集成动态物体滤除模块。多传感器方面LIO-SAM结合IMU和激光雷达IMU的预测可以帮助识别动态物体引起的异常。动态环境SLAM是SLAM从实验室走向真实世界的必经之路。真实世界不是静态的博物馆到处都有运动的人和车。处理动态物体不只是一个技术问题更是SLAM系统实用化的关键。从简单的动态物体滤除到复杂的动态场景建模这个领域还在快速发展。深度学习的加入让动态物体检测更准确但计算效率和泛化能力仍然是挑战。上一篇第257篇 全局一致性优化——位姿图优化和后端优化策略下一篇我们聊大规模地图管理看看当SLAM系统运行很长时间、覆盖很大区域时地图要怎么组织和管理。如果这篇文章对你有帮助欢迎点赞支持一下你的鼓励是我持续更新的动力
返回列表