# MoveIt2 World类moveShapesInObject缺失COW保护致共享状态污染

> 原文链接：https://robotics.hellobike.com/pitfalls/2026-11-03-moveit2-3940
> 频道：pitfalls | 更新日期：2026-11-03 | 标签：auto, github-issue, moveit2
> 核心摘要：MoveIt2的World类两个方法缺失ensureUnique调用导致COW失效，需手动补全或避免共享World实例以防状态污染。

# MoveIt2 World类moveShapesInObject缺失COW保护致共享状态污染

::: v-pre
> 本文由 AI 根据公开内容整理，可能有误，请以原文为准：[Missing copy-on-write protection in World::moveShapesInObject and setSubframesOfObject](https://github.com/moveit/moveit2/issues/3940)（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-&gt;second)调用，保持与moveShapeInObject()一致
2. 在World::setSubframesOfObject()赋值subframe_poses_前插入ensureUnique(obj_pair-&gt;second)调用
3. 添加回归测试验证修改一个World实例不影响其他共享该对象的实例
4. 临时规避：避免复制World实例或在修改前深拷贝PlanningScene以确保隔离

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

## 原始参考来源 (Sources)

- [GitHub ros-planning/moveit2 #3940：Missing copy-on-write protection in World::moveShapesInObject and setSubframesOfObject](https://github.com/moveit/moveit2/issues/3940)