URDF定义

URDF格式是ROS用来描述机器人的符合XML语言规范的描述文件。 为了方便查看,将常用的urdf格式文件的元素定义做成了一张简表。

# Xacro扩展 #### 常量定义 ```xml ``` #### 常量使用 使用${}。其中还可包含常用数学运算,例如: ```xml ``` #### 宏定义 ```xml ... ``` #### 宏定义的使用 ```xml ``` #### 文件包含 ```xml ```
urdf文件的检查和显示
可以采用如下命令检查urdf文件的合法性:
 
check_urdf myrobot.urdf
对于扩展的myrobot.xacro文件,可以使用如下方法:
 
check_urdf < (xacro myrobot.xacro)
模型的显示有两种方法:
 
方法一,直接在shell中使用命令:
roslaunch urdf_tutorial display.launch model:='$(find myrobot_config)/config/myrobot.xacro'
其中myrobot_config是一个关于机器人配置的package。另外,model后面也可以接一个绝对的文件路径。
 
方法二,编写一个launch文件,内容如下:
<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>

机械臂的urdf示例

首先,需要对机器人的link和joint的定义以及编号有一个清晰的认识。我们选择采用《机器人学导论》中的link和joint描述方法。现在以一个2dof的简单机械臂作为示例来编写一个URDF文件并在rviz中展示。该机械臂的描述见下图:
URDF格式-robot.jpg

该图中将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>

通过rviz可以得到如下的显示效果,并能通过joint_state_publisher的小窗口中的滑块让机械臂运动起来
rviz_disp.png