外观
踩坑GitHub ros-planning/moveit2昨天
MoveIt2 World类moveShapesInObject缺失COW保护致共享状态污染
本文由 AI 根据公开内容整理,可能有误,请以原文为准:Missing copy-on-write protection in World::moveShapesInObject and setSubframesOfObject(GitHub ros-planning/moveit2 #3940)
状态:有绕过办法
问题
在moveit_core中,World::moveShapesInObject()和setSubframesOfObject()修改对象前未调用ensureUnique(),违反Copy-on-Write机制。当多个World实例共享底层对象时,对副本的修改会意外污染原始World的状态,导致规划场景快照隔离失效,影响碰撞检测与规划器正确性。
环境
ROS 2 Rolling/Humble, Ubuntu 22.04, MoveIt 2源码构建(2.15.2), moveit_core/collision_detection模块
解决办法
- 在World::moveShapesInObject()循环修改shape_poses_前插入ensureUnique(it->second)调用,保持与moveShapeInObject()一致
- 在World::setSubframesOfObject()赋值subframe_poses_前插入ensureUnique(obj_pair->second)调用
- 添加回归测试验证修改一个World实例不影响其他共享该对象的实例
- 临时规避:避免复制World实例或在修改前深拷贝PlanningScene以确保隔离
讨论原作者:@Huangguanyao 等,版权归原作者所有。
来源
本页事实对应的公开页面,以原文为准。