一、URDF
URDF(Unified Robot Description Format)是一种特殊的XML文件格式。
URDF形成通常有三种途径:

直接使用URDF的XML tag进行文件编写。
使用XACRO建模后转为URDF文件。
使用SolidWorks进行三维建图后使用SW2URDF插件转换为URDF文件。
URDF文件介绍:

  1. link和joint

URDF描述上图机器人结构:

<robot name="test_robot">
  <link name="link1" />
  <link name="link2" />
  <link name="link3" />
  <link name="link4" />

  <joint name="joint1" type="continuous">
    <parent link="link1"/>
    <child link="link2"/>
  </joint>

  <joint name="joint2" type="continuous">
    <parent link="link1"/>
    <child link="link3"/>
  </joint>

  <joint name="joint3" type="continuous">
    <parent link="link3"/>
    <child link="link4"/>
  </joint>
</robot>

2.位置
定义好机器人的骨架后,我们需要进一步用origin子标签对link所在的位置进行定义。link的位置由joint决定,因此该子标签定义在joint内。

<robot name="test_robot">
  <link name="link1" />
  <link name="link2" />
  <link name="link3" />
  <link name="link4" />


  <joint name="joint1" type="continuous">
    <parent link="link1"/>
    <child link="link2"/>
    <origin xyz=".5 .3 0.7" rpy="0 0 0" />
  </joint>

  <joint name="joint2" type="continuous">
    <parent link="link1"/>
    <child link="link3"/>
    <origin xyz="-.2 .5 -0.3" rpy="0 0 1.57" />
  </joint>

  <joint name="joint3" type="continuous">
    <parent link="link3"/>
    <child link="link4"/>
    <origin xyz=".5 0 0.2" rpy="0 0 -1.57" />
  </joint>
</robot>

上述位置关系定义如下图所示:

3.形状
通过visual标签和geometry标签定义link的形状。下面示例了一些常用的形状, 以及可能会导入的一些奇形怪状的东西. 不但可以导入stl格式的文件, 还可以导入dae格式。下述示例中导入了一个小刀。

<?xml version="1.0"?>
<robot name="test_robot">
  <link name="link1">
    <visual>
      <geometry>
        <cylinder length="0.6" radius="0.2" />
      </geometry>
    </visual>
  </link>

  <link name="link2">
    <visual>
      <geometry>
        <box size="0.6 0.2 .1" />
      </geometry>
    </visual>
  </link>

  <link name="link3" >
    <visual>
      <geometry>
        <sphere radius="0.2"/>
      </geometry>
    </visual>
  </link>

  <link name="link4" >
    <visual>
      <origin rpy="0 -1.57 0" xyz="0 0 0"/>
      <geometry>
        <mesh filename="package://urdf_csdn/urdf/mesh/knife.stl"/>
      </geometry>
    </visual>
  </link>


  <joint name="joint1" type="fixed">
    <parent link="link1"/>
    <child link="link2"/>
    <origin xyz="0.22 0 0.6" rpy="0 1.57 0" />
  </joint>

  <joint name="joint2" type="continuous">
    <parent link="link1"/>
    <child link="link3"/>
    <origin xyz="-0.1 0.5 0" />
  </joint>

  <joint name="joint3" type="fixed">
    <parent link="link3"/>
    <child link="link4"/>
    <origin xyz=".5 0 0" rpy="0 0 -1.57" />
  </joint>
</robot>

4.collision和joint限制
为了避免link之间发生碰撞,所以针对每一个link,还有一个collision标签,和visual标签内容完全一样。
还可以对joint的运动进行限制。比如,我们限制joint只能沿着y轴旋转,可以定义标签<axis xyz="0 1 0"/>。我们也可以限制joint的运动范围,速度,力矩进行限制,则可以添加<limit lower="-3.14" upper="3.14" effort="150.0" velocity="3.15"/>。

<?xml version="1.0"?>
<robot name="test_robot">
  <link name="link1">
    <visual>
      <geometry>
        <cylinder length="0.6" radius="0.2" />
      </geometry>
    </visual>
    <collision>
      <origin xyz="0.0 0 0.0" rpy="0 0 0" />
      <geometry>
        <cylinder length="0.6" radius="0.2" />
      </geometry>
    </collision>
  </link>

  <link name="link2">
    <visual>
      <geometry>
        <box size="0.6 0.2 .1" />
      </geometry>
    </visual>
  </link>

  <link name="link3" >
    <visual>
      <geometry>
        <sphere radius="0.2"/>
      </geometry>
    </visual>
  </link>

  <link name="link4" >
    <visual>
      <origin rpy="0 -1.57 0" xyz="0 0 0"/>
      <geometry>
        <mesh filename="package://urdf_csdn/urdf/mesh/knife.stl"/>
      </geometry>
    </visual>
  </link>


  <joint name="joint1" type="fixed">
    <parent link="link1"/>
    <child link="link2"/>
    <origin xyz="0.22 0 0.6" rpy="0 1.57 0" />
  </joint>

  <joint name="joint2" type="continuous">
    <parent link="link1"/>
    <child link="link3"/>
    <origin xyz="-0.1 0.5 0" />
    <axis xyz="0 1 0"/>
    <limit lower="-3.14" upper="3.14" effort="150.0" velocity="3.15"/>
  </joint>

  <joint name="joint3" type="fixed">
    <parent link="link3"/>
    <child link="link4"/>
    <origin xyz=".5 0 0" rpy="0 0 -1.57" />
  </joint>
</robot>

5.可视化
通过rviz显示URDF文件,可以使用命令:

roslaunch urdf_tutorial display.launch model:=path/to/your/xxx.urdf

如上述内容,进行显示之后,,可以得到下图所示内容。 坐标系图示,需要添加TF条目进行显示。值得注意的地方,将Global Options中的fixed frame设定为link1。

如果设置了可移动joint,你想查看joint移动的效果和设定,可以使用命令:

roslaunch urdf_tutorial display.launch model:=path/to/your/xxx.urdf gui:=true

SRDF

<?xml version="1.0"?>
<robot name="excavator_real_model">
	<group name="manipulator">
		<chain base_link="base_link" tip_link="end_effector" />
	</group>
</robot>

用rviz显示URDF

标准roslaunch文件:

<launch>
	<arg name="model" default="$(find excavator_proj)/rbt_desc/excavator_robot.urdf" />
	<arg name="gui" default="true" />

	<param name="use_gui" value="$(arg gui)" />
	<param name="robot_description" textfile="$(arg model)" />
	
	<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" required="true" />

</launch>

如果有SRDF文件,则可以像下面那样写:

<launch>
	<arg name="model" default="$(find excavator_proj)/rbt_desc/excavator_robot.urdf" />
	<arg name="gui" default="true" />

	<!-- The semantic description -->
	<param name="robot_description_semantic" textfile="$(find excavator_real_model)/urdf/excavator_real_model.srdf" />

	<param name="use_gui" value="$(arg gui)" />
	<param name="robot_description" textfile="$(arg model)" />
	
	<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" required="true" />

</launch>