URDF模型

    URDF模型用于反映机器人各个组件之间的位置关系,包括车体、驱动轮、相机、激光雷达等,是ROS的robot_state_publisher用来给机器人发布tf关系的。
    URDF模型使用xml格式编写,可以使用网格模型网格对象(STL或Collada)、简单的方体或圆柱体等组件。

URDF描述文件

    以下用一个实例来描述URDF文件的构成。

    我们先写一个link作为基础:
01-myrobot.urdf

<?xml version="1.0"?>
<robot name="myrobot">
	<link name="link_1">
		<visual>
			<geometry>
				<cylinder length="0.6" radius="0.1"/>
			</geometry>
		</visual>
	</link>
</robot>

第一行:声明xml格式,以及版本号
第二行:<robot>标签定义了机器人的name:myrobot
第三行:<link>标签定义了link的name:link_1
第四行:<visual>标签定义link的可视化属性其包括:geometry、origin、material三个属性
第五行:<geometry>标签定义link的几何属性,可以是cylinder、box等,还可以是STL文件
第六行:<cylinder>定义了link为圆柱体

    我们再定义两个link、一个joint:joint描述的是两个joint之间的连接关系。
02-myrobot.urdf

<?xml version="1.0"?>
<robot name='myrobot'>
	<link name="link_1">
		<visual>
			<geometry>
				<cylinder length="0.6" radius="0.1"/>
			</geometry>
		</visual>
	</link>
	<link name="link_2">
		<visual>
			<geometry>
				<box size="0.6 0.1 0.2"/>
			</geometry>
			<origin rpy="0 1.57075" xyz="0 0 -0.3"/>
		</visual>
	</link>
	<joint name="joint_1" type="fixed">
		<parent link="link_1"/>
		<child link="link_2"/>
		<origin rpy="0 0 0" xyz="0 -0.22 0.25"/>
		<axis xyz="0 0 0"/>
	</joint>
</robot>

第十五行:<origin>标签定义了link_2的方向与位置
第十八行:<joint>标签定义了joint的name:joint_1,类型fixed
第十九行:<parent>标签指定了joint的父link
第十九行:<child>标签指定了joint的子link
第二十行:<origin>标签定义了两个link之间的位置关系
第二十一行:<axis>标签定义了两个link之间的旋转轴,一般joint属性为continuous需要定义旋转轴
简单了解了URDF描述文件的写法后,在这里编写一个简易的四轮小车模型并在rviz中显示。
03-myrobot.urdf

<?xml version="1.0"?>
<?xml version="1.0"?>
<robot name="myroobt">
	<link name="base_link">
		<visual>
			<geometry>
				<box size="0.6 0.4 0.2"/>
			</geometry>
		</visual>
	</link>
	<link name="left_front_wheel_link">
		<visual>
			<geometry>
				<cylinder length="0.05" radius="0.1"/>
			</geometry>
			<origin rpy="1.57075 0 0" xyz="0 0 0"/>
		</visual>
	</link>
	<joint name="left_front_joint" type="continuous">
		<parent link="base_link"/>
		<child link="left_front_wheel_link"/>
		<origin rpy="0 0 0" xyz="0.25 0.225 -0.05"/>
		<axis rpy="0 0 0" xyz="0 1 0"/>
	</joint>

	<link name="right_front_wheel_link">
		<visual>
			<geometry>
				<cylinder length="0.05" radius="0.1"/>
			</geometry>
			<origin rpy="1.57075 0 0" xyz="0 0 0"/>
		</visual>
	</link>
	<joint name="right_front_joint" type="continuous">
		<parent link="base_link"/>
		<child link="right_front_wheel_link"/>
		<origin rpy="0 0 0" xyz="0.25 -0.225 -0.05"/>
		<axis rpy="0 0 0" xyz="0 1 0"/>
	</joint>
	<link name="left_rear_wheel_link">
		<visual>
			<geometry>
				<cylinder length="0.05" radius="0.1"/>
			</geometry>
			<origin rpy="1.57075 0 0" xyz="0 0 0"/>
		</visual>
	</link>
	<joint name="left_rear_joint" type="continuous">
		<parent link="base_link"/>
		<child link="left_rear_wheel_link"/>
		<origin rpy="0 0 0" xyz="-0.25 0.225 -0.05"/>
		<axis rpy="0 0 0" xyz="0 1 0"/>
	</joint>
	<link name="right_rear_wheel_link">
		<visual>
			<geometry>
				<cylinder length="0.05" radius="0.1"/>
			</geometry>
			<origin rpy="1.57075 0 0" xyz="0 0 0"/>
		</visual>
	</link>
	<joint name="right_rear_joint" type="continuous">
		<parent link="base_link"/>
		<child link="right_rear_wheel_link"/>
		<origin rpy="0 0 0" xyz="-0.25 -0.225 -0.05"/>
		<axis rpy="0 0 0" xyz="0 1 0"/>
	</joint>
</robot>

URDF编写完成后,我们编写一个launch文件来启动rviz、robot_state_publisher、joint_state_publisher,观察我们的机器人模型(rviz配置文件:启动rviz,添加组件后,另存为配置文件即可)。launch文件名称为display.launch:

<launch>
  <arg name="model" default="$(find urdf_tutorial)/urdf/03-myrobot.urdf"/>
  <arg name="gui" default="true" />
  <arg name="rvizconfig" default="$(find urdf_tutorial)/rviz/urdf.rviz" />

  <param name="robot_description" command="$(find xacro)/xacro $(arg model)" />

  <node if="$(arg gui)" name="joint_state_publisher" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" />
  <node unless="$(arg gui)" name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" required="true" />

</launch>

启动launch文件:

$ cd ros_ws
$ source devel/setup.bash
$ roslaunch urdf_tutorial display.launch

运行界面如图所示:

xacro描述文件

xacro相比URDF具有更好的灵活性,可以定义宏、引入变量,也可以引入其他urdf/xacro文件。接下来我们新建一个urdf文件和一个xacro文件分别描述激光雷达和IMU并与上一节的urdf文件组成一个新的xacro文件。具体xacro语法可以参考wiki。
04-laser.urdf

<?xml version="1.0"?>
<robot>
	<link name="laser_link">
		<visual>
			<geometry>
				<cylinder length="0.06" radius="0.03"/>
			</geometry>
			<material name="black">
				<color rgba="0.1 0.1 0.1 1"/>
			</material>
			<origin xyz="0 0 0" rpy="0 0 0 "/>
		</visual>
	</link>
</robot>

05-imu.urdf.xacro

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
	<xacro:macro name="imu" params="name:=imu parent:=base_link *origin">
		<link name="${name}_link">
			<visual>
				<geometry>
					<box size="0.03 0.03 0.01"/>
				</geometry>
				<origin xyz="0 0 0" rpy="0 0 0"/>
				<material name="yellow">
					<color rgba="0.5 0.5 0 1"/>
				</material>
			</visual>
		</link>
		<joint name="${name}_joint" type="fixed">
			<xacro:insert_block name="origin"/>
			<parent link="${parent}"/>
			<child link="${name}_link"/>
		</joint>
	</xacro:macro>
</robot>

06-myrobot.urdf.xacro

<?xml version="1.0"?>
<robot name="my_robot" xmlns:xacro="http://www.ros.org/wiki/xacro">
	<!--引入其他描述文件-->
	<xacro:include filename="$(find urdf_tutorial)/urdf/03-myrobot.urdf"/>
	<xacro:include filename="$(find urdf_tutorial)/urdf/04-laser.urdf"/>
	<xacro:include filename="$(find urdf_tutorial)/urdf/05-imu.urdf.xacro"/>
	<!--定义变量-->
	<xacro:property name="use_imu" value="true"/>

	<!--imu-->
	<xacro:if value="${use_imu}">
		<xacro:imu name="imu" parent="base_link">
			<origin xyz="0.0 0 0.105" rpy="0 0 0"/>
		</xacro:imu>
	</xacro:if>

	<!--laser-->
	<joint name="laser_joint" type="fixed">
		<parent link="base_link"/>
		<child link="laser_link"/>
		<origin rpy="0 0 0" xyz="0.25 0 0.13"/>
		<axis xyz="0 0 0"/>
	</joint>
</robot>

运行launch文件启动rviz观察机器人模型如图所示:

URDF生成工具

除了编写URDF文件外,官方提供了URDF的solidworks插件,可以通过SolidWorks直接生成可用的URDF描述文件,具体步骤方法如下:

  • 第一步:安装插件
    安装sw2urdfSetup.exe插件,下载地址

  • 第二步:坐标系设置
    1)设置base_link坐标系,机器人base_link坐标系定在底盘底板中心,首先打开solidwork-打开3D模型-插入-参考几何体-点,选中底盘底板,生成一个点,该点一般默认为底盘中心;继续插入-参考几何体-坐标系,设定坐标系X、Y、Z方向,X方向向前及雷达所在方向,Y方向向左,Z方向向上,设置完成后,在左侧下拉菜单中将该坐标系名字命名为base_link。
    2)对转动关节以及传感器坐标系进行设定,设定方式参考base_link。设置结果如下:
    右前轮:front_right_wheel_Link;
    左前轮:front_left_wheel_Link;
    右后轮:back_right_wheel_Link;
    左后轮:back_left_wheel_Link;
    雷达:laser_Link;
    前gps: gps1_Link;
    后gps: gps2_Link;
    注:该模型轮子坐标点均应该选择轮子外侧点。
    3)对转动关节进行旋转轴设置:插入-参考几何体-基准轴,选择你需要设计的旋转环节,该模型需要选种轮子宽度方向的面,并重命名如下:
    右前轮:front_right_wheel;
    左前轮:front_left_wheel;
    右后轮:back_right_wheel;
    左后轮:back_left_wheel;
    设置完成后的在软件右栏中的结果如下图所示:
  • 第三步:详细内容设置
    1)按步骤一安装完插件后,在工具-File-Export as URDF

如上图所示:
设置Link Name(base_link);Global Origin Coordinate System(base_link);Link Components(选择整体模型);Number of child links(7);
2)对转动关节以及传感器坐标系进行设定
设置Link Name(front_right_wheel_Link);
Global Origin Coordinate System(front_right_wheel_Link);
Refernce Coordinate System (front_right_wheel_Link);
Refernce Axis(front_right_wheel);
Joint Type(contionous);
Link Components(选择右前轮);
Number of child links(0);
结果如下图:

其他关节设计同上,雷达与gps的Joint Type为(fixed);
第三步:Preview and Export
1)点击Preview and Export按钮,进入到如下界面

挨个点击如下分支,完成后,点击Next

生成如下界面:

挨个点击如下分支:

完成后,点击Finish保存。将保存的文件夹拷贝至工作空间中,运行display.launch文件即可以看到机器人模型。