Bird
Raised Fist0
ROSframework~20 mins

Xacro macros for URDF - Practice Problems & Coding Challenges

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
🎖️
Xacro Macro Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
component_behavior
intermediate
2:00remaining
Understanding Macro Parameter Substitution
Given the following Xacro macro, what will be the value of the element's xyz attribute after macro expansion?

<macro name="wheel" params="radius width x y z"> <link name="wheel_link"> <visual> <geometry><cylinder radius="${radius}" length="${width}" /></geometry> <origin xyz="${x} ${y} ${z}" /> </visual> </link> </macro> <wheel radius="0.3" width="0.1" x="1" y="0" z="0.5" />
A1 0 0.5
B0.3 0.1 0
C0 0 0
D1 0.3 0.5
Attempts:
2 left
💡 Hint
Look at how the macro parameters are used inside the xyz attribute.
📝 Syntax
intermediate
2:00remaining
Identifying Syntax Errors in Xacro Macro Definition
Which option contains a syntax error that will prevent the Xacro macro from expanding correctly?
ROS
<macro name="arm_segment" params="length angle">
  <link name="segment_link">
    <visual>
      <geometry>
        <box size="${length} 0.1 0.1" />
      </geometry>
      <origin rpy="0 0 ${angle}" />
    </visual>
  </link>
</macro>
A<arm_segment length="0.5" angle="1.57" />
B<arm_segment length=0.5 angle=1.57 />
C<arm_segment length="0.5" angle="1.57"> </arm_segment>
D<arm_segment length="0.5" angle="1.57"
Attempts:
2 left
💡 Hint
Check for proper tag closing and attribute quoting.
state_output
advanced
2:00remaining
Output of Nested Macro Expansion
Consider these two macros:

<macro name="joint" params="name parent child"> <joint name="${name}" type="revolute"> <parent link="${parent}" /> <child link="${child}" /> </joint> </macro> <macro name="arm" params="segment_length segment_angle"> <link name="base_link" /> <link name="segment_link" /> <joint name="base_to_segment" parent="base_link" child="segment_link" /> </macro>

What will be the output of calling <arm segment_length="1.0" segment_angle="0.5" />?
AError: macro 'joint' not expanded inside 'arm'
B
&lt;link name="base_link" /&gt;
&lt;link name="segment_link" /&gt;
&lt;joint name="base_to_segment" parent="base_link" child="segment_link" /&gt;
C
&lt;link name="base_link" /&gt;
&lt;link name="segment_link" /&gt;
&lt;joint name="base_to_segment" type="revolute"&gt;
  &lt;parent link="base_link" /&gt;
  &lt;child link="segment_link" /&gt;
&lt;/joint&gt;
D
&lt;link name="base_link" /&gt;
&lt;link name="segment_link" /&gt;
Attempts:
2 left
💡 Hint
Look carefully at how the joint macro is called inside the arm macro.
🔧 Debug
advanced
2:00remaining
Debugging Macro Parameter Usage
This macro is intended to create a link with a visual box of given size. Why does the following macro produce an error when called?

<macro name="box_link" params="size"> <link name="box_link"> <visual> <geometry> <box size="${size}" /> </geometry> </visual> </link> </macro>

Called as:
<box_link size="1 1 1" />
AThe macro parameter 'size' is not quoted properly inside the macro, causing a syntax error.
BThe macro call uses spaces in the size parameter, which must be quoted as a single string, but it is correctly quoted, so no error.
CThe macro parameter 'size' is treated as a string, but the box size attribute expects three numbers separated by spaces, which is correct here, so no error.
DThe macro parameter 'size' is passed as a string with spaces, but Xacro requires each dimension as a separate parameter.
Attempts:
2 left
💡 Hint
Check how parameters with spaces are passed and used in Xacro.
🧠 Conceptual
expert
3:00remaining
Effect of Property Overriding in Nested Macros
Given these macros:

<property name="color" value="red" /> <macro name="painted_link" params="name"> <link name="${name}"> <visual> <material name="paint"> <color rgba="${color} 1" /> </material> </visual> </link> </macro> <macro name="robot"> <property name="color" value="blue" /> <painted_link name="link1" /> </macro>

What color will the rgba attribute have when calling <robot />?
Ablue 1
Bundefined 1
Cred 1
DError: property 'color' not found
Attempts:
2 left
💡 Hint
Consider how property overriding works in nested macro calls in Xacro.

Practice

(1/5)
1. What is the main purpose of using xacro:macro in a URDF file?
easy
A. To define reusable robot parts with customizable parameters
B. To execute robot movement commands
C. To compile the URDF into machine code
D. To visualize the robot in 3D

Solution

  1. Step 1: Understand what xacro:macro does

    xacro:macro lets you define a piece of robot description once and reuse it multiple times with different settings.
  2. Step 2: Identify the main purpose

    It helps to avoid repeating code and makes the URDF easier to maintain by allowing parameter customization.
  3. Final Answer:

    To define reusable robot parts with customizable parameters -> Option A
  4. Quick Check:

    Reusability and customization [OK]
Hint: Macros = reusable parts with parameters [OK]
Common Mistakes:
  • Thinking macros run robot commands
  • Confusing macros with visualization tools
  • Believing macros compile code
2. Which of the following is the correct syntax to define a macro named wheel with a parameter radius in Xacro?
easy
A. <xacro:macro name="wheel" radius="1.0">...</xacro:macro>
B. <xacro:macro name="wheel" params="radius">...</xacro:macro>
C. <macro name="wheel" param="radius">...</macro>
D. <xacro:define name="wheel" radius>...</xacro:define>

Solution

  1. Step 1: Recall Xacro macro syntax

    Macros are defined with <xacro:macro> tag and parameters are listed in the params attribute as a space-separated string.
  2. Step 2: Match the correct syntax

    <xacro:macro name="wheel" params="radius">...</xacro:macro> correctly uses params="radius" inside <xacro:macro> tag.
  3. Final Answer:

    <xacro:macro name="wheel" params="radius">...</xacro:macro> -> Option B
  4. Quick Check:

    Params attribute [OK]
Hint: Use params="param1 param2" inside [OK]
Common Mistakes:
  • Using attributes other than 'params' for parameters
  • Omitting the 'params' attribute
  • Using incorrect tag names like <macro> or
3. Given the following Xacro macro and call:
<xacro:macro name="link_with_length" params="length">
  <link name="link_${length}">
    <visual>
      <geometry>
        <box size="${length} 0.1 0.1"/>
      </geometry>
    </visual>
  </link>
</xacro:macro>

<xacro:link_with_length length="2.0"/>

What will be the name of the generated link element?
medium
A. link_
B. link_length
C. link_2.0
D. link_${length}

Solution

  1. Step 1: Understand macro parameter substitution

    The macro uses ${length} to insert the parameter value into the link name and box size.
  2. Step 2: Substitute the parameter value

    The call passes length="2.0", so link_${length} becomes link_2.0.
  3. Final Answer:

    link_2.0 -> Option C
  4. Quick Check:

    Parameter substitution = link_2.0 [OK]
Hint: Parameter values replace ${param} in macro body [OK]
Common Mistakes:
  • Not substituting parameter, leaving ${length} literal
  • Using parameter name instead of value
  • Leaving name empty
4. Consider this Xacro macro call:
<xacro:link_with_length length=""/>

What is the most likely problem with this call if the macro expects a numeric length parameter?
medium
A. The parameter should be named 'size' instead of 'length'
B. The macro name is incorrect
C. The macro call is missing closing tag
D. The length parameter is empty, causing invalid geometry size

Solution

  1. Step 1: Check parameter value in macro call

    The call passes length="", which is empty and not a valid number.
  2. Step 2: Understand impact on geometry

    The macro uses ${length} for box size, so empty string leads to invalid or zero size, causing errors or unexpected behavior.
  3. Final Answer:

    The length parameter is empty, causing invalid geometry size -> Option D
  4. Quick Check:

    Empty parameter causes invalid size [OK]
Hint: Always provide valid parameter values in macro calls [OK]
Common Mistakes:
  • Ignoring empty parameter values
  • Assuming macro name or tag is wrong
  • Confusing parameter names
5. You want to create a robot arm with multiple identical segments but different lengths using Xacro macros. Which approach best achieves this?
hard
A. Define a macro with a length parameter and call it multiple times with different lengths
B. Write separate link elements manually for each segment with hardcoded lengths
C. Use a single macro call without parameters and change lengths later in the URDF
D. Create a macro without parameters and duplicate it multiple times

Solution

  1. Step 1: Identify the need for reusable segments with different lengths

    You want to reuse the same segment design but customize length for each segment.
  2. Step 2: Choose the approach that supports reuse and customization

    Defining a macro with a length parameter and calling it multiple times with different lengths allows reuse and easy updates.
  3. Final Answer:

    Define a macro with a length parameter and call it multiple times with different lengths -> Option A
  4. Quick Check:

    Reusable macro with parameters [OK]
Hint: Use parameterized macros for repeated parts with variations [OK]
Common Mistakes:
  • Duplicating code manually instead of using macros
  • Using macros without parameters losing flexibility
  • Changing parameters outside macro calls