659.94 URDF를 이용한 프레임 정의
1. 개요
URDF(Unified Robot Description Format)는 로봇의 물리적 구조를 XML 형식으로 기술하는 ROS 표준 포맷이다. URDF는 로봇을 링크(link)와 관절(joint)의 트리 구조로 표현하며, 각 링크에 좌표 프레임이 할당된다. URDF에서 정의된 로봇 모델은 robot_state_publisher에 의하여 TF2 변환 트리로 자동 발행되므로, URDF의 프레임 정의는 TF2 좌표 변환의 근간이 된다.
2. URDF의 기본 구조
2.1 핵심 요소
URDF는 다음의 핵심 XML 요소로 구성된다.
| 요소 | 역할 | TF2와의 관계 |
|---|---|---|
<robot> | 로봇 모델의 최상위 요소 | TF2 트리의 범위를 정의 |
<link> | 강체(rigid body) 부품 정의 | TF2 프레임에 대응 |
<joint> | 두 링크 간의 연결 정의 | TF2 변환에 대응 |
2.2 최소 URDF 구조
<?xml version="1.0" encoding="UTF-8"?>
<robot name="my_robot">
<!-- 첫 번째 링크 (base_link) -->
<link name="base_link">
<visual>
<geometry>
<box size="0.5 0.3 0.15"/>
</geometry>
</visual>
</link>
<!-- 두 번째 링크 -->
<link name="sensor_link">
<visual>
<geometry>
<cylinder radius="0.03" length="0.05"/>
</geometry>
</visual>
</link>
<!-- 관절: base_link → sensor_link -->
<joint name="sensor_joint" type="fixed">
<parent link="base_link"/>
<child link="sensor_link"/>
<origin xyz="0.3 0.0 0.15" rpy="0 0 0"/>
</joint>
</robot>
3. 링크(Link) 요소
3.1 링크의 하위 요소
<link name="link_name">
<!-- 시각적 표현 (RViz2 시각화) -->
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<box size="0.5 0.3 0.15"/> <!-- 상자 -->
<!-- <cylinder radius="0.05" length="0.1"/> -->
<!-- <sphere radius="0.05"/> -->
<!-- <mesh filename="package://pkg/meshes/part.dae"/> -->
</geometry>
<material name="grey">
<color rgba="0.5 0.5 0.5 1.0"/>
</material>
</visual>
<!-- 충돌 검사용 형상 (Gazebo 물리 시뮬레이션) -->
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<box size="0.5 0.3 0.15"/>
</geometry>
</collision>
<!-- 관성 특성 (Gazebo 동역학 시뮬레이션) -->
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="10.0"/>
<inertia ixx="0.1" ixy="0" ixz="0"
iyy="0.15" iyz="0" izz="0.2"/>
</inertial>
</link>
3.2 프레임과의 관계
각 링크에는 자동으로 좌표 프레임이 할당되며, 이 프레임의 원점과 방향은 관절(joint)의 <origin> 요소에 의하여 결정된다. 링크 내부의 <visual>, <collision>, <inertial> 요소의 <origin>은 링크 프레임에 대한 상대적 위치를 나타낸다.
4. 관절(Joint) 요소
4.1 관절 유형
| 유형 | 설명 | 자유도 | TF2 변환 유형 |
|---|---|---|---|
fixed | 고정 관절 (이동 불가) | 0 | 정적 변환 |
revolute | 회전 관절 (각도 제한 있음) | 1 | 동적 변환 |
continuous | 연속 회전 관절 (각도 제한 없음) | 1 | 동적 변환 |
prismatic | 직선 관절 (병진 운동) | 1 | 동적 변환 |
floating | 6자유도 자유 관절 | 6 | 동적 변환 |
planar | 2D 평면 운동 관절 | 3 | 동적 변환 |
4.2 관절의 하위 요소
<joint name="joint_name" type="revolute">
<!-- 부모-자식 관계 -->
<parent link="parent_link"/>
<child link="child_link"/>
<!-- 변환: 부모 프레임에서 자식 프레임으로의 변환 -->
<origin xyz="0.0 0.0 0.1" rpy="0 0 0"/>
<!-- 회전/병진 축 (revolute, continuous, prismatic) -->
<axis xyz="0 0 1"/>
<!-- 관절 제한 (revolute, prismatic) -->
<limit lower="-1.57" upper="1.57"
velocity="1.0" effort="100.0"/>
<!-- 동역학 특성 -->
<dynamics damping="0.1" friction="0.05"/>
</joint>
4.3 origin 요소의 의미
<origin xyz="x y z" rpy="roll pitch yaw"/>는 부모 링크의 프레임에서 자식 링크의 프레임으로의 정적 오프셋을 정의한다. 이 오프셋은 관절이 초기 위치(0)에 있을 때의 두 프레임 사이의 관계이다.
T_{\text{parent} \leftarrow \text{child}} = T_{\text{translation}}(x, y, z) \cdot T_{\text{rotation}}(\phi, \theta, \psi)
여기서 \phi, \theta, \psi는 각각 Roll, Pitch, Yaw이며, 고정 축(fixed-axis) XYZ 순서로 회전이 적용된다.
5. TF2 프레임 트리와의 대응
5.1 URDF에서 TF2로의 변환 규칙
- 각
<link>요소는 하나의 TF2 프레임에 대응한다. - 각
<joint>요소는 부모 프레임에서 자식 프레임으로의TransformStamped에 대응한다. fixed관절은/tf_static으로 발행된다.- 가동 관절(
revolute,continuous,prismatic)은/tf로 발행된다.
5.2 트리 구조의 제약
URDF는 트리(tree) 구조만을 허용하며, 순환(cycle)이나 다중 부모를 허용하지 않는다. 이는 TF2의 단일 트리 제약과 일치한다. 폐쇄 체인 기구(closed-chain mechanism)는 URDF로 직접 표현할 수 없으며, 추가적인 가상 관절이나 플러그인이 필요하다.
6. 프레임 정의 예시
6.1 이동 로봇
<robot name="mobile_robot">
<!-- 본체 -->
<link name="base_link">
<visual>
<geometry><box size="0.5 0.3 0.15"/></geometry>
</visual>
<collision>
<geometry><box size="0.5 0.3 0.15"/></geometry>
</collision>
<inertial>
<mass value="10.0"/>
<inertia ixx="0.1" ixy="0" ixz="0"
iyy="0.15" iyz="0" izz="0.2"/>
</inertial>
</link>
<!-- 좌측 바퀴 -->
<link name="wheel_left_link">
<visual>
<geometry><cylinder radius="0.05" length="0.02"/></geometry>
</visual>
</link>
<joint name="wheel_left_joint" type="continuous">
<parent link="base_link"/>
<child link="wheel_left_link"/>
<origin xyz="0.0 0.17 -0.05" rpy="-1.5708 0 0"/>
<axis xyz="0 0 1"/>
</joint>
<!-- 우측 바퀴 -->
<link name="wheel_right_link">
<visual>
<geometry><cylinder radius="0.05" length="0.02"/></geometry>
</visual>
</link>
<joint name="wheel_right_joint" type="continuous">
<parent link="base_link"/>
<child link="wheel_right_link"/>
<origin xyz="0.0 -0.17 -0.05" rpy="-1.5708 0 0"/>
<axis xyz="0 0 1"/>
</joint>
<!-- 전방 LiDAR -->
<link name="laser_link">
<visual>
<geometry><cylinder radius="0.03" length="0.04"/></geometry>
</visual>
</link>
<joint name="laser_joint" type="fixed">
<parent link="base_link"/>
<child link="laser_link"/>
<origin xyz="0.25 0.0 0.12" rpy="0 0 0"/>
</joint>
</robot>
7. URDF 유효성 검증
7.1 check_urdf 도구
# URDF 파일의 구문 및 구조 검증
check_urdf robot.urdf
이 도구는 URDF 파일의 XML 구문, 링크-관절 연결의 유효성, 트리 구조의 단일 루트 조건 등을 검증한다.
7.2 urdf_to_graphviz 도구
# URDF 구조를 그래프로 시각화
urdf_to_graphviz robot.urdf
이 도구는 URDF의 링크-관절 구조를 Graphviz DOT 형식으로 출력하며, 이를 통하여 프레임 트리의 구조를 시각적으로 확인할 수 있다.
8. 요약
URDF는 로봇의 물리적 구조를 링크와 관절의 트리로 기술하며, 각 링크는 TF2 프레임에, 각 관절은 TF2 변환에 대응한다. 관절의 <origin> 요소가 두 프레임 사이의 정적 오프셋을 정의하며, 고정 관절은 정적 변환으로, 가동 관절은 동적 변환으로 발행된다. URDF의 정확한 작성은 TF2 변환 트리의 정확성을 보장하는 근간이다.
참고 문헌 및 출처
- ROS2 공식 문서, “URDF Tutorials”, https://docs.ros.org/en/humble/Tutorials/Intermediate/URDF/ (ROS2 Humble Hawksbill)
- URDF XML Specification, http://wiki.ros.org/urdf/XML
urdf패키지 API 문서, https://docs.ros2.org/latest/api/urdf/ (ROS2 Humble Hawksbill)