# MoveIt2 World子帧查询不一致：knowsTransform误报缺失

> 原文链接：https://robotics.hellobike.com/pitfalls/2026-11-03-moveit2-3943
> 频道：pitfalls | 更新日期：2026-11-03 | 标签：auto, github-issue, moveit2
> 核心摘要：MoveIt2中World::knowsTransform与getTransform对重叠前缀子帧解析逻辑不一致，需修改源码使前者继续搜索或规避命名冲突。

# MoveIt2 World子帧查询不一致：knowsTransform误报缺失

::: v-pre
> 本文由 AI 根据公开内容整理，可能有误，请以原文为准：[Inconsistent subframe lookup between World::knowsTransform() and World::getTransform()](https://github.com/moveit/moveit2/issues/3943)（GitHub ros-planning/moveit2 #3943）

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

## 问题

在moveit_core/collision_detection/src/world.cpp中，当碰撞对象ID存在包含关系（如robot与robot/tool）时，World::knowsTransform()匹配到短前缀对象若无对应子帧即返回false，而World::getTransform()会继续搜索并成功返回变换。这导致有效的子帧在可用性检查中被错误拒绝，引发规划或附着代码行为异常。

## 环境

ROS 2 Humble/Rolling，Ubuntu 22.04，MoveIt 2 v2.15.2源码编译版本。

## 解决办法

1. 修改World::knowsTransform()逻辑，使其在匹配对象未找到子帧时不立即返回false，而是像getTransform()一样继续遍历后续对象。
2. 若暂不修改源码，应制定命名规范，避免使用带斜杠且互为前缀的碰撞对象ID（如禁止同时存在robot和robot/tool）。
3. 添加针对重叠对象名前缀的回归测试用例OverlappingSubframePrefixMakesTransformQueriesDisagree以验证修复效果。
4. 参考Issue #3939附带的复现包MoveIt2_Reproduction_Package_v0.4.zip进行本地验证与调试。

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

## 原始参考来源 (Sources)

- [GitHub ros-planning/moveit2 #3943：Inconsistent subframe lookup between World::knowsTransform() and World::getTransform()](https://github.com/moveit/moveit2/issues/3943)