Skip to content

XACRO arg and condition

arg

Simple xacro file that get argument from outside.
if no argument set it use the default.
Using xacro command to substitute xacro sentence

simple.xacro
1
2
3
4
5
<?xml version="1.0"?>
<robot name="my_robot" xmlns:xacro="http://www.ros.org/wiki/xacro">
     <xacro:arg name="banner" default="default banner"/>
    <tag>$(arg banner)</tag>
</robot>
usage
1
2
3
4
5
# use default value
xacro simple.xacro

# set arg from cli
xacro simple.xacro banner:=hello

launch file

yaml
launch:
  - arg:
      name: "robot_description_file"
      default: "$(find-pkg-share my_robot_description)/urdf/test.xacro"
  - arg:
      name: banner
      default: hello world

  #xacro
  - executable:
      cmd: "xacro $(var robot_description_file) banner:=$(var banner)"
      output: screen

Condition

simple xacro with condition and argument
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="robot_name">
    <xacro:arg name="use_ros2_control" default="false" />
    <xacro:if value="$(arg use_ros2_control)">
        control
    </xacro:if>
    <xacro:unless value="$(arg use_ros2_control)">
        simple
    </xacro:unless>
</robot>

usage

launch

launch:
  - arg:
      name: "robot_description_file"
      default: "$(find-pkg-share my_robot_description)/urdf/test.xacro"
  - arg:
      name: use_control
      default: "false"

  #xacro
  - executable:
      cmd: "xacro $(var robot_description_file) use_ros2_control:=$(var use_control)"
      output: screen

usage

1
2
3
4
5
6
#default
ros2 launch my_robot_bringup test.launch.yaml
# False
ros2 launch my_robot_bringup test.launch.yaml use_control:=false
# True
ros2 launch my_robot_bringup test.launch.yaml use_control:=false

Demo: more conditions

Use expression to evaluate condition

test.xacro
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="robot_name">
    <xacro:arg name="xxx" default="2" />
    <xacro:property name="xxx_value" value="$(arg xxx)" /> 

    arg: $(arg xxx) , property: ${xxx_value} 

    <xacro:if value="${'$(arg xxx)' == '1'}">
        arg condition 1
    </xacro:if>

    <xacro:if value="${xxx_value == 1}">
        property condition 1
    </xacro:if>

</robot>

usage

xacro test.xacro xxx:=1
xacro test.xacro xxx:=2