URDF(Unified Robot Description Format)

URDF(Unified Robot Description Format)

URDF(Unified Robot Description Format)是一个基于XML的语法框架,用于在机器人操作系统(ROS)中描述和定义机器人模型。URDF文件通过一系列标签来定义机器人的结构、外观和物理属性。以下是URDF中主要标签的详细解释:

1. robot标签

  • 定义:root标签,即根标签,用于包含整个URDF文件的内容。
  • 属性
    • name:指定机器人模型的名称。

2. link标签

  • 定义:用于描述机器人某个部件(也即刚体部分)的外观和物理属性,如底座、轮子、激光雷达、摄像头等。
  • 属性
    • name:为连杆命名。
  • 子标签
    • <visual>:描述连杆的外观属性。
      • <geometry>:设置连杆的形状,如立方体(<box>)、圆柱体(<cylinder>)、球体(<sphere>)或自定义的3D模型(<mesh>)。
      • <origin>:设置连杆的偏移量和旋转角度。
      • <material>:设置材质属性,如颜色(<color>)和纹理(<texture>)。
    • <collision>:描述连杆的碰撞属性,可以与视觉属性一致,也可以不同。
    • <inertial>:设置连杆的质量、质心位置和中心惯性特性。

3. joint标签

  • 定义:用于描述机器人关节的运动学和动力学属性,以及关节运动的安全极限。
  • 属性
    • name:为关节命名。
    • type:指定关节的运动形式,如旋转关节(revolute,有旋转角度限制;continuous,可以绕单轴无限旋转)、滑动关节(prismatic,沿某一轴线移动的关节,有位置极限)、平面关节(planar,允许在平面正交方向上平移或旋转)、浮动关节(floating,允许进行平移、旋转运动)和固定关节(fixed,不允许运动的特殊关节)。
  • 子标签
    • <parent>:指定父连杆的名字。
    • <child>:指定子连杆的名字。
    • <origin>:设置关节的偏移量和旋转角度。
    • <axis>:指定关节的旋转或移动轴。
    • <limit>:设置关节运动的限制范围、力矩限制和速度限制。

4. 其他常用标签

  • :定义材质属性,可以在<robot>标签中定义,然后在<link>中按名称进行引用。
  • :设置rgba材质的颜色,由代表red/green/blue/alpha的四个数字组成,每个数字的范围为[0,1]。
  • :设置材质的纹理,由filename属性指定纹理文件的路径。

5. 注意事项

  • URDF文件必须保证XML语法的完整性,因此必须使用<robot>标签作为根标签,所有的<link><joint>以及其他标签都必须包含在<robot>标签内。
  • 在定义<link>时,需要为每个部件指定一个唯一的名称,并在<visual><collision><inertial>等子标签中详细描述其外观、碰撞和物理属性。
  • 在定义<joint>时,需要指定父连杆和子连杆的名字,并设置关节的运动形式、偏移量、旋转角度、移动轴和运动限制等参数。

通过合理使用这些标签和属性,可以在URDF文件中精确地描述机器人的结构、外观和物理属性,从而为后续的机器人仿真和控制提供基础。

URDF文件示例:

以下是一个详细的simple_robot.urdf文件示例,它描述了一个简单的机器人模型,该模型包含一个底座(base_link)和一个可以在Z轴上旋转的摄像头(camera_link)。

<robot name="simple_robot">
    <!-- 底座link -->
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.2 0.2 0.1"/> <!-- 设置底座为长方体,尺寸为0.2x0.2x0.1米 -->
            </geometry>
            <origin xyz="0 0 0" rpy="0 0 0"/> <!-- 设置底座的偏移量和旋转角度为默认值 -->
            <material name="base_material">
                <color rgba="0.1 0.2 0.5 1"/> <!-- 设置底座的颜色为蓝色 -->
            </material>
        </visual>
        <collision>
            <geometry>
                <box size="0.2 0.2 0.1"/> <!-- 碰撞属性与视觉属性一致 -->
            </geometry>
        </collision>
        <inertial>
            <mass value="1.0"/> <!-- 设置底座的质量为1.0千克 -->
            <origin xyz="0 0 0" rpy="0 0 0"/> <!-- 设置质心位置为底座的中心 -->
            <inertia ixx="0.01" ixy="0" ixz="0" iyy="0.01" iyz="0" izz="0.01"/> <!-- 设置惯性矩阵 -->
        </inertial>
    </link>

    <!-- 摄像头link -->
    <link name="camera_link">
        <visual>
            <geometry>
                <cylinder radius="0.02" length="0.05"/> <!-- 设置摄像头为圆柱体,半径为0.02米,长度为0.05米 -->
            </geometry>
            <origin xyz="0 0 0.1" rpy="0 1.57 0"/> <!-- 设置摄像头的偏移量和旋转角度,使其位于底座上方0.1米处,并绕Y轴旋转90度 -->
            <material name="camera_material">
                <color rgba="1 0.5 0 1"/> <!-- 设置摄像头的颜色为红色 -->
            </material>
        </visual>
        <collision>
            <geometry>
                <cylinder radius="0.02" length="0.05"/> <!-- 碰撞属性与视觉属性一致 -->
            </geometry>
        </collision>
        <inertial>
            <mass value="0.1"/> <!-- 设置摄像头的质量为0.1千克 -->
            <origin xyz="0 0 0.025" rpy="0 1.57 0"/> <!-- 设置质心位置为摄像头的中心 -->
            <inertia ixx="0.000004" ixy="0" ixz="0" iyy="0.000004" iyz="0" izz="0.000001"/> <!-- 设置惯性矩阵 -->
        </inertial>
		
        <gazebo reference="camera_link">  
            <sensor name="camera_sensor" type="camera">  
                <!-- 这里可以放置一些用于Gazebo插件识别的参数,但这些不是URDF标准属性 -->  
                <!-- 例如,你可能需要指定分辨率、视野、噪声模型等 -->  
                <!-- 这些参数将取决于你使用的Gazebo相机插件 -->  
            </sensor>  
        </gazebo>  
    </link>

    <!-- 连接底座和摄像头的关节 -->
    <joint name="base_to_camera" type="revolute">
        <parent link="base_link"/> <!-- 指定父连杆为底座 -->
        <child link="camera_link"/> <!-- 指定子连杆为摄像头 -->
        <origin xyz="0 0 0.1" rpy="0 1.57 0"/> <!-- 设置关节的偏移量和旋转角度,使摄像头位于底座上方0.1米处,并绕Y轴旋转90度 -->
        <axis xyz="0 0 1"/> <!-- 设置关节的旋转轴为Z轴 -->
        <limit lower="-3.14" upper="3.14" effort="10" velocity="1.57"/> <!-- 设置关节的旋转限制、最大力矩和最大速度 -->
    </joint>
</robot>

在这个示例中:

  • <robot> 标签是根标签,包含了整个机器人模型的描述。
  • <link> 标签用于描述机器人部件(底座和摄像头)的外观和物理属性。
    • 每个 <link> 标签都有一个唯一的 name 属性。
    • <visual> 子标签用于描述部件的外观,包括形状、颜色和材质。
    • <collision> 子标签用于描述部件的碰撞属性。
    • <inertial> 子标签用于描述部件的质量和惯性矩阵。
  • <joint> 标签用于描述连接底座和摄像头的关节的运动学和动力学属性。
    • type="revolute" 表示这是一个旋转关节。
    • <parent><child> 子标签指定了关节连接的父连杆和子连杆。
    • <origin> 子标签设置了关节的偏移量和旋转角度。
    • <axis> 子标签设置了关节的旋转轴。
    • <limit> 子标签设置了关节的旋转限制、最大力矩和最大速度。

这个URDF文件可以在ROS中使用rviz工具进行可视化,或者用于后续的机器人仿真和控制。注意:/your_path/simple_robot.urdf替换为正确的路径。

ros2 launch urdf_tutorial display.launch.py model:=/your_path/simple_robot.urdf

注意: <gazebo><sensor> 标签不是URDF标准的一部分。它们是为了在Gazebo中使用而添加的,但不会被URDF解析器直接识别或处理。要在Gazebo中添加一个功能性的摄像机传感器,你通常需要做以下几步:

  • 在URDF中定义摄像机的物理位置(就像上面所做的那样,但没有<gazebo><sensor>标签)。
  • 在Gazebo的SDF文件中,或者在URDF加载到Gazebo时通过Gazebo的启动脚本,添加一个摄像机传感器模型。
  • 使用Gazebo的相机插件(如libgazebo_ros_camera.so)来模拟摄像机的行为。
  • 在ROS中,你可能还需要配置一个相机节点来接收和处理来自Gazebo的相机数据。

如果你只是想在URDF中标记摄像机的位置,并不打算在Gazebo中模拟其功能,那么你可以省略<gazebo><sensor>标签,只需确保摄像机的物理位置在URDF中正确定义即可。然后,你可以在Gazebo的外部(例如,在ROS节点中)处理摄像机的数据,这些数据可能来自实际的硬件或其他仿真源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值