# SRDF와의 차이점(개념적 비교)

#### SRDF란 무엇인가

SRDF(Semantic Robot Description Format)는 주로 로봇의 “의미적(semantic)” 정보들을 기술하기 위해 사용되는 XML 기반의 포맷이다. URDF가 로봇의 물리적·운동학적 구조(링크, 조인트, 관성, 충돌 모델 등)를 정의한다면, SRDF는 그 로봇이 수행할 수 있는 동작 가능 영역(워크스페이스), 조인트 제약, 그룹 설정, 사용하지 않을 링크나 조인트 등의 “설계적 혹은 활용 목적” 정보를 별도로 정의한다. 일반적으로 MoveIt! 등의 모션 플래닝이나 충돌 감지, 그룹 제어 등에 필요한 로봇의 추가 메타데이터를 제공하는 용도로 활용된다.

#### URDF와 SRDF가 공유하는 정보와 구분되는 정보

**공유되는 정보**:

URDF에 정의된 링크와 조인트 이름, 트리 구조 등은 SRDF에서 동일하게 재사용된다. 이를 통해 로봇 구조에 대한 기본 정보를 활용하되, 꼭 필요한 부분만 가져와 SRDF에서 의미적으로 확장한다.

**구분되는 정보**:

* URDF:
  * 링크(기체), 조인트(조인트)의 물리적 구조
  * 질량, 관성 모멘트, 충돌 모델
  * 운동학적 조립 순서, 좌표계 변환 등
  * 예: 로봇 베이스 위치, 각 조인트의 축, 링크의 길이와 부피
* SRDF:
  * 특정 링크나 조인트를 그룹화한 “플래닝 그룹(planning group)” 정보
  * 사용 불가능한 링크나 충돌에서 제외할 링크
  * 조인트별 혹은 조인트 그룹별 동작 범위 제한
  * 엔드 이펙터(End-Effector)로 지정할 링크와 접근 방법
  * 로봇 셋업 시 편의 정보를 위한 메타데이터

#### URDF와 SRDF의 구조적 차이

* URDF는 보통 `<robot>` 태그 아래에 링크(`<link>`)와 조인트(`<joint>`)가 계층적으로 배열되는 형태를 취한다.
* SRDF는 `<robot_semantic>` 태그 아래에 다양한 의미적 태그가 등장한다. 예: `<group>`, `<end_effector>`, `<virtual_joint>`, `<disable_collisions>` 등.
* URDF는 “어떤 로봇인가?”에 집중하고, SRDF는 “그 로봇을 어떻게 쓸 것인가?”에 집중한다.

아래는 개념적으로 URDF와 SRDF가 상호 참조되는 모습을 다이어그램으로 나타낸 예시이다:

{% @mermaid/diagram content="flowchart LR
A\[URDF<br>로봇의 운동학적<br>기본 정보] --> B\["SRDF<br>의미적 정보<br>(Planning Groups,<br>End-Effector 지정 등)"]
B --> C\["ROS 애플리케이션<br>(예: MoveIt!)"]" %}

#### URDF와 SRDF 데이터의 활용

**MoveIt!에서의 활용**:

SRDF는 모션 플래닝이나 역운동학 풀이에서 요구되는 로봇의 그룹(group) 설정을 명확히 하는 데 중요하다. 이를 위해 URDF에 정의된 링크 및 조인트를 그룹화하여 의미적 맥락을 부여한다. 예를 들어, 양팔 로봇에서 왼팔에 해당하는 링크와 조인트들을 하나의 그룹, 오른팔을 또 다른 그룹으로 설정하고, 이 둘을 동시에 제어하고 싶다면 “dual\_arm”이라는 그룹을 추가로 설정할 수 있다.

**충돌 모델에서의 활용**:

URDF에도 충돌 태그는 포함되지만, SRDF에서는 특정 링크 간의 충돌 체크를 비활성화하거나, 충돌 허용을 재정의할 수 있다. 로봇 구조상 어차피 접촉이 항상 일어나는 부위라면 불필요한 충돌 체크를 비활성화하는 식으로 계산량을 줄일 수 있다.

**시뮬레이션 및 기타 환경에서의 활용**:

Gazebo 등과 같은 시뮬레이터에서 URDF는 물리 시뮬레이션의 주체가 되지만, 모션 플래닝이나 경로 생성 같은 고수준 동작에서는 SRDF가 주로 사용된다.

#### SRDF에서의 그룹(Group) 정의와 의미

SRDF 파일에서 핵심적으로 다뤄지는 개념 중 하나가 그룹(Group) 정의이다. 이 그룹 정의는 로봇의 다양한 조인트 및 링크 조합을 추상화하여 하나의 로봇 부분집합으로 다룰 수 있게 한다. 예를 들어, 다음과 같은 그룹 생성이 가능하다.

**팔(Arm) 그룹**: 이동형 로봇에서 팔부(Manipulator)만 별도로 제어할 필요가 있을 때, 이를 하나의 그룹으로 묶는다.

**이동체(Base) 그룹**: 베이스 이동에 관여하는 휠(바퀴)이나 주행용 조인트가 있을 때, 이를 독립적으로 묶어 관리할 수 있다.

**듀얼 암(Dual Arm) 그룹**: 두 팔이 있는 경우, 양 팔의 조인트 전체를 통합 그룹으로 선언하여 함께 모션 플래닝을 수행한다.

URDF가 조인트와 링크를 물리적으로 구분하고 연결 관계를 명시한다면, SRDF는 이 로봇의 하부 구조들을 목적에 맞게 “유연하게 묶어 쓰는” 목적으로 그룹을 정의한다. 이렇게 SRDF에서 정의된 그룹들은 모션 플래닝, 조인트 제약, 경로 계획, 제어 등에 직접 활용된다.

#### SRDF에서의 엔드 이펙터(End-Effector) 정의

엔드 이펙터를 지정하는 이유는 “로봇이 최종적으로 동작하는 출력점(End-Effector)”을 특정 링크로 명확히 구분하기 위함이다. 예를 들어, 그리퍼(Gripper)나 툴(Tool)이 장착되는 링크를 엔드 이펙터로 지정하면 모션 플래닝에서 이 부분을 목표 좌표로 이동시키는 문제가 된다.

**엔드 이펙터 태그**:

SRDF에서는 `<end_effector>` 태그를 통해 특정 링크를 엔드 이펙터로 선언하며, 그 링크가 속한 상위 그룹(예: 팔 그룹)도 함께 지정해 주어야 한다.

엔드 이펙터의 활용 예시:

* 좌표 설정: 엔드 이펙터를 목표 지점에 가져가는 “Pick and Place” 작업
* 충돌 체크 단순화: 엔드 이펙터만 고려하여 충돌을 계산해야 할 경우

#### SRDF에서의 충돌 비활성화 설정

로봇 내부적으로 필연적으로 충돌로 감지될 수밖에 없는 링크 쌍(예: 케이블이 지나가는 내부 링크나 일부 커버 등)이 있을 수 있다. 이러한 경우, SRDF에서 `<disable_collisions>` 태그로 특정 링크 쌍을 지정하여 충돌 체크를 스킵할 수 있다.

* **장점**: 모션 플래닝 시 불필요한 충돌 검사를 제거하여 계획 연산 시간 단축
* **주의사항**: 실제로는 충돌 가능성이 매우 낮거나 상시 접촉 상태인 링크에만 적용해야 하며, 안전 문제와 직결될 수 있으므로 신중해야 한다.

#### SRDF에서의 가상 조인트(Virtual Joint) 정의

물리적으로 로봇과 연결되지 않은, 또는 환경 요소를 로봇과 연동하기 위해 “가상 조인트(Virtual Joint)”를 정의하는 경우가 있다. 예컨대, 모바일 로봇의 베이스가 자유롭게 2D 평면을 이동하고 회전하는 상황을 3자유도( $x, y, \theta$ ) 가상 조인트로 취급할 수 있다.

* URDF에서는 물리적인 링크와 조인트만 정의하므로, 베이스의 이동이 “실제로 어느 조인트가 회전 혹은 직선 이동 중인지” 정확히 표현하기 어렵다.
* SRDF의 가상 조인트를 통해 로봇 베이스가 2D 평면에서 어떻게 움직이는지를 플래닝 관점에서 모델링할 수 있다.

#### SRDF와 URDF의 상호보완적 관계

* **URDF**: 실제 로봇의 형태, 질량 및 관성, 충돌 모형 등 기계·물리적 특성을 중심으로 기술
* **SRDF**: URDF의 구조를 가져와, 로봇 조작(Manipulation) 관점에서 유의미한 그룹과 제약, 비활성화 충돌 설정, 엔드 이펙터, 가상 조인트 등을 추가로 정의

이처럼 “URDF 없이 SRDF를 단독으로 사용하기는 불가능”하나, URDF만으로는 의미적 정의가 부족하기에 “URDF + SRDF”의 조합이 표준처럼 활용된다.

#### URDF와 SRDF를 함께 사용하는 일반적 워크플로우

1. 로봇의 운동학적 스펙 정의(URDF 작성)
   * 링크와 조인트의 기하정보(길이, 볼륨, 질량, 관성)
   * 충돌 모델(단순화된 기하 오브젝트)
   * 각 조인트의 회전축 및 연결 관계
   * 이러한 정보는 실제 시뮬레이션, 시각화, 로봇 하드웨어 제어 등에 필요한 “기본 물리 모델”이 된다.
2. 의미적 정보 설계(SRDF 작성)
   * URDF에서 이미 정의된 링크·조인트를 논리적으로 그룹화(팔 그룹, 베이스 그룹, 엔드 이펙터 등)
   * 충돌 체크 비활성화 링크 쌍, 가상 조인트 설정 등
   * MoveIt!이나 기타 모션 플래닝 툴에서 URDF + SRDF를 동시에 로드하여 로봇 동작 전략을 수립한다.
3. MoveIt! Setup Assistant 등으로 자동화 구성
   * MoveIt! Setup Assistant(그래픽 툴)을 통해 URDF를 가져오고, SRDF를 편집·생성할 수 있다.
   * 이때, 조인트 제약, 엔드 이펙터 설정, 그룹 이름 등을 손쉽게 지정 가능하다.
4. 실제 실행 및 시뮬레이션
   * Gazebo 등의 시뮬레이터 또는 실제 로봇에 명령을 내릴 때, URDF는 물리적 해석에 사용되고 SRDF는 고수준(High-level) 제어 설정과 모션 플래닝에 사용된다.

#### URDF와 SRDF 작성 시 주요 고려사항

1. 파일 구조와 스코핑
   * URDF는 로봇의 루트(베이스) 링크부터 말단(엔드 이펙터)까지 모든 연결 관계가 완결되어 있어야 한다.
   * SRDF는 URDF로부터 가져올 링크·조인트의 이름이 정확히 일치해야 하므로, 이름 충돌이나 오탈자가 없도록 주의한다.
2. 중복 정의 방지
   * 조인트 제한(최소/최대 각도 등)은 원칙적으로 URDF에 정의하는 것이 더 적절하다. SRDF에서 조인트 제한을 다시 명시할 경우 서로 충돌하거나 모호해질 수 있으므로, SRDF 측에서는 “추가 제약 혹은 예외적 제약”만 정의하는 편이 좋다.
3. 충돌 모델 단순화
   * 복잡한 CAD 모델 그대로 충돌 체적을 구성하면, 실제 로봇과 매우 유사하지만 충돌 검사에 과부하가 걸릴 수 있다.
   * URDF에서 가능한 한 단순화한 충돌 기하(예: Box, Cylinder, Sphere 등)를 사용하고, SRDF에서 자주 충돌이 발생하는 링크 쌍은 비활성화 혹은 별도 처리를 한다.
4. 확장성
   * 로봇 구조가 변경되거나, 다양한 엔드 이펙터(툴)가 교체되는 경우 SRDF를 새로 작성하거나 수정할 필요가 있다.
   * URDF는 로봇의 기본 구조가 크게 달라지지 않는 이상 한 번 정의해 두면 비교적 자주 바뀌지 않는다. 반면 SRDF는 로봇 운용 시나리오에 따라 그룹이나 충돌 정보가 잦게 변동될 수 있다.

#### SRDF를 활용한 멀티 엔드 이펙터 상황

하나의 로봇에 여러 개의 엔드 이펙터가 장착될 수도 있다. 예를 들어, 하나의 팔에 그리퍼와 흡착 패드(Suction Cup) 두 가지 툴이 동시에 설치된 경우, SRDF의 `<end_effector>` 태그를 중복으로 정의하거나, 하나의 그룹 내에 다중 링크를 지정하는 식으로 처리할 수 있다.

* **장점**: 다양한 툴 체인징 시나리오를 고려해 모션 플래닝을 유연하게 구성
* **주의사항**: 서로 다른 엔드 이펙터가 동시에 동일 공간에 존재하므로, 충돌 체크 및 그룹 정의가 복잡해질 수 있다.

#### SRDF 파싱 및 로딩

ROS 환경에서 MoveIt!은 SRDF를 파싱하여 내부적으로 로봇의 의미적 정보를 담은 데이터 구조를 형성한다.

* `$roslaunch moveit_setup_assistant setup_assistant.launch$` 등을 이용하여 SRDF를 생성 및 편집
* `$move_group$` 노드 실행 시 자동으로 SRDF를 읽고, 계획 그룹이나 충돌 정보 등을 메모리에 로드

SRDF는 실제 로봇 동작에 필요한 “제어 정보”를 제공하므로, 올바르지 않은 SRDF 정의로 인해 계획 오류 혹은 제어 실패가 발생할 수 있다.
