Mastering ROS for Robotics Programming
上QQ阅读APP看书,第一时间看更新

Understanding robot modeling using xacro

The flexibility of URDF reduces when we work with complex robot models. Some of the main features that URDF is missing are the simplicity, reusability, modularity, and programmability.

If someone wants to reuse a URDF block ten times in his robot description, he can copy and paste the block ten times. If there is an option to use this code block and make multiple copies with different settings, it will be very useful while creating the robot description.

The URDF is single file and we can't include other URDF files inside it. This reduces the modular nature of the code. All code should be in a single file, which reduces the code simplicity too.

Also, if there is some programmability, such as adding variable, constants, mathematical expressions, conditional statement, and so on, in the description language, it will be more user friendly.

The robot modeling using xacro meets all these conditions and some of the main features of xacro are as follows:

  • Simplify URDF: Xacro is the cleaned up version of URDF. What it does is, it creates macros inside the robot description and reuses the macros. This can reduce the code length. Also, it can include macros from other files and make the code more readable, simpler, and modular.
  • Programmability: The xacro language support a simple programming statement in its description. There are variables, constants, mathematical expressions, conditional statements, and so on that make the description more intelligent and efficient.

We can say that xacro is an updated version of URDF, and we can convert the xacro definition to URDF whenever it is necessary, using some ROS tools.

We can discuss the same description of pan and tilt using xacro. Navigate to chapter_2_code/mastering_ros_robot_description_pkg/urdf, and the file name is pan_tilt.xacro. Instead of .urdf, we need to use .xacro for the xacro file definition. Here is the explanation of the xacro code:

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="pan_tilt">

These lines specify a namespace that are needed in all xacro files for parsing the xacro file. After specifying the namespace, we need to add the name of the xacro file.

Using properties

Using xacro, we can declare constants or properties that are the named values inside the xacro file, which can be used anywhere in the code. The main use of these constant definitions are, instead of giving hard coded values on links and joints, we can keep constants like this and it will be easier to change these values rather than finding the hard coded values and replacing them.

An example of using properties are given here. We declare the base link and pan link's length and radius. So, it will be easy to change the dimension here rather than changing values in each one:

  <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" />

We can use the value of the variable by replacing the hard coded value by the following definition as given here:

  <cylinder length="${pan_link_length}" radius="${pan_link_radius}"/>

Here, the old value "0.4" is replaced with "{pan_link_length}", and "0.04" is replaced with "{pan_link_radius}".

Using the math expression

We can build mathematical expressions inside ${} using the basic operations such as + , -, * , / , unary minus, and parenthesis. Exponentiation and modulus are not supported yet. The following is a simple math expression used inside the code:

  <cylinder length="${pan_link_length}" radius="${pan_link_radius+0.02}"/>   

Using macros

One of the main features of xacro is that it supports macros. We can reduce the length complex definition using xacro to a great extent. Here is a xacro definition we used in our code for inertial:

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

Here, the macro is named inertial_matrix, and its parameter is mass. The mass parameter can be used inside the inertial definition using ${mass}. We can replace each inertial code with a single line as given here:

  <xacro:inertial_matrix mass="1"/>

The xacro definition improved the code readability and reduced the number of lines compared to urdf. Next, we can see how to convert xacro to the urdf file.