# MoveIt2 CollisionObject MOVE校验失败致物体位姿被错误修改

> 原文链接：https://robotics.hellobike.com/pitfalls/2026-11-03-moveit2-3941
> 频道：pitfalls | 更新日期：2026-11-03 | 标签：auto, github-issue, moveit2
> 核心摘要：MoveIt2处理MOVE消息时先更新位姿后校验形状数量，导致校验失败时场景状态不一致。需调整源码校验顺序或确保发送端数据严格匹配。

# MoveIt2 CollisionObject MOVE校验失败致物体位姿被错误修改

::: v-pre
> 本文由 AI 根据公开内容整理，可能有误，请以原文为准：[Collision object MOVE modifies object pose before validating shape pose count](https://github.com/moveit/moveit2/issues/3941)（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

## 解决办法

1. 修改 `moveit_core/planning_scene/src/planning_scene.cpp`，将形状位姿数量校验逻辑移至 `world_->setObjectPose()` 调用之前，确保所有验证通过后再执行状态变更。
2. 作为临时规避措施，在发送 `CollisionObject::MOVE` 消息前，务必在应用层严格校验 `primitive_poses`、`mesh_poses` 与 `plane_poses` 的总数与当前场景中该物体的形状数量完全一致，防止触发后端校验失败。
3. 参考 Issue #3939 提供的复现测试包 `FailedMoveLeavesObjectPoseChanged` 验证修复效果，确保被拒绝的 MOVE 请求不会改变全局物体位姿及独立形状位姿。

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

## 原始参考来源 (Sources)

- [GitHub ros-planning/moveit2 #3941：Collision object MOVE modifies object pose before validating shape pose count](https://github.com/moveit/moveit2/issues/3941)