URDF格式是ROS用来描述机器人的符合XML语言规范的描述文件。 为了方便查看,将常用的urdf格式文件的元素定义做成了一张简表。
可以采用如下命令检查urdf文件的合法性:
check_urdf myrobot.urdf
对于扩展的myrobot.xacro文件,可以使用如下方法:
check_urdf < (xacro myrobot.xacro)
模型的显示有两种方法:
roslaunch urdf_tutorial display.launch model:='$(find myrobot_config)/config/myrobot.xacro'
其中myrobot_config是一个关于机器人配置的package。另外,model后面也可以接一个绝对的文件路径。
<launch>
<arg name="model" default="$(find myrobot_config)/config/myrobot.xacro"/>
<arg name="gui" default="true" />
<arg name="rvizconfig" default="$(find urdf_tutorial)/rviz/urdf.rviz" />
<param name="robot_description" command="$(find xacro)/xacro.py $(arg model)" />
<param name="use_gui" value="$(arg gui)"/>
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" required="true" />
launch>
首先,需要对机器人的link和joint的定义以及编号有一个清晰的认识。我们选择采用《机器人学导论》中的link和joint描述方法。现在以一个2dof的简单机械臂作为示例来编写一个URDF文件并在rviz中展示。该机械臂的描述见下图:
该图中将joint_0的坐标原点与joint_1的坐标原点重合,z轴重合,这样可以简化运动学的计算。同时,加入base_link也是为了rviz的显示需要,在rviz中需要一个固定的坐标系,默认是取用一个fixed类型的joint的坐标系。而URDF中定义joint必须定义与之关联的前后两个link。因此就加入一个base_link。
下面就根据每一个joint,以及前后的link来逐步的手工编写urdf文件。首先是joint_0,其父link为base_link,子link为link_0。其内容为:
<link name="base_link"/>
<visual>
<geometry>
<box size='0.14 0.11 ${H_b}' />
geometry>
visual>
link>
<joint name='joint_0' type='fixed'>
<origin xyz='0 0 ${H_b/2+H_0+H_1/2}' rpy='0 0 0' />
<parent link='base_link' />
<child link='link_0' />
joint>
<link name='link_0'>
<visual>
<oring xyz='0 0 ${-(H_1/2+H_0/2)}' rpy='0 0 0' />
<geometry>
<cylinder lenght='${H_0}' radius='${R_0}' />
geometry>
visual>
link>
上面使用了xacro扩展的常量定义,H_b、H_0和H_1分别表示各个link的高度,R_0表示圆柱型link_0的半径。注意,我们将joint_0的坐标原点上移到与joint_1重合的位置。但由于link_0的放置坐标是基于joint_0的,而其自身的坐标中心为其重心,因此放置时需要将其向下偏移。
然后为joint_1以及对应的link_1:
<joint name='joint_1' type='revolute'>
<limit effort='300' velocity='1' lower='0' upper='${PI}' />
<origin xyz='0 0 0' rpy='0 0 0' />
<parent link='link_0' />
<child link='link_1' />
<axis xyz='0 0 1' />
joint>
<link name='link_1' >
<visual>
<origin xyz='0 0 0' rpy='0 0 0' />
<geometry>
<box size='0.08 0.08 ${H_1}' />
<geometry>
visual>
link>
对于joint_1,由于其是一个旋转关节,因此就必须为其添加limit信息。同时也必须通过指定其绕z轴旋转,因为默认是绕x轴旋转的。
joint_2的处理稍微复杂一点,其坐标系相对于joint_1进行了绕x轴90度的旋转。在urdf中使用RPY角度来描述旋转,因此绕x轴90度对应的值为"pi/2 0 0"。同时link_2的中心也相较于joint_2的坐标原点在x轴上进行了偏移。所以关于joint_2和linke_2的定义为:
<joint name='joint_2' type='revolute'>
<limit effort='300' velocity='1' lower='0' upper='${PI}' />
<origin xyz='0 0 0' rpy='${PI/2} 0 0' />
<parent link='link_1' />
<child link='link_2' />
<axis xyz='0 0 1' />
joint>
<link name='link_2' >
<visual>
<origin xyz='${L_2/2} 0 0' rpy='0 0 0' />
<geometry>
<box size='${L_2} 0.05 0.03' />
<geometry>
visual>
link>