URDF(Unified Robot Description Format)机器人领域中用于描述机器人模型的标准 XML 格式

URDF(Unified Robot Description Format),这是机器人领域中用于描述机器人模型的标准 XML 格式。

1. URDF 概述

URDF 是 ROS(Robot Operating System)中用于描述机器人结构的标准格式。它使用 XML 格式定义机器人的:

  • 连杆(Links):机器人的刚性部件
  • 关节(Joints):连接连杆的运动副
  • 运动学结构:连杆与关节的层级关系
  • 物理属性:质量、惯性、碰撞体积等
  • 视觉属性:3D 模型外观

2. URDF 核心元素详解

2.1 基本结构

<?xml version="1.0"?><robotname="my_robot"><!-- 材料定义 --><materialname="blue"><colorrgba="0 0 0.8 1"/></material><!-- 连杆定义 --><linkname="base_link"> ... </link><!-- 关节定义 --><jointname="joint1"type="revolute"> ... </joint><!-- 传动装置(可选) --><transmissionname="trans1"> ... </transmission></robot>

2.2 Link(连杆)详解

<link> 定义机器人的一个刚性部件,包含三个主要子元素:

<linkname="link_name"><!-- 1. 惯性属性(动力学必需) --><inertial><originxyz="0 0 0.5"rpy="0 0 0"/><!-- 质心相对于link坐标系 --><massvalue="10"/><!-- 质量 (kg) --><inertiaixx="0.4"ixy="0"ixz="0"<!--惯性张量(kg·m²)--> iyy="0.4" iyz="0" izz="0.2"/> </inertial><!-- 2. 视觉属性(显示用) --><visual><originxyz="0 0 0"rpy="0 0 0"/><!-- 视觉原点偏移 --><geometry><!-- 基本几何体 --><boxsize="1 2 3"/><!-- 长方体 --><cylinderradius="0.5"length="2"/><!-- 圆柱体 --><sphereradius="1"/><!-- 球体 --><!-- 或外部网格 --><meshfilename="package://pkg/mesh.dae"scale="1 1 1"/></geometry><materialname="blue"/><!-- 引用或内联材质 --></visual><!-- 3. 碰撞属性(碰撞检测用,通常简化) --><collision><originxyz="0 0 0"rpy="0 0 0"/><geometry><boxsize="1.1 2.1 3.1"/><!-- 通常比视觉模型简单 --></geometry></collision></link>

关键属性说明:

  • origin:使用 xyz(位置,单位米)和 rpy(roll-pitch-yaw 欧拉角,单位弧度)定义偏移
  • inertia:3x3 对称惯性矩阵的 6 个独立分量
  • mesh:支持 .dae(COLLADA)、.stl.obj 格式

2.3 Joint(关节)详解

<joint> 定义两个连杆之间的连接关系和运动约束:

<jointname="joint_name"type="revolute"><!-- 父连杆(参考坐标系) --><parentlink="parent_link_name"/><!-- 子连杆(随关节运动) --><childlink="child_link_name"/><!-- 关节坐标系原点(相对于父连杆) --><originxyz="0 0 1"rpy="0 0 0"/><!-- 关节轴方向(相对于关节坐标系,单位向量) --><axisxyz="0 0 1"/><!-- 关节限制(部分类型必需) --><limitlower="-3.14"upper="3.14"effort="100"velocity="10"/><!-- 动力学属性(可选) --><dynamicsdamping="0.5"friction="0.1"/><!-- 安全性限制(可选) --><safety_controllersoft_lower_limit="-3.0"soft_upper_limit="3.0"k_position="100"k_velocity="10"/><!-- 校准信息(可选) --><calibrationrising="0.0"falling="0.0"/><mimicjoint="other_joint"multiplier="1"offset="0"/></joint>

关节类型(type):

类型说明约束
revolute旋转关节(有角度限制)<limit> 必需
continuous连续旋转关节(无限制)无上下限
prismatic滑动关节(线性运动)<limit> 必需
fixed固定关节(无运动)常用于连接静态部件
floating6自由度浮动关节用于基座或浮动基
planar平面运动关节(2自由度)在平面内移动
spherical球关节(3自由度旋转)使用四元数表示

2.4 Transmission(传动装置)

用于连接关节与执行器(电机),在 Gazebo 仿真中必需:

<transmissionname="arm_trans"><type>transmission_interface/SimpleTransmission</type><jointname="arm_joint"><hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface></joint><actuatorname="arm_motor"><hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface><mechanicalReduction>1</mechanicalReduction></actuator></transmission>

2.5 Gazebo 扩展标签

用于仿真环境的特定属性:

<!-- 在 <robot> 内 --><gazebo><static>true</static><!-- 是否静态物体 --></gazebo><!-- 在 <link> 内 --><gazeboreference="link_name"><material>Gazebo/Orange</material><!-- Gazebo材质 --><mu1>0.5</mu1><!-- 摩擦系数 --><mu2>0.5</mu2><kp>1000000.0</kp><!-- 接触刚度 --><kd>1.0</kd><!-- 接触阻尼 --><selfCollide>true</selfCollide><!-- 自碰撞检测 --><gravity>true</gravity><!-- 受重力影响 --></gazebo><!-- 在 <joint> 内 --><gazeboreference="joint_name"><provideFeedback>true</provideFeedback><implicitSpringDamper>true</implicitSpringDamper></gazebo>

3. 完整示例:简易机械臂

<?xml version="1.0"?><robotname="simple_arm"xmlns:xacro="http://www.ros.org/wiki/xacro"><!-- 基础材料 --><materialname="blue"><colorrgba="0.0 0.0 0.8 1.0"/></material><materialname="grey"><colorrgba="0.5 0.5 0.5 1.0"/></material><!-- ========== 基座 ========== --><linkname="base_link"><visual><geometry><cylinderradius="0.2"length="0.1"/></geometry><materialname="grey"/></visual><collision><geometry><cylinderradius="0.2"length="0.1"/></geometry></collision><inertial><massvalue="5.0"/><inertiaixx="0.052"ixy="0"ixz="0"iyy="0.052"iyz="0"izz="0.1"/></inertial></link><!-- ========== 连杆1 ========== --><linkname="link1"><visual><originxyz="0 0 0.5"rpy="0 0 0"/><geometry><cylinderradius="0.05"length="1.0"/></geometry><materialname="blue"/></visual><collision><originxyz="0 0 0.5"rpy="0 0 0"/><geometry><cylinderradius="0.05"length="1.0"/></geometry></collision><inertial><originxyz="0 0 0.5"rpy="0 0 0"/><massvalue="2.0"/><inertiaixx="0.168"ixy="0"ixz="0"iyy="0.168"iyz="0"izz="0.0025"/></inertial></link><!-- 关节1:基座旋转 --><jointname="joint1"type="revolute"><parentlink="base_link"/><childlink="link1"/><originxyz="0 0 0.05"rpy="0 0 0"/><axisxyz="0 0 1"/><limitlower="-3.14"upper="3.14"effort="100"velocity="2.0"/><dynamicsdamping="0.5"friction="0.1"/></joint><!-- ========== 连杆2 ========== --><linkname="link2"><visual><originxyz="0 0 0.4"rpy="0 0 0"/><geometry><boxsize="0.1 0.1 0.8"/></geometry><materialname="grey"/></visual><collision><originxyz="0 0 0.4"rpy="0 0 0"/><geometry><boxsize="0.1 0.1 0.8"/></geometry></collision><inertial><originxyz="0 0 0.4"rpy="0 0 0"/><massvalue="1.5"/><inertiaixx="0.08"ixy="0"ixz="0"iyy="0.08"iyz="0"izz="0.0025"/></inertial></link><!-- 关节2:俯仰关节 --><jointname="joint2"type="revolute"><parentlink="link1"/><childlink="link2"/><originxyz="0 0 1.0"rpy="0 0 0"/><axisxyz="0 1 0"/><limitlower="-1.57"upper="1.57"effort="50"velocity="1.0"/></joint><!-- ========== 末端执行器 ========== --><linkname="end_effector"><visual><geometry><sphereradius="0.05"/></geometry><materialname="blue"/></visual><inertial><massvalue="0.5"/><inertiaixx="0.0005"ixy="0"ixz="0"iyy="0.0005"iyz="0"izz="0.0005"/></inertial></link><jointname="fixed_joint"type="fixed"><parentlink="link2"/><childlink="end_effector"/><originxyz="0 0 0.8"rpy="0 0 0"/></joint><!-- 传动装置(用于Gazebo) --><transmissionname="trans1"><type>transmission_interface/SimpleTransmission</type><jointname="joint1"><hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface></joint><actuatorname="motor1"><hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface><mechanicalReduction>1</mechanicalReduction></actuator></transmission><transmissionname="trans2"><type>transmission_interface/SimpleTransmission</type><jointname="joint2"><hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface></joint><actuatorname="motor2"><hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface><mechanicalReduction>1</mechanicalReduction></actuator></transmission><!-- Gazebo插件:ROS控制 --><gazebo><pluginname="gazebo_ros_control"filename="libgazebo_ros_control.so"><robotNamespace>/simple_arm</robotNamespace></plugin></gazebo></robot>

可视化结果为:

在这里插入图片描述

4. URDF 的局限性与 Xacro

4.1 URDF 的局限性

  1. 代码重复:相似连杆/关节需重复编写
  2. 无参数化:无法使用变量和数学表达式
  3. 无条件逻辑:无法根据条件生成不同结构
  4. 无模块化:难以复用和组合子组件
  5. 闭链结构:无法描述并联机构(闭链运动学)

4.2 Xacro(XML Macros)

Xacro 是 URDF 的宏扩展,解决上述问题:

<?xml version="1.0"?><robotxmlns:xacro="http://www.ros.org/wiki/xacro"name="advanced_robot"><!-- ===== 属性定义(参数) ===== --><xacro:propertyname="pi"value="3.14159"/><xacro:propertyname="wheel_radius"value="0.1"/><xacro:propertyname="wheel_width"value="0.05"/><xacro:propertyname="chassis_length"value="0.5"/><!-- ===== 宏定义(模板) ===== --><xacro:macroname="wheel"params="prefix side reflect"><linkname="${prefix}_wheel_link"><visual><geometry><cylinderradius="${wheel_radius}"length="${wheel_width}"/></geometry><materialname="black"/></visual><collision><geometry><cylinderradius="${wheel_radius}"length="${wheel_width}"/></geometry></collision><inertial><massvalue="0.5"/><inertiaixx="${0.5 * 0.5 * wheel_radius * wheel_radius}"ixy="0"ixz="0"iyy="${0.5 * 0.5 * wheel_radius * wheel_radius}"iyz="0"izz="${0.5 * wheel_radius * wheel_radius}"/></inertial></link><jointname="${prefix}_wheel_joint"type="continuous"><parentlink="chassis"/><childlink="${prefix}_wheel_link"/><originxyz="${reflect * chassis_length/2} 0 ${wheel_radius}"rpy="${-pi/2} 0 0"/><axisxyz="0 0 1"/></joint></xacro:macro><!-- ===== 使用宏 ===== --><xacro:wheelprefix="left"side="left"reflect="1"/><xacro:wheelprefix="right"side="right"reflect="-1"/><!-- ===== 数学运算 ===== --><linkname="chassis"><visual><geometry><boxsize="${chassis_length} 0.3 0.1"/></geometry></visual></link><!-- ===== 包含其他文件 ===== --><xacro:includefilename="$(find pkg)/urdf/sensors.urdf.xacro"/><xacro:lidar_sensorparent="chassis"/></robot>

Xacro 编译命令:

# 将 xacro 转换为纯 URDF rosrun xacro xacro robot.xacro > robot.urdf # 或 xacro robot.xacro -o robot.urdf 

5. 验证与可视化工具

5.1 语法检查

# 检查 URDF 语法 check_urdf robot.urdf # 解析并显示结构 urdf_to_graphiz robot.urdf # 生成 PDF 结构图

5.2 可视化工具

# RViz 可视化(ROS1) roslaunch urdf_tutorial display.launch model:=robot.urdf # 或使用 joint_state_publisher_gui 调整关节 roslaunch urdf_tutorial display.launch model:=robot.urdf gui:=true 

5.3 Python 解析

import xml.etree.ElementTree as ET # 解析 URDF tree = ET.parse('robot.urdf') root = tree.getroot()# 遍历所有连杆for link in root.findall('link'): name = link.get('name')print(f"Link: {name}")# 获取质量 inertial = link.find('inertial')if inertial isnotNone: mass = inertial.find('mass')if mass isnotNone:print(f" Mass: {mass.get('value')} kg")# 遍历所有关节for joint in root.findall('joint'): name = joint.get('name') jtype = joint.get('type') parent = joint.find('parent').get('link') child = joint.find('child').get('link')print(f"Joint: {name} ({jtype}) - {parent} -> {child}")

6. URDF vs SDF

特性URDFSDF (Simulation Description Format)
设计目标机器人描述(ROS)通用仿真场景(Gazebo)
闭链结构不支持支持
多机器人单机器人支持多机器人/环境
传感器定义有限丰富
插件系统简单完整
世界描述不支持支持(光照、物理属性等)

转换工具:

# URDF 转 SDF gz sdf -p robot.urdf > robot.sdf 

7. 最佳实践

  1. 命名规范:使用有意义的名称(left_arm_joint 而非 joint1
  2. 坐标系一致性:遵循 REP-103 标准(x-前,y-左,z-上)
  3. 碰撞简化:使用基本几何体替代复杂网格进行碰撞检测
  4. 惯性准确性:确保质量和惯性张量基于真实物理参数
  5. 使用 Xacro:对于复杂机器人,始终使用 Xacro 提高可维护性
  6. 版本控制:将 URDF/Xacro 纳入版本控制系统
  7. 模块化设计:将复杂机器人拆分为多个 xacro 文件

URDF 是 ROS 机器人开发的基石,掌握它对于机器人建模、仿真和控制至关重要。对于更复杂的应用,建议结合 Xacro 和 SDF 使用。

Read more

保姆级教程!零基础解锁大疆无人机开发:MSDK/PSDK/ 上云 API 实战指南[特殊字符]

保姆级教程!零基础解锁大疆无人机开发:MSDK/PSDK/ 上云 API 实战指南[特殊字符]

保姆级教程!零基础解锁大疆无人机开发:MSDK/PSDK/上云API实战指南🚁 摘要 作为无人机领域的「苹果生态」,大疆行业开发体系自2014年开放SDK以来,已吸引超10万开发者构建3000+行业解决方案。本文基于官方最新《行业生态入门指南》,深度解析MSDK移动端开发、PSDK负载硬件开发、上云API云端集成三大核心能力,附全流程资源清单与生态认证攻略,助你从「无人机小白」变身行业开发高手! 目录 * 一、大疆开发生态全景:为什么选择大疆二次开发? * 二、MSDK实战:5分钟开发你的首个无人机控制App * 三、PSDK硬核:让无人机秒变「万能挂载平台」 * 四、上云API进阶:构建无人机云端大脑 * 五、开发者必备:技术支持与生态认证全流程 一、大疆开发生态全景:为什么选择大疆二次开发? 🌟 生态优势 * 低门槛:无需自研飞控算法,直接调用大疆底层能力(如飞行稳定、图传通信); * 高兼容:支持Matrice 350 RTK、

By Ne0inhk

openclaw多Agent和多飞书机器人配置

增加Agent多个飞书机器人 一个Agent尽量只用一个飞书机器人配置 一:先增加新的agent # 创建新的Agent,命名为new-agnet openclaw agents add new-agnet # 查看创建结果 openclaw agents list 二:新的agent与新的飞书链接 配置agnet下的channels: 在命令行输入 # 配置new-agnet机器人(替换为实际App ID和App Secret) openclaw config set agents.new-agnet.channels.feishu.appId "你的new-agnet 飞书 App ID" openclaw config set agents.new-agnet.channels.feishu.appSecret "你的new-agnet 飞书 App Secret"

By Ne0inhk
【CANN】Pi0机器人大模型 × 昇腾A2 测评

【CANN】Pi0机器人大模型 × 昇腾A2 测评

【CANN】Pi0机器人大模型 × 昇腾A2 测评 * 写在最前面 🌈你好呀!我是 是Yu欸🚀 感谢你的陪伴与支持~ 欢迎添加文末好友🌌 在所有感兴趣的领域扩展知识,不定期掉落福利资讯(*^▽^*) 写在最前面 版权声明:本文为原创,遵循 CC 4.0 BY-SA 协议。转载请注明出处。 Pi0机器人VLA大模型测评 哈喽大家好呀!我是 是Yu欸。 最近人形机器人和具身智能真的太火了,大家都在聊 Pi0、聊 VLA 大模型。但是,兄弟们,不管是搞科研还是做落地,咱们始终绕不开一个问题——算力。 今天,我们一起把当下最火的 Pi0 机器人视觉-语言-动作大模型,完完整整地部署在国产算力平台上,也就是华为的昇腾 Atlas 800I A2 服务器上。 在跑通仓库模型的基础上,我们做一次性能测评。 我们要测三个最核心的指标:

By Ne0inhk
零代码上手!用 Rokid 灵珠平台,5 步搭建专属旅游 AR 智能体

零代码上手!用 Rokid 灵珠平台,5 步搭建专属旅游 AR 智能体

零代码上手!用 Rokid 灵珠平台,5 步搭建专属旅游 AR 智能体 灵珠平台简介 okid 自研 AI 开发平台,基于多模态大模型与轻量化架构,打造零门槛、全栈化 AI 开发体系。平台提供可视化编排、预置能力组件,支持原型到云端、端侧一站式敏捷部署,并深度适配 Rokid Glasses 智能眼镜,通过专属硬件接口与低功耗优化,实现 AI 应用高效端侧落地,助力开发者快速打造视觉识别、语音交互等穿戴式 AI 应用,拓展 AI + 物理世界的交互边界可视化编排工具,拖拽式快速搭建应用预置丰富能力组件库,涵盖对话引擎、视觉识别等核心模块支持从原型设计到云端、端侧的一站式敏捷部署提供设备专属适配接口,实现硬件深度协同搭载低功耗运行优化方案,保障端侧持久稳定运行 实战:搭建旅游类AR智能体 1、进入灵珠平台 登录灵珠平台后,你将看到简洁直观的工作台界面 点击创建智能体按钮,

By Ne0inhk