로봇 시뮬레이션에서 로봇의 정확한 동작과 상호작용을 구현하기 위해서는 로봇의 구조를 정밀하게 모델링하는 것이 필수적이다. URDF(Unified Robot Description Format)는 로봇의 물리적 특성과 구조를 정의하는 XML 기반의 파일 포맷으로, ROS(Robot Operating System)와 함께 널리 사용된다. 이 절에서는 URDF 파일을 이용한 로봇 모델링의 기본 개념과 구성 요소, 작성 방법에 대해 자세히 살펴본다.
URDF의 기본 개념
URDF는 로봇의 각 구성 요소인 링크(link)와 조인트(joint)를 정의하여 로봇의 전체 구조를 기술한다. 링크는 로봇의 각 부분을 나타내며, 조인트는 링크 간의 연결과 운동 방식을 정의한다. URDF 파일은 이러한 링크와 조인트의 계층적 구조를 통해 로봇의 전체적인 동작을 시뮬레이션할 수 있도록 한다.
URDF 파일의 구조
URDF 파일은 XML 형식으로 작성되며, 기본적으로 <robot>
태그로 시작하여 로봇의 이름을 지정한다. 그 내부에 여러 개의 <link>
와 <joint>
태그가 포함되어 로봇의 각 구성 요소와 그 관계를 정의한다.
<robot name="my_robot">
<!-- 링크 정의 -->
<link name="base_link">
<!-- 링크의 물리적 속성 -->
</link>
<!-- 조인트 정의 -->
<joint name="base_to_link1" type="revolute">
<!-- 조인트의 속성 -->
</joint>
<!-- 추가적인 링크와 조인트 -->
</robot>
링크(Link) 정의
링크는 로봇의 고정된 부분 또는 움직이는 부분을 나타낸다. 각 링크는 고유한 이름을 가지며, 질량, 관성, 시각적 모델, 충돌 모델 등의 물리적 속성을 포함할 수 있다.
링크의 주요 요소
- Inertial: 링크의 질량과 관성 텐서를 정의한다.
- Visual: 링크의 시각적 표현을 위한 메쉬 파일이나 색상 정보를 포함한다.
- Collision: 링크의 충돌 감지를 위한 콜리전 메쉬나 단순한 형상을 정의한다.
<link name="base_link">
<inertial>
<mass value="5.0"/>
<inertia ixx="0.1" ixy="0.0" ixz="0.0"
iyy="0.1" iyz="0.0"
izz="0.1"/>
</inertial>
<visual>
<geometry>
<box size="1 1 0.5"/>
</geometry>
<material name="blue">
<color rgba="0 0 1 1"/>
</material>
</visual>
<collision>
<geometry>
<box size="1 1 0.5"/>
</geometry>
</collision>
</link>
조인트(Joint) 정의
조인트는 두 링크 사이의 연결과 그 연결을 통해 가능한 움직임을 정의한다. 조인트는 고정(fixed), 회전(revolute), 선형(prismatic) 등 다양한 타입이 있으며, 각 타입에 따라 로봇의 움직임 방식이 결정된다.
조인트의 주요 요소
- Type: 조인트의 타입을 지정한다. 예를 들어, 회전 조인트는
revolute
, 고정 조인트는fixed
등으로 설정된다. - Parent and Child: 조인트가 연결되는 부모 링크와 자식 링크를 지정한다.
- Origin: 조인트의 위치와 회전을 정의한다.
- Axis: 조인트의 회전 또는 이동 축을 정의한다.
- Limits: 조인트의 운동 범위를 설정한다(회전 각도, 이동 거리 등).
<joint name="base_to_link1" type="revolute">
<parent link="base_link"/>
<child link="link1"/>
<origin xyz="0 0 0.5" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="-1.57" upper="1.57" effort="10" velocity="1.0"/>
</joint>
URDF 작성 시 고려사항
URDF 파일을 작성할 때는 로봇의 물리적 특성과 동작 방식을 정확하게 반영하는 것이 중요하다. 다음은 URDF 작성 시 고려해야 할 주요 사항들이다.
- 정확한 단위 사용: URDF는 미터(m), 킬로그램(kg), 초(s) 등의 SI 단위를 사용하므로, 모든 물리적 속성은 일관된 단위로 정의해야 한다.
- 모델의 계층적 구조: 로봇의 각 링크와 조인트는 논리적인 계층 구조를 가져야 한다. 부모-자식 관계가 명확하게 정의되어야 로봇의 움직임이 올바르게 시뮬레이션된다.
- 시각적 및 충돌 메쉬의 최적화: 시뮬레이션 성능을 향상시키기 위해 시각적 메쉬와 충돌 메쉬는 가능한 단순하게 유지하는 것이 좋다.
- 관성 텐서의 정확성: 로봇의 동적 특성을 정확하게 반영하기 위해 각 링크의 관성 텐서를 신중하게 계산해야 한다.
URDF 예제: 간단한 로봇 팔
아래는 두 개의 링크와 하나의 회전 조인트로 구성된 간단한 로봇 팔의 URDF 예제이다.
<robot name="simple_arm">
<link name="base_link">
<inertial>
<mass value="2.0"/>
<inertia ixx="0.1" ixy="0.0" ixz="0.0"
iyy="0.1" iyz="0.0"
izz="0.1"/>
</inertial>
<visual>
<geometry>
<cylinder radius="0.5" length="0.2"/>
</geometry>
<material name="green">
<color rgba="0 1 0 1"/>
</material>
</visual>
<collision>
<geometry>
<cylinder radius="0.5" length="0.2"/>
</geometry>
</collision>
</link>
<link name="link1">
<inertial>
<mass value="1.0"/>
<inertia ixx="0.05" ixy="0.0" ixz="0.0"
iyy="0.05" iyz="0.0"
izz="0.05"/>
</inertial>
<visual>
<geometry>
<box size="1 0.2 0.2"/>
</geometry>
<material name="red">
<color rgba="1 0 0 1"/>
</material>
</visual>
<collision>
<geometry>
<box size="1 0.2 0.2"/>
</geometry>
</collision>
</link>
<joint name="base_to_link1" type="revolute">
<parent link="base_link"/>
<child link="link1"/>
<origin xyz="0 0 0.1" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="-1.57" upper="1.57" effort="5" velocity="1.0"/>
</joint>
</robot>
이 예제에서는 base_link
와 link1
이라는 두 개의 링크가 정의되어 있으며, base_to_link1
이라는 회전 조인트로 연결되어 있다. base_link
는 원통형으로 시각화되며, link1
은 상자 형태로 시각화된다. 조인트는 Z축을 중심으로 회전할 수 있으며, 회전 범위는 -90도에서 90도로 설정되어 있다.
URDF의 고급 기능
기본적인 링크와 조인트 정의 외에도 URDF는 로봇의 동작을 보다 정밀하게 모델링하기 위해 다양한 고급 기능을 제공한다. 이 절에서는 URDF의 고급 기능인 Transmission, Sensor, 그리고 Plugin 등을 다루며, 이를 통해 로봇 시뮬레이션의 현실감을 높이는 방법을 설명한다.
Transmission 정의
Transmission은 로봇의 조인트가 실제로 어떻게 구동되는지를 정의하는 요소이다. 주로 로봇의 구동 메커니즘을 시뮬레이션할 때 사용되며, 모터와 조인트 간의 연결 방식을 설정한다. Transmission 요소는 주로 ROS와의 통합에서 중요한 역할을 한다.
Transmission의 주요 요소
- Type: Transmission의 타입을 지정한다. 예를 들어,
transmission_interface/SimpleTransmission
등이 있다. - Joint: Transmission이 연결되는 조인트의 이름을 지정한다.
- Actuator: Transmission에 연결되는 액추에이터(모터)의 이름을 지정한다.
<transmission name="trans1">
<type>transmission_interface/SimpleTransmission</type>
<joint name="base_to_link1"/>
<actuator name="motor1">
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
Transmission 예제
다음은 간단한 회전 조인트에 Transmission을 추가한 예제이다.
<transmission name="base_to_link1_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="base_to_link1"/>
<actuator name="motor1">
<mechanicalReduction>2</mechanicalReduction>
</actuator>
</transmission>
이 예제에서는 base_to_link1
조인트에 motor1
이라는 액추에이터가 연결되어 있으며, 기계적 감속비가 2로 설정되어 있다. 이는 모터의 회전이 조인트에 전달될 때 두 배로 감속됨을 의미한다.
센서 정의
URDF는 로봇에 부착된 다양한 센서를 정의할 수 있는 기능을 제공한다. 센서 정의는 주로 시뮬레이션에서 로봇의 환경 인식을 구현할 때 사용된다. URDF 자체에는 센서에 대한 직접적인 지원이 제한적이지만, Gazebo와 같은 시뮬레이터와의 통합을 통해 센서를 정의할 수 있다.
센서의 주요 요소
- Sensor Type: 센서의 종류를 지정한다. 예를 들어, 카메라, 라이다, IMU 등이 있다.
- Pose: 센서가 로봇 내에서 위치하는 위치와 방향을 정의한다.
- Sensor Parameters: 센서의 특성에 따른 다양한 파라미터를 설정한다.
카메라 센서 예제
다음은 로봇에 카메라 센서를 추가하는 URDF 예제이다.
<link name="camera_link">
<visual>
<geometry>
<box size="0.1 0.1 0.1"/>
</geometry>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
<collision>
<geometry>
<box size="0.1 0.1 0.1"/>
</geometry>
</collision>
</link>
<joint name="camera_joint" type="fixed">
<parent link="link1"/>
<child link="camera_link"/>
<origin xyz="0 0 0.5" rpy="0 0 0"/>
</joint>
<!-- Gazebo 전용 센서 정의 -->
<gazebo reference="camera_link">
<sensor type="camera" name="front_camera">
<pose>0 0 0 0 0 0</pose>
<camera>
<horizontal_fov>1.047</horizontal_fov>
<image>
<width>640</width>
<height>480</height>
<format>R8G8B8</format>
</image>
<clip>
<near>0.1</near>
<far>100</far>
</clip>
</camera>
<always_on>true</always_on>
<update_rate>30.0</update_rate>
</sensor>
</gazebo>
이 예제에서는 camera_link
라는 새로운 링크를 추가하고, 이를 기존의 link1
에 고정 조인트로 연결한다. 이후 Gazebo 전용 태그를 사용하여 카메라 센서를 정의한다. 카메라의 시야각, 해상도, 클리핑 범위 등을 설정할 수 있다.
URDF에서의 Mesh 사용
로봇의 시각적 및 충돌 메쉬를 정의할 때, URDF는 외부 메쉬 파일을 참조할 수 있는 기능을 제공한다. 메쉬 파일은 로봇의 복잡한 형상을 보다 정밀하게 표현할 수 있도록 도와준다.
Mesh 정의의 주요 요소
- Geometry Type: 메쉬의 형상을 지정한다. 일반적으로
mesh
타입을 사용한다. - Filename: 메쉬 파일의 경로를 지정한다.
- Scale: 메쉬의 크기를 조정할 수 있는 스케일 팩터를 지정한다.
<visual>
<geometry>
<mesh filename="package://my_robot/meshes/base.dae" scale="1 1 1"/>
</geometry>
<material name="grey">
<color rgba="0.5 0.5 0.5 1"/>
</material>
</visual>
Mesh 사용 시 고려사항
- 파일 형식: URDF는 일반적으로 Collada (
.dae
) 또는 STL (.stl
) 형식의 메쉬 파일을 지원한다. - 파일 경로: 메쉬 파일의 경로는
package://
형식을 사용하여 패키지 내의 파일을 참조할 수 있다. - 스케일링: 메쉬의 크기가 로봇 모델과 일치하도록 스케일을 조정해야 한다. 비일관된 스케일은 시뮬레이션에서 문제를 일으킬 수 있다.
URDF의 제한 사항 및 확장
URDF는 로봇 모델링에 있어 강력한 도구이지만, 몇 가지 제한 사항이 존재한다. 이러한 제한을 극복하기 위해 URDF의 확장 형식이나 대체 포맷인 SDF(Simulation Description Format)를 사용할 수 있다.
URDF의 제한 사항
- 고정된 구조: URDF는 정적인 로봇 구조를 정의하는 데 최적화되어 있으며, 동적인 환경 변화나 복잡한 상호작용을 표현하는 데는 한계가 있다.
- 센서 및 환경 요소의 제한적 지원: URDF 자체는 센서나 환경 요소에 대한 직접적인 지원이 부족하여, 추가적인 설정이 필요하다.
- 복잡한 물리적 특성의 표현 어려움: 로봇의 복잡한 물리적 특성이나 상호작용을 정밀하게 표현하는 데는 한계가 있다.
URDF 확장
URDF의 기능을 확장하기 위해 Gazebo URDF Extensions와 같은 확장 태그를 사용할 수 있다. 이는 Gazebo 시뮬레이터와의 통합을 강화하며, 센서나 물리적 속성을 보다 정밀하게 설정할 수 있게 해준다.
<gazebo>
<plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
<robotNamespace>/my_robot</robotNamespace>
</plugin>
</gazebo>
SDF와의 비교
SDF는 URDF의 한계를 보완하기 위해 설계된 포맷으로, 보다 풍부한 기능과 유연성을 제공한다. SDF는 로봇뿐만 아니라 환경, 센서, 플러그인 등 다양한 요소를 포괄적으로 정의할 수 있다. 그러나 URDF는 ROS와의 호환성 측면에서 여전히 널리 사용된다.