外观
踩坑GitHub ros-planning/moveit2昨天
MoveIt2 World子帧查询不一致:knowsTransform误报缺失
本文由 AI 根据公开内容整理,可能有误,请以原文为准:Inconsistent subframe lookup between World::knowsTransform() and World::getTransform()(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源码编译版本。
解决办法
- 修改World::knowsTransform()逻辑,使其在匹配对象未找到子帧时不立即返回false,而是像getTransform()一样继续遍历后续对象。
- 若暂不修改源码,应制定命名规范,避免使用带斜杠且互为前缀的碰撞对象ID(如禁止同时存在robot和robot/tool)。
- 添加针对重叠对象名前缀的回归测试用例OverlappingSubframePrefixMakesTransformQueriesDisagree以验证修复效果。
- 参考Issue #3939附带的复现包MoveIt2_Reproduction_Package_v0.4.zip进行本地验证与调试。
讨论原作者:@Huangguanyao 等,版权归原作者所有。
来源
本页事实对应的公开页面,以原文为准。