You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pydrake中URDF转SDF解析失败:名称嵌套问题求助

问题描述

环境配置

  • drake 1.27.0
  • Python 3.8
  • 操作系统:Ubuntu 22.04
  • IDE:PyCharm
  • ROS 2 Humble

我尝试用Drake模拟UR10e搭配Robotiq 85夹爪完成简单拾取放置任务,使用某模型库中通过SDF组合的URDF模型,解析代码如下:

from pydrake.all import (RobotDiagramBuilder, FindResourceOrThrow)

# 创建图构建器
resource = 'description/complete_robot.sdf'
robot_model_name = 'robot'
rdb = RobotDiagramBuilder(time_step=1.0e-3)
rdb.parser().package_map().PopulateFromRosPackagePath()
rdb.parser().AddModels(FindResourceOrThrow(resource))
robot_model = rdb.plant().GetModelInstanceByName(robot_model_name)

代码运行在ROS 2 Python包中,已配置环境变量确保SDF引用的ROS 2包可被识别:

ROS_PACKAGE_PATH = /home/user/workspaces/my_python_workspace/install/my_python_workspace

运行后出现以下错误:

Failure at multibody/parsing/detail_sdf_parser.cc:180 in GetRelativeBodyName(): condition 'nested_model_absolute_name.starts_with(required_prefix)' failed.

解决建议

1. 检查SDF模型的嵌套命名规则

这个错误根源是SDF中嵌套模型的绝对命名不符合Drake的解析逻辑。打开complete_robot.sdf文件:

  • 确认嵌套模型的name属性没有包含特殊字符,且命名前缀符合Drake要求
  • 检查模型内、的命名是否存在冲突,尤其是嵌套子模型和顶层模型的元素命名是否重复

2. 调整模型实例的获取方式

避免通过名称获取模型实例,直接取添加后的模型列表中的第一个实例:

# 替换原有的robot_model获取代码
models = rdb.parser().AddModels(FindResourceOrThrow(resource))
robot_model = models[0]

3. 修正ROS_PACKAGE_PATH配置

确保ROS_PACKAGE_PATH包含所有依赖模型的包路径,比如UR10e和Robotiq 85夹爪的模型包路径,不能只包含自身Python包路径。可通过终端执行echo $ROS_PACKAGE_PATH验证路径完整性。

4. 升级Drake版本

该解析错误在Drake后续版本中已被修复,建议升级到1.30及以上的稳定版本后重新测试。

内容的提问来源于stack exchange,提问作者L Wall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 12:21:17