URDF(Universal Robot Description Format)는 로봇 모델의 구조적 요소를 XML 형식으로 표현하여 시뮬레이션 환경이나 실제 로봇 시스템에서 사용할 수 있도록 정의하는 파일이다. URDF 파일을 작성하는 과정은 몇 가지 주요 구성 요소와 규칙을 따른다.

1. URDF 파일의 기본 구조

URDF 파일은 XML 기반 파일이므로, 모든 URDF 파일은 <robot> 태그로 시작한다. 이 태그는 로봇의 이름과 속성을 정의하며, 내부에 로봇을 구성하는 다양한 요소를 포함한다. 기본적인 URDF 파일의 예시는 다음과 같다.

<robot name="my_robot">
    <!-- 링크, 조인트 등 로봇의 구성 요소가 여기에 포함된다. -->
</robot>

여기서 <robot> 태그는 필수적으로 로봇의 이름을 정의하는 name 속성을 갖는다. 이 이름은 시뮬레이션 및 실제 로봇 시스템에서 로봇을 식별하는 데 사용된다.

로봇의 구성 요소 중 하나인 링크는 URDF 파일에서 <link> 태그로 정의된다. 각 링크는 물리적 객체를 나타내며, 주로 로봇의 몸체나 조인트 사이의 구조물로 사용된다.

<link name="base_link">
    <inertial>
        <!-- 질량 및 관성 정보 -->
    </inertial>
    <visual>
        <!-- 시각적 표현 -->
    </visual>
    <collision>
        <!-- 충돌 처리 정보 -->
    </collision>
</link>

2.1 링크의 물리적 특성

링크는 물리적 특성을 정의하기 위해 inertial 태그를 포함한다. 이 태그 내부에서는 질량, 관성 모멘트, 중심 위치 등의 정보를 정의한다. 질량과 관성 모멘트를 수학적으로 표현하면 다음과 같다.

\mathbf{I} = \begin{bmatrix} I_{xx} & I_{xy} & I_{xz} \\ I_{yx} & I_{yy} & I_{yz} \\ I_{zx} & I_{zy} & I_{zz} \end{bmatrix}

이와 같은 물리적 특성은 URDF에서 다음과 같이 정의된다.

<inertial>
    <mass value="1.0"/>
    <inertia ixx="0.1" iyy="0.1" izz="0.1" ixy="0.0" ixz="0.0" iyz="0.0"/>
</inertial>

3. 조인트(Joint) 정의

조인트는 링크 간의 관계를 정의하며, URDF에서 <joint> 태그로 표현된다. 조인트는 두 링크를 연결하고, 회전 또는 직선 이동 등의 움직임을 정의한다.

<joint name="joint1" type="revolute">
    <parent link="base_link"/>
    <child link="link1"/>
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <axis xyz="0 0 1"/>
</joint>

3.1 조인트의 종류

조인트는 여러 가지 종류가 있으며, 주로 회전 조인트(revolute), 직선 이동 조인트(prismatic), 고정 조인트(fixed)로 나뉜다.

조인트는 parentchild 링크를 지정하여 두 링크 간의 연결 관계를 정의하며, 회전 또는 이동 축은 axis 태그로 정의한다.

4. 링크와 조인트의 관계

로봇은 여러 개의 링크와 조인트로 구성된다. 각 조인트는 두 링크를 연결하고, 조인트에 정의된 운동학적 제약 조건에 따라 링크는 특정 축을 따라 회전하거나 이동할 수 있다. 이를 수학적으로 표현하면, 각 링크의 위치와 조인트의 회전 또는 이동은 다음과 같은 운동학 방정식으로 나타낼 수 있다.

\mathbf{T}_{i} = \mathbf{T}_{i-1} \cdot \mathbf{T}_{joint}

여기서 \mathbf{T}_{i}는 링크 i의 변환 행렬, \mathbf{T}_{i-1}은 이전 링크의 변환 행렬, \mathbf{T}_{joint}는 조인트 변환 행렬을 의미한다. 각 링크와 조인트의 관계는 이렇게 계층적으로 표현된다.

5. 링크와 조인트의 물리적 특성

각 링크와 조인트는 URDF 파일에서 물리적 특성을 정의할 수 있다. 이러한 물리적 특성에는 질량, 관성, 마찰 계수 등이 포함되며, 물리 시뮬레이션에서 중요한 역할을 한다.

5.1 링크의 질량과 관성

링크의 물리적 특성 중 질량과 관성은 물체의 운동을 시뮬레이션할 때 필수적인 요소이다. 질량은 m으로 나타내며, 링크의 무게를 정의한다. 관성은 링크의 회전 운동에 대한 저항을 나타내며, 3x3 대칭 행렬로 표현된다.

관성 모멘트 \mathbf{I}는 다음과 같은 형태를 갖는다.

\mathbf{I} = \begin{bmatrix} I_{xx} & I_{xy} & I_{xz} \\ I_{yx} & I_{yy} & I_{yz} \\ I_{zx} & I_{zy} & I_{zz} \end{bmatrix}

각각의 관성 모멘트 요소는 링크의 질량 분포에 따라 계산된다. URDF 파일에서 이러한 정보를 다음과 같이 정의할 수 있다.

<inertial>
    <mass value="2.5"/>
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <inertia ixx="0.2" iyy="0.2" izz="0.2" ixy="0.0" ixz="0.0" iyz="0.0"/>
</inertial>

이 예시에서 mass는 링크의 질량을 정의하고, inertia는 링크의 관성 모멘트를 정의한다. origin은 질량 중심의 위치를 나타낸다.

5.2 조인트의 마찰과 감쇠

조인트는 링크 사이의 움직임을 정의할 뿐만 아니라 마찰과 감쇠 같은 물리적 특성을 포함하여 보다 현실적인 시뮬레이션을 할 수 있다. 예를 들어, 회전 조인트의 경우 마찰 계수 \mu를 적용하여 회전 운동을 저해할 수 있다. URDF 파일에서는 다음과 같이 정의할 수 있다.

<joint name="joint1" type="revolute">
    <parent link="base_link"/>
    <child link="link1"/>
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <axis xyz="0 0 1"/>
    <dynamics damping="0.5" friction="0.2"/>
</joint>

여기서 damping은 감쇠 계수, friction은 마찰 계수를 나타낸다. 이 값들은 로봇의 움직임을 보다 현실적으로 모델링하는 데 사용된다.

6. URDF 파일의 계층적 구조

URDF 파일은 기본적으로 계층적인 구조를 따른다. 로봇은 여러 링크와 조인트로 구성되며, 각 링크와 조인트는 부모-자식 관계로 연결된다. 부모 링크와 자식 링크는 특정 조인트를 통해 연결되며, 이 조인트는 각 링크 간의 상대적인 움직임을 정의한다.

계층적 구조는 로봇의 전체 운동학을 정의하는 데 중요한 역할을 한다. 예를 들어, 각 링크의 위치와 자세는 부모 링크와 조인트를 통해 계층적으로 계산된다. 수식으로 표현하면 다음과 같다.

\mathbf{T}_{n} = \mathbf{T}_{0} \cdot \prod_{i=1}^{n} \mathbf{T}_{joint_i}

여기서 \mathbf{T}_{n}은 링크 n의 변환 행렬, \mathbf{T}_{0}은 기본 좌표계의 변환 행렬, 그리고 \mathbf{T}_{joint_i}는 각 조인트의 변환 행렬을 의미한다. 이러한 계층적 구조는 로봇의 모든 링크와 조인트를 연쇄적으로 연결하여 전체 로봇의 상태를 정의한다.

7. URDF 파일 작성 시 고려해야 할 요소

URDF 파일을 작성할 때, 단순한 XML 파일 구조 외에도 여러 가지 중요한 요소를 고려해야 한다. 이는 시뮬레이션 환경에서 로봇의 성능과 동작에 영향을 미칠 수 있다.

7.1 좌표계

URDF에서 모든 링크와 조인트는 특정 좌표계를 기준으로 정의된다. 기본적으로 URDF에서 사용되는 좌표계는 오른손 좌표계로, x-축은 앞, y-축은 왼쪽, z-축은 위를 가리킨다. 각 링크의 위치와 자세는 부모 링크 또는 기본 좌표계에 상대적으로 정의된다.

조인트의 origin 태그는 자식 링크가 부모 링크에 대해 어느 위치에 있는지를 나타낸다. xyz 속성은 위치를, rpy 속성은 회전(롤, 피치, 요)을 나타낸다.

<joint name="joint1" type="revolute">
    <parent link="base_link"/>
    <child link="link1"/>
    <origin xyz="0 0 1" rpy="0 0 0"/>
</joint>

위 예시에서, 자식 링크 link1은 부모 링크 base_link로부터 z-축 방향으로 1 단위 떨어져 있으며, 회전 없이 정렬되어 있다.

7.2 물리 엔진과의 호환성

URDF 파일은 주로 Gazebo와 같은 시뮬레이션 엔진에서 사용되며, 물리 엔진의 설정과 맞추어 작성하는 것이 중요하다. 물리 엔진은 URDF에 정의된 링크와 조인트의 물리적 특성을 기반으로 동역학 시뮬레이션을 실행한다. 이때, 질량과 관성 모멘트는 물체의 움직임에 큰 영향을 미치므로 정확하게 정의되어야 한다.

관성 모멘트가 잘못 정의되면, 시뮬레이션에서 로봇이 불안정하게 움직일 수 있다. 관성 모멘트 \mathbf{I}는 다음과 같이 계산할 수 있다.

\mathbf{I} = \int_V \rho(\mathbf{r}) \left( \mathbf{r}^2 \mathbf{I} - \mathbf{r} \otimes \mathbf{r} \right) dV

여기서 \rho(\mathbf{r})는 물체의 질량 분포 함수, \mathbf{r}은 물체 내부의 위치 벡터를 의미한다. 이러한 물리적 특성은 시뮬레이션 결과에 직접적인 영향을 미치므로, URDF 파일 작성 시 신중하게 설정해야 한다.

7.3 충돌 모델과 시각적 모델의 구분

URDF 파일에서는 시각적 모델과 충돌 모델을 별도로 정의할 수 있다. 시각적 모델은 로봇이 시뮬레이션 환경에서 어떻게 보이는지를 정의하는 반면, 충돌 모델은 로봇의 충돌 영역을 정의하여 물리적 상호작용을 처리한다.

시각적 모델은 복잡한 메쉬 파일을 사용할 수 있지만, 충돌 모델은 계산 효율성을 위해 단순한 형상을 사용하는 것이 좋다. 예를 들어, 박스, 실린더, 구와 같은 기본적인 기하학적 형상을 충돌 모델로 정의할 수 있다.

<collision>
    <geometry>
        <box size="1 1 1"/>
    </geometry>
</collision>

이와 같이 충돌 모델을 단순화하면 시뮬레이션의 성능을 크게 향상시킬 수 있다.

8. URDF에서 링크와 조인트의 위치 조정

URDF 파일을 작성할 때, 링크와 조인트 간의 상대적 위치는 매우 중요하다. 잘못된 위치 설정은 시뮬레이션에서 로봇이 비정상적으로 동작하게 만들 수 있다. 링크의 위치는 부모 링크에 대해 상대적으로 정의되며, 이는 조인트를 통해 설정된다.

8.1 링크의 원점 (Origin) 설정

각 링크는 부모 링크에 대해 상대적인 위치와 회전을 가질 수 있다. 이는 origin 태그로 정의되며, xyz는 위치, rpy는 회전을 나타낸다. rpy는 Roll, Pitch, Yaw의 약자로, 각 축에 대한 회전 각도를 라디안으로 정의한다.

<link name="link1">
    <visual>
        <origin xyz="0 0 1" rpy="0 0 0"/>
        <geometry>
            <box size="0.5 0.5 0.5"/>
        </geometry>
    </visual>
</link>

위 예시에서, 링크 link1은 부모 링크에 대해 z-축으로 1 단위 떨어져 있고, 회전 없이 배치되어 있다.

8.2 조인트의 위치 및 회전

조인트 역시 부모 링크와 자식 링크 간의 상대적 위치를 정의한다. origin 태그를 통해 부모 링크에 대한 조인트의 위치와 회전이 결정되며, xyzrpy 속성으로 정의된다. 예를 들어, 다음과 같이 회전 조인트를 설정할 수 있다.

<joint name="joint1" type="revolute">
    <parent link="base_link"/>
    <child link="link1"/>
    <origin xyz="0 0 0.5" rpy="0 0 0"/>
    <axis xyz="0 0 1"/>
</joint>

여기서, 조인트는 부모 링크 base_link와 자식 링크 link1을 연결하며, 조인트의 원점은 부모 링크에서 z-축으로 0.5 단위만큼 떨어져 있다. 조인트의 회전 축은 z-축을 기준으로 설정되어 있다.

9. 링크 및 조인트의 물리적 제약

URDF 파일에서는 링크와 조인트의 물리적 제약 조건을 정의할 수 있다. 이러한 제약 조건은 로봇이 실제 물리적 세계에서 할 수 있는 동작을 제한하거나 조정하는 역할을 한다.

9.1 조인트 제약

조인트는 링크 간의 상대적 움직임을 정의할 뿐만 아니라, 특정 범위 내에서만 움직일 수 있도록 제한할 수 있다. 예를 들어, 회전 조인트의 경우 회전 각도를 제한하여 로봇이 자연스러운 동작을 하도록 설정할 수 있다.

<joint name="joint1" type="revolute">
    <limit lower="-1.57" upper="1.57" effort="100" velocity="1.0"/>
</joint>

이 설정은 조인트가 -90^\circ에서 90^\circ 사이에서만 회전할 수 있도록 제한하며, 최대 힘과 속도도 제한된다.

9.2 링크의 물리적 제약

각 링크는 질량, 마찰, 충돌 처리 등의 물리적 제약을 가질 수 있다. 특히 로봇의 각 부분이 실제 세계에서 어떻게 동작할지를 시뮬레이션하기 위해 물리 엔진이 이러한 제약 조건을 사용한다.

마찰 계수 \mu는 링크가 접촉할 때의 마찰력을 나타내며, URDF 파일에서는 다음과 같이 정의할 수 있다.

<collision>
    <geometry>
        <box size="0.5 0.5 0.5"/>
    </geometry>
    <surface>
        <friction>
            <ode>
                <mu>1.0</mu>
                <mu2>1.0</mu2>
            </ode>
        </friction>
    </surface>
</collision>

이 설정은 링크가 충돌할 때 발생하는 마찰을 정의하며, 링크의 움직임에 큰 영향을 미친다.

10. URDF 파일의 최적화

URDF 파일을 작성할 때, 로봇 모델의 복잡성과 성능을 고려하여 최적화하는 것이 중요하다. URDF는 기본적으로 XML 형식으로 작성되므로 파일이 커질수록 파싱과 시뮬레이션 성능이 저하될 수 있다. 이를 방지하기 위해 여러 가지 최적화 기법을 사용할 수 있다.

10.1 xacro를 사용한 파일 간소화

xacro(XML Macro)는 URDF 파일을 매크로로 정의하고 재사용성을 높이기 위한 도구이다. xacro를 사용하면 반복되는 코드를 줄이고, URDF 파일을 보다 효율적으로 관리할 수 있다. 다음은 xacro를 사용한 간단한 예시이다.

<xacro:macro name="my_link" params="name color">
    <link name="${name}">
        <visual>
            <geometry>
                <box size="0.5 0.5 0.5"/>
            </geometry>
            <material name="${color}"/>
        </visual>
    </link>
</xacro:macro>

<robot name="my_robot">
    <xacro:my_link name="base_link" color="red"/>
    <xacro:my_link name="link1" color="blue"/>
</robot>

이 예시에서는 my_link 매크로를 정의하여 링크를 간단하게 재사용할 수 있다. 매크로 내부에서 파라미터를 사용하여 링크의 이름과 색상을 동적으로 설정할 수 있다. 이를 통해 URDF 파일의 크기를 줄이고, 가독성을 높일 수 있다.