URDF定义
URDF格式是ROS用来描述机器人的符合XML语言规范的描述文件。 为了方便查看,将常用的urdf格式文件的元素定义做成了一张简表。
<joint> | name="joint nane",type="continuous(无限旋转)/fixed(固定关节)/revolute(旋转)/prismatic(移动)" | |||
<origin xyz="1,2,3", rpy="0,0,0">,指定相对于父link的坐标变换,其中xyz为相对的位置,rpy为相对的方向 | ||||
<parent link="link nane">,指定父link的名称。 | ||||
<child link="link nane" />,指定子link的名称。 | ||||
<axis xyz="1 0 0 " />,指定那个轴为运动轴,如"0 1 0 "表示运动轴为y轴,默认为"1 0 0 "。 | ||||
<limit lower='0' upper='3.14159' effort='300' velocity='1'>,对于旋转和移动关节是必需的,设置它的运动范围、作用力以及速度的限制。 | ||||
<link> | name="link name" | |||
<visual> | <origin>,同joint->origin | |||
<geometry | <box size:="1.0 2.0 3.0">,size为xyz方向上的尺寸 | |||
<cylinder length="1.0" radius="1.0" /> | ||||
<sphere radius="1.0" /> | ||||
<mesh filename="xxx" scale="1.0" />,模型文件可以是.dae、.stl。 | ||||
<material> | name="xxx" | |||
<color rgba="1 2 3 4" /> | ||||
<texture filename="xxx" /> | ||||
<inertial> | <origin>,同joint->origin,指定连杆的惯性坐标系的方位。且惯性坐标系原点与重心须一致。 | |||
<mass value="1.0" />,指定连杆的质量 | ||||
<inertia ixx="0" ixx="0" ixx="0" ixx="0" ixx="0" ixx="0" />,指定连杆的惯性二阶矩。 ![]() | ||||
<collision> | 说明:碰撞模型通常与外观模型一样,且为减少计算量应尽可能精简。 | |||
name="nane" | ||||
<origin>,同joint->origin。 | ||||
<geometry>,同link->visual中的geometry。 |
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中展示。该机械臂的描述见下图:
该图中将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的小窗口中的滑块让机械臂运动起来