URDF란?

URDF(Universal Robot Description Format)는 XML 형식의 파일로, 로봇의 물리적 구조와 속성을 정의하는 데 사용된다. URDF는 로봇의 링크(구성 요소)와 조인트(이동 가능 부위)를 정의하며, 각 링크의 위치, 관성, 질량, 그리고 시각적/충돌 요소들을 포함한다. 주로 ROS(Robot Operating System)와 연동하여 로봇 모델을 시뮬레이션하거나 실제 로봇 제어에 활용된다.

URDF의 주요 구성 요소

URDF 파일은 여러 가지 요소들로 구성된다. 그 중 가장 중요한 두 가지는 링크조인트이다. 링크는 로봇의 개별적인 구성 요소를 나타내며, 조인트는 각 링크가 연결되는 방식을 정의한다.

URDF의 구조적 개요

URDF 파일의 기본 구조는 XML 형식을 따르며, <robot> 태그 안에 로봇에 대한 정보를 기록한다. 각 링크와 조인트는 <link><joint> 태그로 정의되며, 각 태그 내에 위치, 시각적 요소, 물리적 속성 등을 설정한다.

<robot name="my_robot">
  <link name="base_link">
    <inertial>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <mass value="1.0"/>
      <inertia ixx="0.1" ixy="0.0" ixz="0.0" iyy="0.1" iyz="0.0" izz="0.1"/>
    </inertial>
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <box size="1 1 1"/>
      </geometry>
      <material name="gray"/>
    </visual>
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <box size="1 1 1"/>
      </geometry>
    </collision>
  </link>

  <joint name="base_to_wheel" type="continuous">
    <parent link="base_link"/>
    <child link="wheel_link"/>
    <origin xyz="0 0 -1" rpy="0 0 0"/>
    <axis xyz="0 0 1"/>
    <limit effort="10" velocity="5"/>
  </joint>
</robot>

URDF의 좌표계 및 위치 설정

URDF에서 각 링크와 조인트의 위치는 월드 좌표계(global frame)를 기준으로 정의되거나, 각 링크 간의 상대적 위치로 정의된다. URDF는 rpy(roll, pitch, yaw) 회전 방식을 사용하여 각 링크나 조인트의 회전을 표현하며, 위치는 xyz 좌표로 나타낸다. 수학적으로 각 링크의 위치 \mathbf{p}는 3차원 벡터로 나타내며, 회전은 회전 행렬 \mathbf{R}로 나타낼 수 있다.

여기서 \phi, \theta, \psi는 각각 roll, pitch, yaw에 해당하며, 각 링크의 좌표계는 부모 링크 또는 월드 좌표계와 상대적으로 정의된다.

URDF의 물리적 특성

URDF는 로봇의 각 링크에 대한 물리적 특성을 정의한다. 이때 주로 사용되는 속성들은 질량(mass), 관성 모멘트(inertia), 그리고 마찰(friction)과 같은 항목들이다. 이러한 물리적 특성은 로봇 시뮬레이션 시 동역학적으로 중요한 역할을 하며, 로봇의 움직임을 현실적으로 모사하는 데 사용된다.

질량

로봇의 각 링크는 고유의 질량을 가지며, 질량은 링크의 무게 중심에 집중되어 있다고 가정한다. 질량은 URDF의 <inertial> 태그 내부에서 정의되며, 단위는 킬로그램(kg)이다.

<inertial>
  <mass value="1.0"/>
</inertial>

관성 모멘트

관성 모멘트는 링크가 특정 축을 기준으로 회전할 때의 저항을 나타낸다. URDF에서 관성 모멘트는 관성 행렬로 표현되며, 이는 링크의 중심을 기준으로 계산된다. URDF 파일에서는 I_{xx}, I_{yy}, I_{zz}, I_{xy}, I_{xz}, I_{yz} 요소를 사용해 관성 행렬을 정의한다. 일반적으로 이 관성 행렬은 대칭 행렬로, 다음과 같이 표현된다.

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

예를 들어, 아래의 URDF 코드는 관성 모멘트를 정의하는 방법을 보여준다.

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

이 코드는 각 축에 대해 I_{xx} = 0.1, I_{yy} = 0.1, I_{zz} = 0.1을 정의하고, 다른 항목은 0으로 설정하여 대칭적 관성 행렬을 형성한다.

마찰과 저항

URDF에서는 조인트에 대한 마찰과 저항을 설정하여 로봇의 움직임을 더 현실감 있게 만들 수 있다. 이는 effort(노력)과 velocity(속도) 제한을 설정하여 제어된다. 이를 통해 각 조인트가 특정 힘을 넘어서지 않도록 하거나, 최대 속도를 제한할 수 있다.

<joint name="base_to_wheel" type="continuous">
  <parent link="base_link"/>
  <child link="wheel_link"/>
  <axis xyz="0 0 1"/>
  <limit effort="10" velocity="5"/>
</joint>

위 코드에서 effort는 10 N·m(회전 조인트의 경우) 또는 뉴턴(직선 조인트의 경우)으로 설정되며, 속도는 최대 5 rad/s 또는 m/s로 제한된다.

URDF의 좌표 변환

URDF는 여러 링크와 조인트를 서로 연결하며, 각 링크와 조인트 간의 좌표 변환이 필요하다. 이 변환은 동차 좌표계(homogeneous transformation matrix)로 표현된다. 동차 좌표 변환 \mathbf{T}는 위치 \mathbf{p}와 회전 행렬 \mathbf{R}을 포함하며, 다음과 같이 나타낼 수 있다.

\mathbf{T} = \begin{bmatrix} \mathbf{R} & \mathbf{p} \\ 0 & 1 \end{bmatrix}

이 행렬은 링크 간의 상대적인 위치와 회전을 나타내며, URDF에서 정의된 좌표계를 변환하는 데 사용된다. 각 링크의 위치와 회전은 부모 링크에 대해 정의되므로, 이러한 변환을 통해 로봇의 전체적인 위치와 자세를 결정할 수 있다.

URDF에서의 관성 원점 설정

각 링크의 관성 원점은 링크 내에서 질량이 집중된 지점, 즉 무게 중심(center of mass, CoM)을 나타낸다. URDF에서 <origin> 태그를 사용하여 관성 원점을 정의하며, 이는 링크 좌표계에 대해 상대적으로 정의된다. 이 관성 원점은 좌표 벡터 \mathbf{p}_{inertial}로 표현되며, 이 벡터는 링크의 고유 좌표계에서 정의된다.

\mathbf{p}_{inertial} = \begin{bmatrix} x \\ y \\ z \end{bmatrix}

관성 원점의 좌표를 명확히 설정하지 않으면 링크의 질량 중심이 잘못 정의될 수 있으며, 이는 로봇의 동역학 시뮬레이션에 부정적인 영향을 미칠 수 있다.

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

위 코드에서 <origin> 태그는 질량 중심이 링크의 좌표계 원점에 위치하며, 회전이 없는 상태(rpy = 0, 0, 0)임을 나타낸다.

링크의 시각적 요소 정의

URDF는 로봇의 시각적 모델을 정의할 수 있는 기능을 제공한다. 로봇의 각 링크는 시각적 모델(visual)과 충돌 모델(collision)로 나누어 정의되며, 시각적 모델은 주로 로봇을 시뮬레이션 소프트웨어 내에서 렌더링하기 위한 요소로 사용된다.

시각적 모델은 주로 메쉬 파일(예: STL, Collada)로 표현되며, 간단한 형상(예: 박스, 실린더, 구)으로도 정의할 수 있다. 시각적 모델과 충돌 모델의 차이점은, 시각적 모델은 렌더링에만 사용되며 물리 엔진에는 영향을 미치지 않는다는 점이다.

<visual>
  <origin xyz="0 0 0" rpy="0 0 0"/>
  <geometry>
    <box size="1 1 1"/>
  </geometry>
  <material name="gray"/>
</visual>

위 코드는 1m 크기의 박스를 시각적 모델로 정의하고, 회색 재질을 사용하여 이를 렌더링하도록 설정한다.

링크와 조인트 간의 관계

URDF에서 각 링크는 반드시 조인트를 통해 연결된다. 각 조인트는 부모 링크와 자식 링크를 연결하며, 두 링크 간의 상대적인 이동(translation) 또는 회전(rotation)을 정의한다. 이를 수학적으로 표현하면, 부모 링크의 좌표 \mathbf{p}_{parent}와 자식 링크의 좌표 \mathbf{p}_{child} 사이의 관계는 조인트 변환 \mathbf{T}_{joint}를 통해 다음과 같이 나타낼 수 있다.

\mathbf{p}_{child} = \mathbf{T}_{joint} \mathbf{p}_{parent}

여기서 \mathbf{T}_{joint}는 조인트의 위치와 회전을 포함하는 동차 변환 행렬이다. 조인트의 각도 또는 이동 거리는 URDF 파일 내에서 정의되며, 이 값들은 시뮬레이션에서 로봇의 동작을 결정짓는 중요한 요소가 된다.

<joint name="base_to_arm" type="revolute">
  <parent link="base_link"/>
  <child link="arm_link"/>
  <origin xyz="0 0 0" rpy="0 0 0"/>
  <axis xyz="0 0 1"/>
  <limit lower="-1.57" upper="1.57" effort="100" velocity="1.0"/>
</joint>

위 예시에서, 회전 조인트(revolute joint)를 사용하여 base_linkarm_link를 연결하고 있으며, 이 조인트는 z 축을 기준으로 회전하고, 회전 범위는 -1.57에서 1.57 라디안으로 제한된다.

URDF와 시뮬레이션의 관계

URDF 파일은 로봇의 기계적 구조를 정의하는 데 사용되며, 이 구조는 다양한 시뮬레이션 환경(예: Gazebo, Rviz 등)에서 사용된다. 특히 URDF는 로봇의 운동학적 모델링동역학적 모델링을 위한 기초 정보를 제공하며, 각 링크와 조인트의 물리적 특성을 고려하여 로봇의 실제 움직임을 시뮬레이션할 수 있다.

이 시뮬레이션 과정에서 URDF는 로봇이 환경과 어떻게 상호작용하는지, 센서가 어떻게 데이터를 수집하는지 등을 결정짓는 중요한 역할을 한다.