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
相关产品推荐
相关产品推荐

