目录

 一、准备

概念

标签简介

一、根标签:

二、连杆相关标签:

1. 核心标签:

2. 子标签 1: (可视化外观)

4. 子标签 3: (惯性属性)

三、关节相关标签:

1. 核心标签:

四、工具类标签(辅助描述)

1.  (材质定义)

2.  / (Xacro 扩展标签)

3.  (仿真扩展标签)

案例


 一、准备

通过如下指令(或: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_linkarm_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_arm1wheel_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>

此时就可以使用小窗口中的滑条来控制摄像机的转动了

Logo

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

更多推荐