外观
踩坑GitHub ros-planning/moveit2昨天
MoveIt2 CollisionObject MOVE校验失败致物体位姿被错误修改
本文由 AI 根据公开内容整理,可能有误,请以原文为准:Collision object MOVE modifies object pose before validating shape pose count(GitHub ros-planning/moveit2 #3941)
状态:有绕过办法
问题
在 PlanningScene::processCollisionObjectMove() 中,系统先调用 world_->setObjectPose() 更新碰撞物体全局位姿,随后才校验 primitive_poses 等形状位姿数量是否匹配。若校验失败函数返回 false,但物体位姿已被永久修改,导致规划场景处于部分更新的脏状态,后续碰撞查询将基于错误位姿进行计算。
环境
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,将形状位姿数量校验逻辑移至world_->setObjectPose()调用之前,确保所有验证通过后再执行状态变更。 - 作为临时规避措施,在发送
CollisionObject::MOVE消息前,务必在应用层严格校验primitive_poses、mesh_poses与plane_poses的总数与当前场景中该物体的形状数量完全一致,防止触发后端校验失败。 - 参考 Issue #3939 提供的复现测试包
FailedMoveLeavesObjectPoseChanged验证修复效果,确保被拒绝的 MOVE 请求不会改变全局物体位姿及独立形状位姿。
讨论原作者:@Huangguanyao 等,版权归原作者所有。
来源
本页事实对应的公开页面,以原文为准。