robot

SRDF(Semantic Robot Description Format)란?

국자집사 2025. 11. 24. 13:36

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에서 정의한 이름과 동일해야 함
  • <group> element
    • 이 태그는 조인트와 링크의 집합을 나타낸다. 모션 플래닝에서 어느 부위를 사용할지 정의하거나, 팔과 같은 서브시스템을 만들 때 사용 (예: left_arm, right_arm, gripper 등)
      • 내부 요소: <link>, <joint>, <chain>, <group>
        • <chain>: base_link~tip_link까지 포함 (조인트, 링크 자동 포함)
    • <group name="left_arm"> <chain base_link="shoulder" tip_link="wrist"/> </group>
  • <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

🔹 ② 모션 계획 실행

  1. 사용자가 RViz에서 "ready pose" 버튼 클릭
  2. MoveIt은 SRDF에서 group_state name="ready" 찾아서 조인트 목표값 결정
  3. 해당 group="panda_arm" → URDF에서 각 조인트의 현재 상태와 제약 확인
  4. 경로 생성 (RRT 등) → URDF로부터 충돌체 메쉬도 사용됨
  5. Trajectory 생성 → 컨트롤러에게 전달
  6. 실제 로봇 또는 시뮬레이터가 조인트를 따라 움직임

1. SRDF와 키워드들의 관련성

🔹 SRDF (Semantic Robot Description Format)

  • 역할: 로봇의 의미론적 정보를 정의하는 XML 기반 포맷
  • 주요 내용: 로봇의 조인트 그룹, 엔드이펙터, 프리셋 자세, 충돌 무시 설정 등

🔹 Morphology

  • 일반적 의미: 형태학, 구조나 형태에 대한 연구
  • 로봇공학에서: 로봇의 물리적 구조나 형태를 지칭

관련성: SRDF는 로봇의 의미론적 정보를 다루지만, 이는 로봇의 물리적 형태나 구조(morphology)와 밀접하게 연관. 예를 들어, 로봇의 팔이나 다리 같은 서브시스템을 정의할 때, 그 구조적 형태를 고려해야 하기 때문.

🔹 Personification

  • 의미: 의인화, 인간의 특성을 부여하는 것
  • 로봇공학에서: 로봇에 인간적인 특성이나 역할을 부여하는 것

관련성: SRDF 자체는 로봇의 의미론적 정보를 정의하지만, 이를 통해 로봇의 특정 동작이나 역할을 설정함으로써 의인화된 행동을 구현 가능. 예를 들어, 로봇의 "greeting" 자세를 정의하여 인간과의 상호작용을 향상시킬 수 있음.