一.利用xacro理解机器人建模

当我们创建复杂的机器人模型时,URDF的灵活性将会降低,URDF缺少的主要特性是简单的、可重用性,模块化和可编程性。

 URDF是一个单独的文件我们不能在它里面包含其他的URDF文件。这降低了代码的模块化特性。所有代码都必须放在一个文件中,这会降低代码的简单性。

使用xacro的机器人模型将满足所有这些条件。xacro的一些主要的特点如下:

*简化URDF : xacro是URDF的高级版本,他在机器人描述中创建宏并重用宏。这可以减少代码长度。此外,它还可以包含来自其他文件的宏,使代码更简单、更易读和更模块化。

*可编程性 : xacro语言在其描述中支持简单的编程语句。有变量、常量、数值表达式、条件语句等使描述更加智能和高效。

我们可以说xacro是URDF的高级版本,在需要的时候,我们可以利用ros工具将xacro定义转换为URDF。

我们可以用xacro创建

  1 <?xml version="1.0"?>
  2
  3 <robot xmlns:xacro="http://www.ros.org/wiki/xacro"
  4     xmlns:sensor="http://playerstage.sourceforge.net/gazebo/xmlschema/#sen    sor"
  5         xmlns:controller="http://playerstage.sourceforge.net/gazebo/xmlsch    ema/#controller"
  6         xmlns:interface="http://playerstage.sourceforge.net/gazebo/xmlsche    ma/#interface"
  7     name="pan_tilt">
  8
  9
 10     <xacro:property name="base_link_length" value="0.01" />
 11     <xacro:property name="base_link_radius" value="0.2" />
 12
 13     <xacro:property name="pan_link_length" value="0.4" />
 14     <xacro:property name="pan_link_radius" value="0.04" />
 15
 16     <xacro:property name="tilt_link_length" value="0.4" />
 17     <xacro:property name="tilt_link_radius" value="0.04" />
 18
 19
 20     <xacro:macro name="inertial_matrix" params="mass">
 21                <inertial>
 22                        <mass value="${mass}" />                          
 23                        <inertia ixx="0.5" ixy="0.0" ixz="0.0"
 24                                 iyy="0.5" iyz="0.0"
 25                                 izz="0.5" />
 26                </inertial>
 27     </xacro:macro>
 28
 29
 30
 31   <link name="base_link">
 32
 33     <visual>
 34       <geometry>
 35     <cylinder length="${base_link_length}" radius="${base_link_radius}"/>
 36       </geometry>
 37       <origin rpy="0 0 0" xyz="0 0 0"/>
 38       <material name="yellow">
 39         <color rgba="1 1 0 1"/>
 40       </material>
 41     </visual>
 42
 43     <collision>
 44       <geometry>
 45     <cylinder length="${base_link_length+0.02}" radius="0.2"/>
 46       </geometry>
 47       <origin rpy="0 0 0" xyz="0 0 0"/>
 48     </collision>
 49     <xacro:inertial_matrix mass="1"/>
 50   </link>
 51
 52   <joint name="pan_joint" type="revolute">                               
 53     <parent link="base_link"/>
 54     <child link="pan_link"/>
 55     <origin xyz="0 0 0.1"/>
 56     <axis xyz="0 0 1" />
 57     <limit effort="300" velocity="0.1" lower="-3.14" upper="3.14"/>
 58     <dynamics damping="50" friction="1"/>
 59   </joint>
 60
 61   <link name="pan_link">
 62     <visual>
 63       <geometry>
 64     <cylinder length="${pan_link_length}" radius="${pan_link_radius}"/>
 65       </geometry>
 66       <origin rpy="0 0 0" xyz="0 0 0.09"/>
 67       <material name="red">
 68         <color rgba="0 0 1 1"/>
 69       </material>
 70     </visual>
 71     <collision>
 72       <geometry>
 73     <cylinder length="${pan_link_length}" radius="${pan_link_radius+0.02}"    />
 74       </geometry>
 75       <origin rpy="0 0 0" xyz="0 0 0.09"/>
 76     </collision>
 77     <xacro:inertial_matrix mass="1"/>
 78   </link>
 79
 80   <joint name="tilt_joint" type="revolute">
 81     <parent link="pan_link"/>
 82     <child link="tilt_link"/>
 83     <origin xyz="0 0 0.2"/>
 84     <axis xyz="0 1 0" />
 85     <limit effort="300" velocity="0.1" lower="-4.64" upper="-1.5"/>
 86     <dynamics damping="50" friction="1"/>
 87   </joint>
 88
 89   <link name="tilt_link">
 90     <visual>
 91       <geometry>
 92     <cylinder length="${tilt_link_length}" radius="${tilt_link_radius}"/>
 93       </geometry>
 94       <origin rpy="0 1.5 0" xyz="0 0 0"/>
 95       <material name="green">
 96         <color rgba="1 0 0 1"/>
 97       </material>
 98     </visual>
 99     <collision>
100       <geometry>
101     <cylinder length="${tilt_link_length}" radius="${tilt_link_radius+0.2}    "/>
102       </geometry>
103       <origin rpy="0 1.5 0" xyz="0 0 0"/>                                
104     </collision>
105     <xacro:inertial_matrix mass="1"/>
106   </link>
107
108
109 </robot> 

 前面两行代码指定了解析xacro文件所需的所有xacro文件的命名空间。在指定命名空间后,我们需要添加xacro文件名称。

1.使用属性

使用xacro,我们可以在xacro文件中声明常量和属性,即以名称表示的值,这些常量或属性可以在代码中的任何地方使用。常量的主要用途是,避免在连杆和关节上提供硬编码的值,而是保持一些常量,

这样就更容易更改这些值了,而不是查找并替换这些硬编码的值。

这里给出一个使用属性的例子。我们声明了基座连杆和平移连杆的长度和半径。因此,在这里很容易改变尺寸而不是改变每个尺寸的值。

<xacro:property name="base_link_length" value="0.01" />

<xacro:property name="base_link_radius" value="0.2" />


<xacro:property name="pan_link_length" value="0.4" />
 <xacro:property name="pan_link_radius" value="0.04" />

我们可以通过下面的定义,使用变量的值来替换硬编码的值。

<cylinder length= "${pan_link_length}"

radius="${pan_link_radius}"/>

在这里,旧值0.4被替换为{pan_link_length},  0.04被替换为{pan_link_radius}.

2.使用数学表达式

我们可以使用基本操作(如+、-、*、/、一元求负运算和括号)在${}中构建数学表达式。目前还不支持指数和模数。下面是一个代码中使用简单的数学表达式的例子

<cylinder length="${pan_link_length}"

radius="${pan_link_radius+0.02}"/>

 3.使用宏

xacro的一个主要特性就是它支持宏(macro).我们可以使用宏来减少复杂定义的长度。

这是一个我们在惯性代码中使用的宏定义:

<xacro:macro name="inertial_matrix" params="mass">
           <inertial>
                    <mass value="${mass}" />
                      <inertia ixx="0.5" ixy="0.0" ixz="0.0"
                           iyy="0.5" iyz="0.0"izz="0.5" />
             </inertial>
 </xacro:macro>

这里宏被命名为inertial_matrix,他的参数是mass。mass参数可以在惯性定义中使用${mass}。我们可以用一行命令来替换每一个惯性码,如下所示:

<xacro : inertial_matrix mass="1"/>

与URDF相比,xacro定义提高了代码可读性并减少了行数。接下来,我们将学习如何将xacro转换为URDF文件。

二.将xacro转换为URDF

设计完成xacro文件后,我们可以使用以下命令将其转换为URDF文件:

$ rosrun xacro xacro pan_tilt.xacro --inorder > pan_tilt_generated.urdf

我们还可以在ROS启动文件中使用下面的命令将xacro转换为URDF,并将其作为robot_description的参数:

<param name="robot_descriptipn" command="${find xacro)/xacro --inorder

${find mastering_ros_robot_description_pkg)/urdf/pan_tilt.xacro"

我们可以通过启动文件来查看pan_tilt的xacro文件,并使用以下命令来启动它:

$ roslaunch mastering_ros_robot_description_pkg view_pan_tilt_xacro.launch