기본 개념 비교

URDF (Unified Robot Description Format)는 로봇의 구조, 물리적 특성, 시각적 모델 등을 기술하는 XML 기반의 포맷이다. 로봇의 링크(link)와 조인트(joint) 구조를 계층적으로 정의하며, URDF 파일을 통해 로봇의 모델을 표현할 수 있다.

반면 xacro (XML Macro)는 URDF 파일을 좀 더 유연하게 작성할 수 있도록 도와주는 XML 기반의 매크로 언어다. URDF 파일이 단순한 XML 파일로 구성되어 있다면, xacro는 이를 매크로화하여 반복적인 코드 작성과 복잡한 구조를 효율적으로 처리할 수 있도록 한다.

URDF와 xacro의 주요 차이점은 다음과 같다.

매크로의 사용

URDF는 XML을 사용하여 로봇 모델을 정의할 때, 매크로 기능을 제공하지 않는다. 즉, 모든 링크와 조인트를 수동으로 정의해야 하며, 중복되는 코드가 있을 경우 이를 줄이는 방법이 없다. 예를 들어, 동일한 링크나 조인트를 여러 번 사용할 경우, URDF에서는 이를 각기 다른 부분에 중복해서 작성해야 한다.

xacro는 매크로 기능을 지원하여 동일한 패턴의 구조를 반복적으로 정의할 필요 없이, 매크로로 간단하게 정의할 수 있다. 예를 들어, 동일한 링크가 여러 개일 때, 이를 매크로로 정의하고 변수만 바꾸어 사용하는 방식이다.

<!-- URDF에서의 중복된 코드 -->
<link name="link1">
  <inertial>...</inertial>
  <visual>...</visual>
</link>

<link name="link2">
  <inertial>...</inertial>
  <visual>...</visual>
</link>

<!-- xacro에서의 매크로 사용 -->
<xacro:macro name="my_link" params="name">
  <link name="${name}">
    <inertial>...</inertial>
    <visual>...</visual>
  </link>
</xacro:macro>

<my_link name="link1"/>
<my_link name="link2"/>

이처럼 매크로를 사용하면 코드 중복을 줄이고, 파일을 더 간결하게 관리할 수 있다.

변수 사용

URDF에서는 변수를 사용할 수 없기 때문에, 모든 값들을 일일이 수동으로 입력해야 한다. 하지만 xacro에서는 변수(파라미터)를 정의하고 이를 활용할 수 있다. 예를 들어, 로봇의 크기나 링크 간의 간격을 변수로 설정하여 다양한 로봇 모델을 동적으로 생성할 수 있다.

<!-- xacro에서 변수 정의 및 사용 -->
<xacro:property name="link_length" value="1.0"/>

<link name="link1">
  <origin xyz="0 0 ${link_length}" rpy="0 0 0"/>
  <inertial>...</inertial>
  <visual>...</visual>
</link>

이와 같이, 변수를 사용하면 URDF 파일을 수정할 때 반복적으로 동일한 값을 변경할 필요 없이, 변수 값만 수정하면 전체 로봇 모델에 적용할 수 있다.

조건문과 반복문

URDF는 XML 파일이므로 프로그래밍적 기능을 제공하지 않는다. 따라서 조건문이나 반복문을 사용할 수 없다. 하지만 xacro는 조건문과 반복문을 사용할 수 있어, 더 복잡한 로봇 모델을 효율적으로 정의할 수 있다.

예를 들어, 로봇의 조인트 수나 링크 수가 일정하지 않고 유동적일 때, 반복문을 통해 링크와 조인트를 정의할 수 있다.

<!-- xacro에서 반복문 사용 예제 -->
<xacro:property name="num_links" value="3"/>
<xacro:for each="i" count="${num_links}">
  <link name="link_${i}">
    <inertial>...</inertial>
    <visual>...</visual>
  </link>
</xacro:for>

조건문과 반복문을 사용하면 복잡한 로봇 모델을 더 간단하게 작성할 수 있다. 예를 들어, 로봇의 종류에 따라 다른 파라미터를 사용해야 할 때 조건문을 사용해 특정 상황에 맞는 설정을 적용할 수 있다.

URDF와 xacro의 파일 크기와 유지보수

URDF 파일은 구조가 간단하지만, 복잡한 로봇 모델을 작성할 때 파일 크기가 커질 수 있다. 특히, 동일한 링크나 조인트를 여러 번 정의해야 하는 경우, 코드 중복으로 인해 파일의 가독성이 떨어지고 유지보수가 어려워진다.

xacro는 매크로와 변수를 활용하여 반복적인 정의를 줄일 수 있으므로, 상대적으로 파일 크기가 작아지고 관리가 용이하다. 예를 들어, 복잡한 로봇 모델에서도 매크로를 사용하여 링크와 조인트를 효율적으로 재사용할 수 있기 때문에 파일을 수정하거나 확장할 때 더 편리하다.

또한, 로봇의 특정 구성 요소를 변경할 때, URDF에서는 여러 위치에서 수동으로 수정해야 하지만, xacro에서는 매개변수를 변경하는 것만으로도 전체 모델에 일관되게 반영할 수 있다. 이는 로봇 모델의 유지보수와 확장성에서 큰 차이를 만든다.

코드 예시: URDF와 xacro 비교

아래는 URDF와 xacro의 코드 차이를 보여주는 간단한 예시다. 이 예시는 두 개의 링크와 하나의 조인트로 구성된 로봇 모델을 정의한 것이다.

URDF 예시:

<robot name="simple_robot">
  <link name="link1">
    <visual>
      <geometry>
        <box size="1 1 1"/>
      </geometry>
    </visual>
  </link>
  <link name="link2">
    <visual>
      <geometry>
        <box size="1 1 1"/>
      </geometry>
    </visual>
  </link>
  <joint name="joint1" type="revolute">
    <parent link="link1"/>
    <child link="link2"/>
  </joint>
</robot>

xacro 예시:

<xacro:property name="box_size" value="1 1 1"/>
<xacro:macro name="create_link" params="name">
  <link name="${name}">
    <visual>
      <geometry>
        <box size="${box_size}"/>
      </geometry>
    </visual>
  </link>
</xacro:macro>

<robot name="simple_robot">
  <create_link name="link1"/>
  <create_link name="link2"/>
  <joint name="joint1" type="revolute">
    <parent link="link1"/>
    <child link="link2"/>
  </joint>
</robot>

이 예시에서 볼 수 있듯이, xacro를 사용하면 create_link 매크로를 통해 링크를 효율적으로 생성할 수 있으며, 상단에 정의한 box_size 변수를 변경하여 여러 링크에 적용할 수 있다. 반면 URDF에서는 동일한 구조를 반복해서 작성해야 하므로, 코드가 길어지고 수정할 때 많은 수고가 필요하다.

코드 재사용성과 유연성

URDF는 반복적인 요소를 모두 수동으로 정의해야 하기 때문에 코드 재사용이 어렵고, 이를 수정할 때 많은 부분을 일일이 고쳐야 하는 불편함이 있다. 반면, xacro는 매크로와 변수를 사용하여 코드 재사용을 극대화할 수 있다. 예를 들어, 여러 링크나 조인트가 동일한 구조를 가질 때, 매크로로 한 번 정의하고 필요할 때마다 호출함으로써 중복을 피할 수 있다.

또한, 로봇 모델이 다양한 파라미터에 따라 변화해야 하는 경우에도 xacro는 매우 유용하다. 파라미터화된 로봇 모델을 생성할 수 있어, 다양한 조건에 맞춰 로봇의 크기, 모양, 조인트의 특성 등을 동적으로 변경할 수 있다.

<!-- xacro를 사용한 파라미터화된 로봇 모델 -->
<xacro:property name="link_length" value="1.0"/>
<xacro:property name="link_width" value="0.1"/>

<xacro:macro name="create_link" params="name length width">
  <link name="${name}">
    <visual>
      <geometry>
        <box size="${length}${width} ${width}"/>
      </geometry>
    </visual>
  </link>
</xacro:macro>

<robot name="parameterized_robot">
  <create_link name="link1" length="${link_length}" width="${link_width}"/>
  <create_link name="link2" length="${link_length}" width="${link_width}"/>
  <joint name="joint1" type="revolute">
    <parent link="link1"/>
    <child link="link2"/>
  </joint>
</robot>

위 코드에서 create_link 매크로는 두 개의 변수, lengthwidth를 사용하여 링크를 동적으로 생성한다. 이처럼 매개변수를 사용하면 코드의 유연성이 크게 향상되며, 다양한 상황에 맞춰 로봇 모델을 효율적으로 변경할 수 있다.

코드의 유지보수성

xacro의 또 다른 장점은 코드의 유지보수성이 높다는 것이다. URDF에서 로봇 모델을 수정하려면 모든 요소를 수동으로 찾아서 변경해야 하는 반면, xacro에서는 매크로와 변수를 사용하기 때문에 특정 부분만 수정하면 전체 모델에 변경 사항이 반영된다.

예를 들어, 로봇의 링크 크기를 변경하려면 xacro에서는 상단에 정의한 변수의 값만 변경하면 되지만, URDF에서는 각 링크의 크기를 일일이 찾아서 수정해야 한다.

변경 전:

<xacro:property name="link_length" value="1.0"/>

변경 후:

<xacro:property name="link_length" value="2.0"/>

이처럼 변수를 통해 로봇의 크기나 특성을 일괄적으로 변경할 수 있어, 복잡한 로봇 모델에서도 쉽게 수정이 가능하다.

성능 비교

URDF와 xacro의 성능 차이는 파일을 로드할 때 나타난다. xacro는 매크로와 변수를 처리하는 과정이 필요하므로, URDF에 비해 초기 로딩 시간이 약간 더 길 수 있다. 하지만, 이러한 성능 차이는 미미하며, 로봇 시뮬레이션을 수행하는 데 있어 큰 영향을 주지 않는다.

오히려 복잡한 로봇 모델을 작성할 때, xacro의 코드 간소화와 유지보수의 용이성 덕분에 개발 시간과 유지보수 비용을 절감할 수 있다.