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节点中)处理摄像机的数据,这些数据可能来自实际的硬件或其他仿真源。
原文地址:https://blog.csdn.net/weixin_47695827/article/details/142783644
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!