Skip to content

踩坑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模块

解决办法 ​

  1. 在World::moveShapesInObject()循环修改shape_poses_前插入ensureUnique(it->second)调用,保持与moveShapeInObject()一致
  2. 在World::setSubframesOfObject()赋值subframe_poses_前插入ensureUnique(obj_pair->second)调用
  3. 添加回归测试验证修改一个World实例不影响其他共享该对象的实例
  4. 临时规避:避免复制World实例或在修改前深拷贝PlanningScene以确保隔离

讨论原作者:@Huangguanyao 等,版权归原作者所有。

基于本页技术方向关联的整机参数、核心零部件、实测报告与同赛道选型横评。

来源

本页事实对应的公开页面,以原文为准。

  1. GitHub ros-planning/moveit2 #3940:Missing copy-on-write protection in World::moveShapesInObject and setSubframesOfObject访问 2026-11-04