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

Python 高手都在用的 8 大交流平台,腾讯频道成新手协作新阵地

Python 高手都在用的 8 大交流平台,腾讯频道成新手协作新阵地 Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本。作为当前最流行的编程语言之一,Python拥有庞大而活跃的开发者社区。无论是初学者还是资深工程师,都能在合适的平台上找到技术解答、项目协作与成长机会。以下介绍几个被 Python 高手广泛使用的交流平台 第一章:Python 高手都在用的8大交流平台概述 平台名称主要用途访问方式Stack Overflow技术问答https://stackoverflow.comGitHub开源协作https://github.comr/Python社区讨论https://www.reddit.com/r/Python/分布式边缘协同平台边缘计算协同开发企业私有部署/开源镜像站Real Python系统教程学习https://realpython.comPython Discord 与 Slack 社群实时聊天交流官方邀请制/注册登录PyPI 官方论坛包发布与维护讨论https:/

By Ne0inhk
Python爬虫实战:手把手教你用 Python 爬取网易新闻每日热文,小白也能轻松上手

Python爬虫实战:手把手教你用 Python 爬取网易新闻每日热文,小白也能轻松上手

Python爬虫实战:手把手教你用 Python 爬取网易新闻每日热文,小白也能轻松上手 Python爬虫实战:手把手教你用 Python 爬取网易新闻每日热文,小白也能轻松上手,该教程详细讲解如何用 Python 爬取网易新闻每日热文,先介绍爬虫 “请求 - 解析 - 提取 - 保存” 原理及 requests、BeautifulSoup4 等必备库的安装,再逐段解析完整代码:从设置请求头模拟浏览器、发送 HTTP 请求获取网页数据,到通过关键词匹配和类名匹配双方案提取 “今日推荐” 热文,还包含数据去重、Excel 保存(按日期命名)及异常处理与调试模块。同时给出实操步骤,解答爬取不到数据、Excel 保存失败等常见问题,强调爬虫伦理与法律规范,最后提供定时爬取、多频道爬取等功能扩展建议,帮助小白轻松上手打造自动新闻采集工具。 前言     Python作为一门简洁、易读、功能强大的编程语言,

By Ne0inhk
C++ 关联式容器详解:set、map 及其变体的深度剖析----《Hello C++ Wrold!》(19)--(C/C++)

C++ 关联式容器详解:set、map 及其变体的深度剖析----《Hello C++ Wrold!》(19)--(C/C++)

文章目录 * 前言 * set * set的类模板参数声明 * set的构造函数声明 * set常见的几个接口 * multiset * map * map的类模板参数声明 * map的构造函数声明 * map常用的几个接口 * multimap * pair * 作业部分 * sort和stable_sort的区别 前言 在 C++ 标准库中,容器是数据存储和操作的核心工具,而关联式容器凭借其高效的查找、插入和删除特性,在处理需要快速检索的数据时展现出独特的优势。set、multiset、map 和 multimap 作为 C++ 中常用的关联式容器,底层通常基于红黑树实现,这使得它们在保证数据有序性的同时,能将基本操作的时间复杂度控制在 O (log n) 级别,远超序列式容器在查找操作上的表现。 本文将系统地介绍这几类关联式容器的特性、类模板参数、构造函数及常用接口,深入剖析 set 与 map 在存储模型(k 模型与

By Ne0inhk
超简单的在VS Code配置C/C++的方法(最新,轻量化,支持万能头文件)

超简单的在VS Code配置C/C++的方法(最新,轻量化,支持万能头文件)

PS:最近一直在为如何在vscode使用cpp感到头疼,网上的教程要么太老,要么不适合新手,故决定自己写一篇。 为什么用vscode? --轻量化,另外就是博主并不主使用cpp开发,cpp只是用来打算法的 教程实现什么? 1.可用“万能头文件 bits/stdc++.h” 2.结构清晰:所有 exe 文件统一输出到 bin 文件夹,cpp文件统一存放到src文件夹 一. 环境准备 1.vscode安装 vscode安装地址(https://code.visualstudio.com/) 下载完后点击安装: 最好不要装在C盘,更改安装路径的话,路径不要有中文和空格!其他选项默认就行。 需要中文的看这里: 安装完中文后重启vscode即可 2.MinGW安装 vscode本身只是一个文本编辑器,想使用某种语言需要安装对应的编译器,这里给出 MinGW-w64轻量化安装教程: 2.1从 WinLibs 获取

By Ne0inhk