xacro(XML Macros)는 XML 문서를 매크로화하여 반복되는 구조를 간소화할 수 있게 도와준다. 주로 복잡한 URDF 파일을 쉽게 관리하고, 파라미터를 이용해 로봇 모델을 유연하게 정의하는 데 사용된다. 이 섹션에서는 xacro 파일의 기본 구조를 설명한다.

xacro 파일의 시작과 선언

xacro 파일은 일반적인 XML 파일과 마찬가지로 XML 선언으로 시작된다. 파일의 최상단에는 <?xml version="1.0"?>와 같은 XML 선언이 들어가며, 이어서 xacro 태그들이 정의된다. xacro 파일은 주로 .xacro 확장자를 가지며, URDF 파일의 대체 형태로 사용된다.

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="my_robot">
  <!-- 매크로와 변수 정의 -->
</robot>

위 예시에서 xmlns:xacro는 xacro 매크로를 사용하기 위한 네임스페이스를 선언하는 부분이다. 이 선언을 통해 xacro 명령을 사용하여 로봇 모델의 매크로 및 변수화를 지원할 수 있다.

매크로 정의

xacro 파일의 핵심 기능 중 하나는 매크로이다. 매크로는 여러 번 반복해서 사용할 수 있는 코드 블록을 정의하고 이를 호출할 수 있게 해준다. 매크로는 <xacro:macro> 태그를 통해 정의된다.

<xacro:macro name="wheel" params="radius width">
  <link name="wheel_link">
    <visual>
      <geometry>
        <cylinder radius="${radius}" length="${width}" />
      </geometry>
    </visual>
  </link>
</xacro:macro>

위 예제에서 wheel이라는 매크로가 정의되었고, 매개변수로 radiuswidth를 받는다. 매크로 내부에서 이 변수들은 ${}를 통해 참조된다. 이러한 매크로를 여러 곳에서 재사용할 수 있어 코드의 중복을 줄이고 유지보수를 쉽게 한다.

매크로 호출

정의된 매크로는 파일 내에서 여러 번 호출될 수 있다. 매크로를 호출할 때는 <xacro:call> 태그를 사용하여 호출하고, 필요에 따라 매개변수를 전달한다.

<xacro:wheel radius="0.1" width="0.05" />

이 호출은 wheel 매크로를 호출하며, 매개변수 radius에 0.1, width에 0.05를 전달한다. 이로 인해 매크로 내에서 지정된 값에 따라 해당 로봇 구성 요소가 생성된다.

변수 사용

xacro에서는 매크로뿐만 아니라 변수를 정의하여 파일 내에서 다양한 값들을 동적으로 설정할 수 있다. 변수를 정의할 때는 <xacro:property> 태그를 사용한다.

<xacro:property name="wheel_radius" value="0.1" />
<xacro:property name="wheel_width" value="0.05" />

위의 예시에서는 wheel_radiuswheel_width라는 변수가 정의되었다. 각 변수는 파일 내 어디에서든 ${} 표기법을 통해 참조할 수 있다. 이렇게 정의된 변수는 여러 곳에서 재사용 가능하므로 코드의 가독성과 관리가 용이해진다.

<xacro:wheel radius="${wheel_radius}" width="${wheel_width}" />

이 예시에서 wheel_radiuswheel_width 변수를 사용하여 매크로를 호출하고 있다. 이를 통해, 파일 내에서 해당 값들을 쉽게 변경할 수 있고, 이를 바탕으로 로봇 모델을 유연하게 조정할 수 있다.

수식 계산

xacro는 단순 변수 참조뿐만 아니라, 수식 계산도 지원한다. 수식 계산은 ${} 내부에서 *, +, -, / 등의 연산자를 이용해 수행할 수 있다.

<xacro:property name="body_length" value="1.0" />
<xacro:property name="half_length" value="${body_length / 2.0}" />

위 예시에서는 body_length 값을 기반으로 half_length 변수를 계산하고 있다. 이처럼 수식을 이용하여 동적으로 변수를 계산할 수 있으며, 이를 통해 더 복잡한 로봇 모델링이 가능한다.

<xacro:wheel radius="${body_length / 4.0}" width="${half_length}" />

위와 같은 방식으로, 수식을 사용하여 매크로에 전달할 값을 동적으로 계산할 수 있다.

조건문

xacro는 조건문을 통해 특정 상황에 따라 다른 코드를 실행할 수 있다. <xacro:if> 태그를 사용하여 조건을 정의하며, 조건이 참일 때만 그 안의 코드가 실행된다.

<xacro:property name="use_large_wheel" value="true" />

<xacro:if value="${use_large_wheel}">
  <xacro:wheel radius="0.2" width="0.1" />
</xacro:if>

이 예시에서는 use_large_wheel이라는 변수가 true일 경우에만 wheel 매크로를 호출한다. 이를 통해, 상황에 따라 다른 모델링 요소를 선택적으로 생성할 수 있다.

반복문

xacro는 반복문을 지원하여 동일한 구조를 여러 번 생성할 수 있다. 반복문은 <xacro:for-each> 태그를 사용하여 정의하며, 배열이나 리스트와 같은 값을 반복 처리할 수 있다.

<xacro:property name="wheel_positions" value="[0.5, 1.0, 1.5]" />

<xacro:for-each item="position" value="${wheel_positions}">
  <link name="wheel_${position}">
    <visual>
      <geometry>
        <cylinder radius="0.1" length="0.05" />
      </geometry>
      <origin xyz="${position} 0 0" />
    </visual>
  </link>
</xacro:for-each>

위 예시에서는 wheel_positions라는 배열을 정의하고, 각 배열 요소를 position으로 참조하여 반복문을 수행하고 있다. 반복문 내에서 각 바퀴는 position 값에 따라 다른 위치에 생성된다.

include를 통한 파일 재사용

xacro는 다른 파일을 포함할 수 있는 기능을 제공하여 복잡한 URDF 모델을 여러 파일로 분리하고 재사용할 수 있다. 이 기능은 <xacro:include> 태그를 사용하여 구현된다.

<xacro:include filename="wheel.xacro" />

위 코드는 wheel.xacro 파일을 현재 xacro 파일에 포함시킨다. 이를 통해 여러 파일에 걸쳐 있는 로봇 모델을 관리할 수 있으며, 재사용 가능한 매크로나 변수들을 별도의 파일로 분리할 수 있다.

매개변수를 통한 유연한 모델링

xacro는 파일 내에서 파라미터를 사용하여 로봇 모델의 유연성을 극대화할 수 있다. 매개변수는 명령행이나 launch 파일에서 전달될 수 있으며, 이를 통해 파일 외부에서 로봇 모델의 특성을 동적으로 설정할 수 있다.

<xacro:property name="wheel_radius" value="$(arg wheel_radius)" />
<xacro:property name="wheel_width" value="$(arg wheel_width)" />

위 코드에서 $(arg)를 사용하여 외부로부터 값을 전달받고 있다. 이를 통해, 동일한 URDF/xacro 파일을 다양한 매개변수 값으로 유연하게 사용할 수 있다.

URDF에서 xacro 파일 호출

xacro 파일을 URDF와 연동하려면, xacro 파일을 실행 가능한 URDF 파일로 변환해야 한다. ROS에서는 이를 위해 xacro 명령을 사용하며, ROS launch 파일에서도 손쉽게 사용할 수 있다.

<param name="robot_description" command="$(find xacro)$(find my_robot)/urdf/my_robot.xacro" />

위 예시는 robot_description이라는 파라미터에 xacro 파일을 실행하여 생성된 URDF 파일을 저장하는 방법이다. 이 설정은 ROS와의 통합을 통해 시뮬레이션이나 실제 로봇에서 사용할 수 있다.