SRDF 조사
Semantic Robot Description Format
📌 SRDF란?
- SRDF는 URDF로 표현하지 못하는, 로봇의 의미론적(semantic) 정보를 정의하는 XML 포맷
- 예를 들어, 어떤 조인트들이 로봇의 "팔"에 해당하는지, 어떤 링크쌍의 충돌은 무시해도 되는지 등의 정보가 포함
- MoveIt이나 모션 플래닝에서 많이 사용
🏗️ 전체 구조
- <robot> element
- 모든 SRDF 내용은 이 태그 안에 들어가야한다.
- 내부 요소: <group>, <end_effector>, <virtual_joint>, <group_state>, <disable_collisions>
- <robot name="my_robot"> ... </robot>
- name: 로봇 이름. URDF에서 정의한 이름과 동일해야 함
- 모든 SRDF 내용은 이 태그 안에 들어가야한다.
- <group> element
- 이 태그는 조인트와 링크의 집합을 나타낸다. 모션 플래닝에서 어느 부위를 사용할지 정의하거나, 팔과 같은 서브시스템을 만들 때 사용 (예: left_arm, right_arm, gripper 등)
- 내부 요소: <link>, <joint>, <chain>, <group>
- <chain>: base_link~tip_link까지 포함 (조인트, 링크 자동 포함)
- 내부 요소: <link>, <joint>, <chain>, <group>
- <group name="left_arm"> <chain base_link="shoulder" tip_link="wrist"/> </group>
- 이 태그는 조인트와 링크의 집합을 나타낸다. 모션 플래닝에서 어느 부위를 사용할지 정의하거나, 팔과 같은 서브시스템을 만들 때 사용 (예: left_arm, right_arm, gripper 등)
- <group_state> element
- 특정 그룹에 대해 "자세 프리셋"을 정의
- 예: 팔을 접은 상태, 준비 자세 등
- <group_state name="home" group="left_arm"> <joint name="shoulder_joint" value="0.0" /> <joint name="elbow_joint" value="1.57" /> </group_state>
- 이 태그는 그룹에 대해 “folded arms"처럼 특정 조인트 값들의 조합으로 이름 있는 상태를 정의할 수 있게 해준다. 모든 조인트의 값이 포함되어야 유효한 상태로 간주된다.
- <link> element
- 그룹에 링크를 포함시킴
- <link name="forearm_link"/>
- 이 링크가 그룹의 일부임을 나타낸다. 링크를 추가하면 해당 링크의 부모 조인트도 자동으로 포함된다.
- <joint> element
- 그룹에 조인트를 포함시킴
- <joint name="elbow_joint"/>
- 이 조인트가 그룹의 일부임을 나타낸다. 조인트를 추가하면 해당 조인트의 자식 링크도 자동으로 포함된다.
- <chain> element
- 로봇의 팔처럼 연결된 구조를 정의할 때 유용.
- base_link에서 tip_link까지 연결된 링크와 조인트들을 포함. 이 사이를 연결하는 조인트들은 자동으로 포함된다.
- <chain base_link="shoulder_link" tip_link="wrist_link"/>
- <end_effector> element
- 로봇의 엔드 이펙터(gripper, tool 등)를 정의parent_link는 이 장치가 붙는 링크를, group은 엔드 이펙터를 구성하는 조인트들을 나타낸다. name은 end effector의 이름이다.
- <end_effector name="gripper" parent_link="wrist_link" group="gripper_group"/>
- <virtual_joint> element
- 로봇이 외부 환경과 연결되는 조인트 (예: 모바일 로봇의 베이스 위치)
- <virtual_joint name="world_joint" type="floating" parent_frame="world" child_link="base_link"/>
- 종류:
- fixed: 고정 (0 DOF)
- planar: 평면 이동 (x, y, yaw) – 3 DOF
- floating: 자유 이동/회전 – 6 DOF
- <disable_collisions> element
- 특정 링크쌍 사이의 충돌을 무시함
- <disable_collisions link1="linkA" link2="linkB" reason="Adjacent"/>
- 기본적으로는 모든 링크끼리 충돌 가능성이 있다고 가정하지만, 이 태그를 사용하면 특정 링크쌍의 충돌 검사를 생략가능. reason (optional)
- <passive_joint> element
- 모터가 없거나 제어 불가능한 조인트를 정의
- URDF에서 정의된 모든 조인트는 기본적으로 제어 가능한 것으로 가정되지만, 이 태그로 수동 조인트를 따로 지정가능.
- <passive_joint name="caster_wheel_joint"/>
- <link_sphere_approximation> element
- 충돌 검사에 사용할 구체 정보를 직접 지정
- 링크를 구체로 근사하여 충돌 검사를 빠르게 수행할 수 있도록 해주는 태그. 모든 구의 반지름이 0일 경우 해당 링크는 충돌 검사에서 제외.
- <link_sphere_approximation link="some_link"> <sphere center="0 0 0" radius="0.1"/> </link_sphere_approximation>
- <sphere> element
예시
<robot name="pr2">
<!-- 모바일 베이스와의 연결 -->
<virtual_joint name="world_joint" type="planar" parent_frame="odom" child_link="base_footprint"/>
<!-- 양팔 그룹 정의 -->
<group name="right_arm">
<chain base_link="torso_lift_link" tip_link="r_wrist_roll_link"/>
</group>
<group name="left_arm">
<chain base_link="torso_lift_link" tip_link="l_wrist_roll_link"/>
</group>
<!-- 팔 전체 그룹 -->
<group name="arms">
<group name="left_arm"/>
<group name="right_arm"/>
</group>
<!-- 접은 자세 프리셋 -->
<group_state name="tuck_arms" group="arms">
<joint name="l_shoulder_pan_joint" value="0.2" />
<!-- 기타 조인트 생략 -->
</group_state>
<!-- 이동 베이스 -->
<group name="base">
<joint name="world_joint"/>
</group>
<!-- 전체 몸통 그룹 -->
<group name="whole_body">
<group name="arms"/>
<group name="base"/>
<joint name="torso_lift_joint"/>
</group>
<!-- 양쪽 그리퍼 그룹 -->
<group name="l_end_effector">
<joint name="l_gripper_palm_joint"/>
<!-- 생략 -->
</group>
<group name="r_end_effector">
<joint name="r_gripper_palm_joint"/>
<!-- 생략 -->
</group>
<!-- 엔드이펙터 지정 -->
<end_effector name="r_end_effector" parent_link="r_wrist_roll_link" group="r_end_effector"/>
<end_effector name="l_end_effector" parent_link="l_wrist_roll_link" group="l_end_effector"/>
<!-- 충돌 제외 -->
<disable_collisions link1="r_shoulder_pan_link" link2="r_shoulder_lift_link"/>
</robot>
PR2 로봇의 SRDF 파일 예시로, 각 팔, 베이스, 엔드이펙터, 충돌 제외 항목 등을 구성한 것
🔧 URDF vs SRDF — 개념 비교
항목 URDF (Unified Robot Description Format) SRDF (Semantic Robot Description Format)
| 📌 목적 | 로봇의 물리적 구조 설명 | 로봇의 의미론적 정보 설명 |
| 📁 형식 | .urdf 또는 .xacro (XML 기반) | .srdf (XML 기반) |
| 🧱 포함 내용 | 링크, 조인트, 관절 제한, 관성, 시각/충돌/물리 속성 | 조인트/링크 그룹, 엔드이펙터, 프리셋 자세, 충돌 무시 설정 등 |
| 🧩 용도 | 시뮬레이션(Gazebo 등), 시각화(RViz 등) | 모션 플래닝(MoveIt 등) |
| ⚙️ 예시 | 로봇의 몸통, 팔, 바퀴의 연결 구조 정의 | 왼팔 그룹, 오른팔 그룹, home 자세, 충돌 제외 링크쌍 정의 |
🦾 URDF는?
예:
- 이 로봇은 바퀴 4개야
- 몸통에서 팔로 revolute 조인트가 연결돼 있어
- 각 링크는 질량이 얼마고, 관성은 이렇고
- 시각적으로 어떤 모양(메쉬)이고, 충돌 형상은 뭐야?
➡️ 즉, 기계적인, 물리적인 로봇 정의
➡️ 주로 Gazebo 시뮬레이션, RViz 시각화, 제어 알고리즘 등에 사용됨
🧠 SRDF는?
"로봇을 어떤 식으로 사용할 건지 알려줄게!"
예:
- 왼팔은 이 조인트들과 링크로 이루어졌어 → <group>
- home 자세는 이 각도로 설정할게 → <group_state>
- 이 링크쌍은 충돌 무시해도 돼 → <disable_collisions>
- 엔드이펙터는 이 링크에 붙었어 → <end_effector>
➡️ 즉, 로봇의 의미, 동작 목적에 따른 정보 정의
➡️ 주로 MoveIt 모션 플래닝, 경로 생성 등에 사용됨
🔄 관계 정리
- URDF가 먼저 필수! → 로봇의 기본 구조 정의
- SRDF는 URDF 기반으로 작성 → 의미론적 구조 추가
- SRDF는 URDF의 확장이 아닌 보완적인 역할을 함
- MoveIt에서는 URDF + SRDF를 함께 불러서 사용함
URDF와 SRDF가 어디에 쓰이는지, 어떻게 함께 작동해서 로봇을 실제로 움직이게 만드는지, MoveIt에서 어떻게 활용되는지?
예시:
- Franka Emika Panda
- ROS 2용 panda_moveit_config 패키지
📍 URDF 예시 (panda.urdf.xacro 또는 panda.urdf)
<link name="panda_link0"/>
<joint name="panda_joint1" type="revolute">
<parent link="panda_link0"/>
<child link="panda_link1"/>
<limit effort="87" velocity="2.175" lower="-2.8973" upper="2.8973"/>
</joint>
📌 여기서 정의하는 것은:
- 각 링크와 조인트 연결 구조
- 움직임 제한 범위, 질량, 관성
- 시각화 메쉬, 충돌체 메쉬
- ➡️ Gazebo, RViz, 실제 물리 시뮬레이션에 사용됨
📍 SRDF 예시 (panda.srdf)
<group name="panda_arm">
<chain base_link="panda_link0" tip_link="panda_link7"/>
</group>
<group_state name="ready" group="panda_arm">
<joint name="panda_joint1" value="0.0"/>
<joint name="panda_joint2" value="-0.785"/>
<!-- ... 나머지 조인트 값 ... -->
</group_state>
<end_effector name="panda_hand" parent_link="panda_link7" group="hand"/>
📌 여기서 정의하는 것은:
- 팔 전체를 하나의 그룹으로 정의 (panda_arm)
- 초기 자세 (ready pose)
- 말단장치가 어디 붙었는지 (end_effector)
- ➡️ MoveIt의 모션 플래닝, path planning, RViz 인터페이스에서 사용됨
🧪 예: “팔을 ready pose로 보내기”
🔹 ① MoveIt이 로봇 로딩할 때:
역할 파일
| 로봇의 구조, 조인트, 링크 로딩 | panda.urdf |
| 어느 부위가 "팔"인지 그룹 설정 | panda.srdf |
| "ready" 상태의 조인트 값 불러오기 | panda.srdf |
🔹 ② 모션 계획 실행
- 사용자가 RViz에서 "ready pose" 버튼 클릭
- MoveIt은 SRDF에서 group_state name="ready" 찾아서 조인트 목표값 결정
- 해당 group="panda_arm" → URDF에서 각 조인트의 현재 상태와 제약 확인
- 경로 생성 (RRT 등) → URDF로부터 충돌체 메쉬도 사용됨
- Trajectory 생성 → 컨트롤러에게 전달
- 실제 로봇 또는 시뮬레이터가 조인트를 따라 움직임
1. SRDF와 키워드들의 관련성
🔹 SRDF (Semantic Robot Description Format)
- 역할: 로봇의 의미론적 정보를 정의하는 XML 기반 포맷
- 주요 내용: 로봇의 조인트 그룹, 엔드이펙터, 프리셋 자세, 충돌 무시 설정 등
🔹 Morphology
- 일반적 의미: 형태학, 구조나 형태에 대한 연구
- 로봇공학에서: 로봇의 물리적 구조나 형태를 지칭
관련성: SRDF는 로봇의 의미론적 정보를 다루지만, 이는 로봇의 물리적 형태나 구조(morphology)와 밀접하게 연관. 예를 들어, 로봇의 팔이나 다리 같은 서브시스템을 정의할 때, 그 구조적 형태를 고려해야 하기 때문.
🔹 Personification
- 의미: 의인화, 인간의 특성을 부여하는 것
- 로봇공학에서: 로봇에 인간적인 특성이나 역할을 부여하는 것
관련성: SRDF 자체는 로봇의 의미론적 정보를 정의하지만, 이를 통해 로봇의 특정 동작이나 역할을 설정함으로써 의인화된 행동을 구현 가능. 예를 들어, 로봇의 "greeting" 자세를 정의하여 인간과의 상호작용을 향상시킬 수 있음.