# MoveIt2 PlanningScene几何转换失败静默跳过致碰撞体缺失

> 原文链接：https://robotics.hellobike.com/pitfalls/2026-11-03-moveit2-3944
> 频道：pitfalls | 更新日期：2026-11-03 | 标签：auto, github-issue, moveit2
> 核心摘要：PlanningScene处理CollisionObject时几何转换失败被静默忽略且返回成功，需通过校验存储形状数量或修改源码增加错误追踪来规避。

# MoveIt2 PlanningScene几何转换失败静默跳过致碰撞体缺失

::: v-pre
> 本文由 AI 根据公开内容整理，可能有误，请以原文为准：[Failed shape conversions are silently skipped in PlanningScene collision object processing](https://github.com/moveit/moveit2/issues/3944)（GitHub ros-planning/moveit2 #3944）

**状态**：有绕过办法

## 问题

在MoveIt2的`PlanningScene::shapesAndPosesFromCollisionObjectMessage()`中，当`constructShapeFromMsg()`返回nullptr时，lambda函数直接return跳过该几何体，但外层函数仍无条件返回true。

## 环境

ROS 2 Humble/Rolling, Ubuntu 22.04, MoveIt2 2.15.2 (Source Build), moveit_core/planning_scene模块

## 解决办法

1. 部署验证测试：使用复现包`MoveIt2_Reproduction_Package_v0.4.zip`中的GTest用例`ShapeConversionFailureCanBeSilentlySkipped`，输入混合有效Box与无效类型255的primitive，确认`processCollisionObjectMsg`返回true但World仅存储1个形状。
2. 运行时防御：在调用`processCollisionObjectMsg`后，立即比对输入消息中的几何体总数与PlanningScene World中实际存储的形状数量，若不一致则视为添加失败并触发告警或拒绝该物体。
3. 源码级修复：修改`planning_scene.cpp`中append lambda及`treat_shape_vectors`逻辑，增加布尔标志位追踪`constructShapeFromMsg()`是否返回nullptr；一旦发现转换失败，除非显式允许部分接受，否则应返回false或抛出异常，并…

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

## 原始参考来源 (Sources)

- [GitHub ros-planning/moveit2 #3944：Failed shape conversions are silently skipped in PlanningScene collision object processing](https://github.com/moveit/moveit2/issues/3944)