一、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>