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
이라는 매크로가 정의되었고, 매개변수로 radius
와 width
를 받는다. 매크로 내부에서 이 변수들은 ${}
를 통해 참조된다. 이러한 매크로를 여러 곳에서 재사용할 수 있어 코드의 중복을 줄이고 유지보수를 쉽게 한다.
매크로 호출
정의된 매크로는 파일 내에서 여러 번 호출될 수 있다. 매크로를 호출할 때는 <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_radius
와 wheel_width
라는 변수가 정의되었다. 각 변수는 파일 내 어디에서든 ${}
표기법을 통해 참조할 수 있다. 이렇게 정의된 변수는 여러 곳에서 재사용 가능하므로 코드의 가독성과 관리가 용이해진다.
<xacro:wheel radius="${wheel_radius}" width="${wheel_width}" />
이 예시에서 wheel_radius
와 wheel_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와의 통합을 통해 시뮬레이션이나 실제 로봇에서 사용할 수 있다.