外观
踩坑GitHub ros-planning/moveit2昨天
MoveIt2 PlanningScene ADD替换失败导致有效碰撞物体被误删
本文由 AI 根据公开内容整理,可能有误,请以原文为准:Failed collision object ADD replacement removes the existing object before validation(GitHub ros-planning/moveit2 #3942)
状态:有绕过办法
问题
在 PlanningScene::processCollisionObjectAdd() 中,当对已存在的碰撞物体执行 ADD 替换操作时,代码会先调用 world_->removeObject 删除原物体,随后才解析并校验新几何体。
环境
ROS 2 Rolling / Humble, Ubuntu 22.04, MoveIt 2 v2.15.2 (Source Build), moveit_core/planning_scene
解决办法
- 修改
moveit_core/planning_scene/src/planning_scene.cpp中的processCollisionObjectAdd逻辑,将shapesAndPosesFromCollisionObjectMessage几何校验与构建步骤移至world_->removeObject之前执行。 - 仅当新几何体解析成功且返回 true 时,再执行删除旧物体及
world_->addToObject添加新物体的操作;若校验失败则保留原物体不变并返回 false。 - 应用层作为临时规避措施,需在发送 CollisionObject ADD 消息前严格校验
primitives与primitive_poses数组长度一致性,防止触发该缺陷。 - 建议添加回归测试验证被拒绝的替换操作不会改变现有碰撞世界状态。
讨论原作者:@Huangguanyao 等,版权归原作者所有。
来源
本页事实对应的公开页面,以原文为准。