# MoveIt2 PlanningScene ADD替换失败导致有效碰撞物体被误删

> 原文链接：https://robotics.hellobike.com/pitfalls/2026-11-03-moveit2-3942
> 频道：pitfalls | 更新日期：2026-11-03 | 标签：auto, github-issue, moveit2
> 核心摘要：PlanningScene处理ADD操作时先删旧物体再校验新几何，校验失败致障碍物丢失。需调整源码校验顺序或确保消息合法。

# MoveIt2 PlanningScene ADD替换失败导致有效碰撞物体被误删

::: v-pre
> 本文由 AI 根据公开内容整理，可能有误，请以原文为准：[Failed collision object ADD replacement removes the existing object before validation](https://github.com/moveit/moveit2/issues/3942)（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

## 解决办法

1. 修改 `moveit_core/planning_scene/src/planning_scene.cpp` 中的 `processCollisionObjectAdd` 逻辑，将 `shapesAndPosesFromCollisionObjectMessage` 几何校验与构建步骤移至 `world_->removeObject` 之前执行。
2. 仅当新几何体解析成功且返回 true 时，再执行删除旧物体及 `world_->addToObject` 添加新物体的操作；若校验失败则保留原物体不变并返回 false。
3. 应用层作为临时规避措施，需在发送 CollisionObject ADD 消息前严格校验 `primitives` 与 `primitive_poses` 数组长度一致性，防止触发该缺陷。
4. 建议添加回归测试验证被拒绝的替换操作不会改变现有碰撞世界状态。

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

## 原始参考来源 (Sources)

- [GitHub ros-planning/moveit2 #3942：Failed collision object ADD replacement removes the existing object before validation](https://github.com/moveit/moveit2/issues/3942)