URDF文件编写语法
urdf文件是标准xml文件,预定义了一些列标签用于描述机器人模型,主要分为两类连杆(link)与关节(joint)
- 连杆:机器人的可见部分,即刚体部分
- 关节:连杆之间饿关系连接(关节),但是关节这部分在直观上是不可见的
- robot:类似跟标签的存在
- gazebo:gazebo仿真时使用的标签,用于配置机器人的所需参数,如机器人的材料属性,gazebo插件等,但这类标签并不必须,只有在需要仿真时设置。
(1)robot标签
urdf为了保证xml文件语法完整性,使用robot标签作为跟标签,所有的 link 和 joint 以及其他标签都必须包含在 robot 标签内,在该标签内可以通过 name 属性设置机器人模型的名称。
(2)link标签
描述机器人某部件的外观和刚体属性,比如: 机器人底座、轮子、激光雷达、摄像头…每一个部件都对应一个 link, 在 link 标签内,可以设计该部件的形状、尺寸、颜色、惯性矩阵、碰撞参数等一系列属性
编写urdf文件时,关键在于要理清层级关系
1.属性
name —> 为连杆命名
2.子标签
visual —> 描述外观(对应的数据是可视的)
① geometry 设置连杆的几何形状
标签1: box(盒状)
属性:size=长(x) 宽(y) 高(z)
标签2: cylinder(圆柱)
属性:radius=半径 length=高度
标签3: sphere(球体)
属性:radius=半径
标签4: mesh(为连杆添加皮肤)
属性: filename=资源路径(格式:\package:///
示例如下:
<!-- 设置不同形状的机器人部件 -->
<robot name="mycar">
<link name="base_link">
<!-- 可视化标签 -->
<visual>
<!-- 形状 -->
<geometry>
<!-- 立方体 -->
<!-- <box size="0.3 0.2 0.1"/> -->
<!-- 圆柱体-->
<!-- <cylinder radius="0.2" length="1"/> -->
<!-- 球体-->
<!-- <sphere radius="1"/> -->
<!-- 添加皮肤 -->
<mesh filename="package://urdf_rviz/meshes/autolabor_mini.stl"/>
</geometry>
</visual>
</link>
</robot>
②origin 设置偏移量与倾斜弧度
属性1: xyz=x偏移 y便宜 z偏移
属性2: rpy=x翻滚 y俯仰 z偏航 (单位是弧度)
示例如下:
<!-- 偏移量与倾斜弧度 -->
<!-- xyz:设置分别在xyz上的偏移量
rpy用于设置xyz三个方向的旋转角 -->
<origin xyz='0 0 0' rpy='1.57 0 0'/>
③metrial 设置材料属性(颜色)
属性: name
标签: color
属性: rgba=红绿蓝权重值与透明度 (每个权重值以及透明度取值[0,1])
示例如下:
<!-- 颜色 -->
<!-- rgba:
rgb三原色,a透明度,四个值取值都在0到1之间 -->
<material name="car_color">
<color rgba = "0.7 0.34 0.8 0.5"/>
</material>
collision —> 连杆的碰撞属性
Inertial —> 连杆的惯性矩阵
(3)joint标签
urdf 中的 joint 标签用于描述机器人关节的运动学和动力学属性,还可以指定关节运动的安全极限,机器人的两个部件(分别称之为 parent link 与 child link)以"关节"的形式相连接,不同的关节有不同的运动形式: 旋转、滑动、固定、旋转速度、旋转角度限制…,比如:安装在底座上的轮子可以360度旋转,而摄像头则可能是完全固定在底座上。joint标签对应的数据在模型中是不可见的。
- 属性
- name —> 为关节命名
- type —> 关节运动形式
- continuous: 旋转关节,可以绕单轴无限旋转
- revolute: 旋转关节,类似于 continues,但是有旋转角度限制
- prismatic: 滑动关节,沿某一轴线移动的关节,有位置极限
- planer: 平面关节,允许在平面正交方向上平移或旋转
- floating: 浮动关节,允许进行平移、旋转运动
- fixed: 固定关节,不允许运动的特殊关节
- 子级标签
-
parent(必需的)
parent link的名字是一个强制的属性:
- link:父级连杆的名字,是这个link在机器人结构树中的名字。
-
child(必需的)
child link的名字是一个强制的属性:
- link:子级连杆的名字,是这个link在机器人结构树中的名字。
-
origin
- 属性: xyz=各轴线上的偏移量 rpy=各轴线上的偏移弧度。
-
axis
- 属性: xyz用于设置围绕哪个关节轴运动。
<!-- 需求:设置机器人底盘,并添加摄像头 -->
<robot name="mycar">
<!-- 1 底盘link -->
<link name="base_link">
<!-- 可视化标签 -->
<visual>
<!-- 形状 -->
<geometry>
<!-- 立方体 -->
<box size="0.3 0.2 0.1"/>
</geometry>
<!-- 偏移量与倾斜弧度 -->
<!-- xyz:设置分别在xyz上的偏移量
rpy用于设置xyz三个方向的旋转角 -->
<origin xyz='0 0 0' rpy='0 0 0'/>
<!-- 颜色 -->
<!-- rgba:
rgb三原色,a透明度,四个值取值都在0到1之间 -->
<material name="car_color">
<color rgba = "0.3 0.4 0.8 0.8"/>
</material>
</visual>
</link>
<!-- 2 摄像头link -->
<link name="camera">
<!-- 可视化标签 -->
<visual>
<!-- 形状 -->
<geometry>
<!-- 立方体 -->
<box size="0.03 0.05 0.05"/>
</geometry>
<!-- 偏移量与倾斜弧度 -->
<!-- xyz:设置分别在xyz上的偏移量
rpy用于设置xyz三个方向的旋转角 -->
<origin xyz='0 0 0.025' rpy='0 0 0'/>
<!-- 需要上移半个摄像头的高度,才不会导致摄像头内嵌在机器人车体里 -->
<!-- 颜色 -->
<!-- rgba:
rgb三原色,a透明度,四个值取值都在0到1之间 -->
<material name="car_color">
<color rgba = "0 1 0 0.8"/>
</material>
</visual>
</link>
<!-- 3 关节 -->
<joint name="camera_to_link" type="continuous">
<!-- 父级link -->
<parent link="base_link"/>
<!-- 子级link -->
<child link="camera"/>
<!-- 设置偏移量 -->
<origin xyz='0.13 0 0.05' rpy='0 0 0'/>
<!-- 设置关节旋转参考的坐标轴 -->
<axis xyz='0 0 1'/>
</joint>
</robot>
launch文件编写:
<launch>
<!-- 1、在参数服务器载入urdf文件 -->
<param name="robot_description" textfile="$(find urdf_rviz)/urdf/urdf/joint.urdf"/>
<!-- 2、启动rviz -->
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf_rviz)/config/showmycar.rviz"/>
<!-- 注意:只有上述两条语句时会抛出异常:显示位置与颜色异常,给出提示 no transform from camera to baselink(缺少坐标变换) -->
<!-- 原因:rviz中显示urdf时.必须发布不同部件之间的坐标系关系 -->
<!-- 解决:ROS中提供的关于机器人模型显示的坐标发布相关节点(joint_state_publisher 和 robot_state_publisher) -->
<!-- 关节状态发布节点 -->
<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>
注意:关节控制节点不是必须的,它的作用在于提供一个控制关节节点运动的UI界面,便于调试urdf文件是否正常。