如何在Pybullet中加载urdf.xacro格式的文件?
Pybullet加载urdf.xacro格式文件的方法
能力说明
Pybullet 本身不支持直接加载.urdf.xacro格式文件。
xacro 是ROS生态衍生的URDF宏模板格式,本质是带变量、条件判断、宏调用的可编辑模板,不属于标准URDF规范的XML结构,直接调用loadURDF接口加载未展开的xacro文件,会因为无法识别xacro专属标签触发XML解析错误,完全无法正常加载模型。
具体实现步骤
- 前置准备:确保本地具备xacro宏解析能力,既可以通过安装完整ROS环境调用系统自带的xacro工具,也可以通过pip安装独立的xacro解析依赖,不需要强制安装全量ROS组件。
- 核心流程:先通过xacro工具把模板文件预处理展开为无宏的标准纯URDF文件,再复用原本Pybullet加载普通URDF的接口完成加载,具体的代码实现示例如下:
import os import pybullet as p # 配置xacro文件的所在路径 urdfRootPath = "./your_robot_model_path" xacro_file = os.path.join(urdfRootPath, "robot.urdf.xacro") # 预处理生成的标准URDF临时存储路径 processed_urdf = os.path.join(urdfRootPath, "robot_processed.urdf") # 调用xacro命令完成宏展开,生成标准URDF # 如果xacro文件需要传入自定义参数,直接在命令字符串后追加对应参数即可,比如 xacro xx.xacro -o xx.urdf wheel_radius:=0.1 os.system(f"xacro {xacro_file} -o {processed_urdf}") # 完全沿用原本加载普通URDF的逻辑即可 robot = p.loadURDF(processed_urdf, useFixedBase=True)
- 注意事项:
- 可以把预处理生成的临时URDF文件放到系统临时目录,避免污染原模型文件夹
- 部分版本的Pybullet支持通过内存buffer方式加载URDF,此时可以直接读取xacro展开后的文本内容传给加载接口,不需要在磁盘生成实体临时文件
- xacro展开阶段需要保证所有被引用的宏文件、模型资源路径都能被xacro工具检索到,否则会在预处理阶段直接报错
内容的提问来源于stack exchange,提问作者Rexcirus
相关产品推荐
相关产品推荐

