【ROS1】20-URDF标签
目录
一、准备
通过如下指令(或:https://download.csdn.net/download/ChaoChao66666/92359149?spm=1001.2014.3001.5503)下载所需素材
git clone https://github.com/zx595306686/sim_demo.git
素材内容如下:

概念
URDF(Unified Robot Description Format,统一机器人描述格式)是 ROS 中用于描述机器人几何结构、运动学、惯性、可视化属性的核心 XML 格式文件。它是机器人模型的 “蓝图”,ROS 的运动学求解器(如 KDL)、可视化工具(RViz)、仿真环境(Gazebo)等都依赖 URDF 解析机器人的结构和约束。
标签简介
核心标签按功能可分为「根标签、连杆相关、关节相关、可视化 / 碰撞、惯性、工具类」六大类。可参考链接:https://wiki.ros.org/urdf/XML
一、根标签:<robot>
作用:URDF 文件的根节点,所有其他标签都必须嵌套在其中,用于定义机器人的整体信息。
属性:
name:机器人名称(必填),用于唯一标识机器人模型。
示例:
<robot name="my_robot">
<!-- 所有其他标签(link、joint等)都在这里 -->
</robot>
二、连杆相关标签:<link>
连杆(Link)是机器人的刚体单元(如底座、手臂、轮子、夹爪等),每个 <link> 对应机器人的一个物理刚体,描述其几何形状、惯性、可视化外观和碰撞属性。
1. 核心标签:<link>
作用:定义单个连杆的基础信息,是连杆相关所有子标签的容器。
属性:
name:连杆名称(必填),需唯一(如base_link、arm_link1)。
示例:
<link name="base_link">
<!-- 子标签:<visual>、<collision>、<inertial> 等 -->
</link>
2. 子标签 1:<visual>(可视化外观)
作用:定义连杆的可视化模型(仅用于显示,不参与物理碰撞或运动学计算),比如颜色、形状、纹理。
常用子标签:
<geometry>:定义可视化的几何形状(必填),支持 4 种基础形状:<box size="x y z">:长方体(尺寸为 x/y/z 轴长度,单位:米)。<cylinder length="h" radius="r">:圆柱体(h 为高度,r 为半径)。<sphere radius="r">:球体(r 为半径)。<mesh filename="package://功能包名/路径/模型文件.stl/.dae">:导入外部 3D 模型(STL/DAE 格式,需用package://路径)。
<material name="材质名">:定义连杆颜色 / 纹理(可选),子标签<color rgba="r g b a">(rgba 取值 0~1,a 为透明度)。<origin xyz="x y z" rpy="roll pitch yaw">:定义可视化模型相对于连杆坐标系的位置偏移(xyz)和姿态旋转(rpy,单位:弧度),默认无偏移(xyz=0 0 0,rpy=0 0 0)。
示例:
<visual>
<origin xyz="0 0 0.1" rpy="0 0 0"/> <!-- 向上偏移 0.1m -->
<geometry>
<box size="0.5 0.5 0.2"/> <!-- 长0.5m、宽0.5m、高0.2m的长方体 -->
</geometry>
<material name="blue">
<color rgba="0 0 1 1"/> <!-- 不透明蓝色 -->
</material>
</visual>
4. 子标签 3:<inertial>(惯性属性)
作用:定义连杆的惯性参数(质量、转动惯量),用于动力学仿真(如 Gazebo 仿真、力控算法),无此标签则默认惯性为 0(静态刚体)。
常用子标签
<mass value="m">:连杆质量(必填,单位:kg)。<inertia ixx="Ixx" ixy="Ixy" ixz="Ixz" iyy="Iyy" iyz="Iyz" izz="Izz">:惯性张量矩阵(必填),描述刚体绕各轴的转动惯量和耦合项,需根据连杆形状计算(如长方体、圆柱体有固定公式)。<origin xyz="x y z" rpy="r p y">:惯性坐标系相对于连杆坐标系的偏移(可选,默认与连杆坐标系重合),通常设置为连杆的质心位置。
示例(长方体连杆的惯性)
<inertial>
<mass value="2.0"/> <!-- 质量 2kg -->
<origin xyz="0 0 0.1"/> <!-- 质心在连杆中心(与可视化模型偏移一致) -->
<inertia ixx="0.017" ixy="0" ixz="0" <!-- 长方体惯性张量公式:Ixx = m*(y²+z²)/12 -->
iyy="0.017" iyz="0"
izz="0.008"/>
</inertial>
三、关节相关标签:<joint>
关节(Joint)是连接两个连杆的运动约束单元,定义连杆之间的相对运动方式(如旋转、平移)、限位、阻尼等属性。
1. 核心标签:<joint>
作用:定义两个连杆的连接关系和运动特性,是机器人运动学的核心。
核心属性:
name:关节名称(必填,唯一,如joint_arm1、wheel_joint)。type:关节类型(必填),ROS 支持 6 种常用类型:
| 关节类型 | 作用(相对运动) | 自由度(DOF) | 示例场景 |
|---|---|---|---|
fixed |
固定关节,无相对运动 | 0 | 底座与地面、焊接结构 |
revolute |
旋转关节(绕单轴旋转) | 1 | 机械臂关节、舵机连接 |
| continuous | 连续旋转关节(绕单轴无限旋转) | 1 | 轮子、螺旋桨 |
prismatic |
移动关节(沿单轴平移) | 1 | 伸缩臂、线性滑台 |
spherical |
球关节(绕三轴旋转,如球铰) | 3 | 肩膀、髋关节 |
planar |
平面关节(沿两轴平移 + 绕一轴旋转) | 3 | 机器人在平面移动 |
floating |
浮动关节(三轴平移 + 三轴旋转) | 6 | 无人机、自由移动物体 |
常用子标签:
<parent link="父连杆名"/>:关节的父连杆(必填),通常是固定 / 更靠近底座的连杆(如base_link)。<child link="子连杆名"/>:关节的子连杆(必填),相对于父连杆运动的连杆(如arm_link1)。<origin xyz="x y z" rpy="r p y"/>:关节坐标系相对于父连杆坐标系的位置和姿态(必填),关节的运动围绕此坐标系进行。<axis xyz="x y z"/>:关节的运动轴(仅对revolute/prismatic有效,必填),如xyz="1 0 0"表示沿 X 轴旋转 / 平移。<limit>:关节运动限位(可选,对revolute/prismatic常用):lower:最小运动范围(旋转:弧度;平移:米)。upper:最大运动范围(旋转:弧度;平移:米),fixed关节无需设置。effort:关节最大输出力 / 力矩(单位:N/N・m,用于仿真)。velocity:关节最大运动速度(单位:rad/s/m/s,用于仿真)。
<dynamics>:关节动力学参数(可选,用于仿真):damping:关节阻尼系数(阻碍运动,模拟摩擦)。friction:关节静摩擦系数。
示例(旋转关节)
<joint name="joint_arm1" type="revolute">
<parent link="base_link"/> <!-- 父连杆:底座 -->
<child link="arm_link1"/> <!-- 子连杆:大臂 -->
<origin xyz="0.2 0 0.2" rpy="0 0 0"/> <!-- 关节位置:底座前端上方 -->
<axis xyz="0 1 0"/> <!-- 绕 Y 轴旋转(上下摆动) -->
<limit lower="-1.57" upper="1.57" effort="10" velocity="0.5"/> <!-- 限位 ±90°,最大力矩10N·m -->
<dynamics damping="0.1" friction="0.05"/> <!-- 阻尼和摩擦 -->
</joint>
四、工具类标签(辅助描述)
1. <material>(材质定义)
作用:定义可复用的材质(颜色、纹理),避免重复编写 <visual> 中的材质信息,可嵌套在 <robot> 下全局定义,也可在 <visual> 内局部定义。
示例(全局材质):
<robot name="my_robot">
<!-- 全局材质定义 -->
<material name="red">
<color rgba="1 0 0 1"/> <!-- 不透明红色 -->
</material>
<material name="gray">
<texture filename="package://my_pkg/textures/metal.png"/> <!-- 纹理图片 -->
</material>
<!-- 连杆中复用材质 -->
<link name="arm_link1">
<visual>
<geometry><cylinder length="0.8" radius="0.05"/></geometry>
<material name="red"/> <!-- 引用全局材质 -->
</visual>
</link>
</robot>
2. <xacro:include>/<xacro:property>(Xacro 扩展标签)
说明:URDF 本身不支持参数化、循环等逻辑,需通过 Xacro(XML Macro) 扩展(ROS 内置支持),常用标签:
<xacro:include filename="package://功能包名/路径/其他文件.xacro"/>:导入其他 Xacro/URDF 文件,实现模块化(如分文件定义连杆、关节)。<xacro:property name="参数名" value="值" />:定义参数(如尺寸、质量),便于统一修改(如<xacro:property name="arm_length" value="0.8"/>)。<xacro:macro>:自定义宏指令,批量生成重复结构(如多轮机器人的轮子连杆 + 关节)。
注意:Xacro 文件后缀为 .xacro,使用时需先转换为 URDF(rosrun xacro xacro my_robot.xacro > my_robot.urdf)或直接在 Launch 文件中加载(command="$(find xacro)/xacro '$(find my_pkg)/urdf/my_robot.xacro'")。
3. <gazebo>(仿真扩展标签)
作用:URDF 本身仅描述机器人结构,若需在 Gazebo 中仿真,需通过 <gazebo> 标签添加仿真专属属性(如摩擦力、阻尼、插件),嵌套在 <robot> 下。
示例(设置连杆摩擦系数):
<gazebo reference="wheel_link1"> <!-- reference 关联连杆名 -->
<mu1 value="0.8"/> <!-- 滑动摩擦系数 -->
<mu2 value="0.8"/>
<kp value="1000.0"/> <!-- 接触刚度 -->
<kd value="10.0"/> <!-- 接触阻尼 -->
</gazebo>
案例
需求:
创建一个底盘为长方体的机器人模型,在长方体的前面添加一摄像头,摄像头可以绕Z轴360°旋转。
实现步骤:
在上一篇(在Rviz中渲染URDF模型的基本流程)中,我们已经创建了功能包“urdf01_rviz”,本案例在此基础上继续实现上述需求。

新建一个urdf文件
该urdf文件内容如下,定义了机器人及其搭载的摄像头的外观,以及两者之间的连接关系
<!-- 需求:设置机器人底盘,并添加摄像头 -->
<robot name="mycar">
<!-- 1.底盘link -->
<link name="base_link">
<visual>
<geometry>
<!-- 长宽高分为0.3、0.2、0.1m的长方体 -->
<box size="0.3 0.2 0.1" />
</geometry>
<!-- 设置平移和旋转 -->
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="base_link_color">
<color rgba="0.8 0.5 0 0.5" />
</material>
</visual>
</link>
<!-- 2.摄像头link -->
<link name="camera">
<visual>
<geometry>
<box size="0.02 0.05 0.05" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="camera_color">
<color rgba="0 0 1 0.5" />
</material>
</visual>
</link>
<!-- 3.关节 -->
<joint name="camera2base" type="continuous">
<!-- 父级 link -->
<parent link="base_link" />
<!-- 子级 link -->
<child link="camera" />
<!-- 子级Link相对于父级Link的偏移量 -->
<origin xyz="0.12 0 0.075" rpy="0 0 0" />
<!--设置关节旋转参考的坐标轴为Z轴 -->
<axis xyz="0 0 1" />
</joint>
</robot>
为了在rviz中显示urdf模型,这里创建一个launch文件

文件内容如下:
<launch>
<!-- 1.在参数服务器载入 urdf 文件 -->
<param name="robot_description" textfile="$(find urdf01_rviz)/urdf/urdf/demo02_joint.urdf" />
<!-- 2.启动 rviz -->
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf01_rviz)/config/show_mycar.rviz"/>
</launch>
此时运行“roslaunch urdf01_rviz demo02_joint.launch”可以看到效果如下,摄像头的位置不太对,并且显示“No transform from [camera] to [base_link]”的错误。这是因为rviz 显示 URDF 时,必须发布不同部件之间的坐标系关系。

在launch启动文件中加入关节和机器人状态发布节点

重新使用该launch文件启动后可以看到摄像机位置正常了

如果想让摄像机转动,我们需要再添加一个控制关节运动的节点

<launch>
<!-- 1.在参数服务器载入 urdf 文件 -->
<param name="robot_description" textfile="$(find urdf01_rviz)/urdf/urdf/demo02_joint.urdf" />
<!-- 2.启动 rviz -->
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf01_rviz)/config/show_mycar.rviz"/>
<!-- 关节状态发布节点 -->
<!-- <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" /> -->
<!-- 机器人状态发布节点 -->
<node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />
<!-- 控制关节运动的节点 -->
<node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" />
</launch>
此时就可以使用小窗口中的滑条来控制摄像机的转动了

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)