ROS2 Humble: 로봇 모델링과 URDF

URDF 요소란?

URDF(UUnified Robot Description Format)는 XML 문법을 기반으로 하여 로봇의 물리적 구조(링크, 조인트)와 물리 엔진에 필요한 속성(질량, 관성 모멘트 등)을 기술하는 표준 형식이다. URDF를 활용하면 시뮬레이터(Gazebo 등)나 실제 로봇 소프트웨어에서 일관된 모델을 공유할 수 있어, 복잡한 로봇 구조와 동작을 체계적으로 관리할 수 있다.

URDF에서 핵심이 되는 요소는 크게 다음과 같이 나뉜다.

  1. 링크(link): 로봇의 물리적 몸체(Body Part)

  2. 조인트(joint): 로봇의 조인트(Body Part 간의 연결 및 운동 특성)

  3. 플러그인(plugin): 시뮬레이션 환경이나 실제 하드웨어에서 추가 기능을 확장하기 위한 요소

아래에서는 각 요소를 순차적으로 살펴본다.

로봇의 기본 구성요소인 링크는 실제로 ‘운동학적’인 몸체를 의미한다. URDF에서 링크는 다음과 같은 특성을 명시한다.

  • 이름(name): 고유 식별자(중복 불가)

  • 시각적(visual) 표현: 로봇 시뮬레이션이나 Rviz 등에서 3D 메시에 대응하는 부분

  • 물리적 충돌(collision) 표현: 물리 시뮬레이션 엔진에서 충돌 검출 및 물리 계산에 사용

  • 관성(inertial): 질량, 질량중심, 관성 행렬 등 로봇 동역학 계산에 필요한 물리적 속성

링크의 시각적 요소(visual)

시각적 요소를 정의하는 목적은 다음과 같다.

  • 시뮬레이션이나 Rviz에서 로봇을 사람이 보기 쉽게 표현

  • 3D 모델(예: STL, DAE, Collada, OBJ 등)의 경로 또는 간단한 형태(박스, 구, 원기둥) 지정

URDF에서 링크의 시각적 요소는 <visual> 태그로 정의한다. 예시는 다음과 같다:

위 예시에서 <origin>은 3D 공간 상에서 시각 요소가 링크의 원점으로부터 얼마나 떨어져 있는지를 나타낸다. <geometry>에서는 여러 가지 형상을 지정할 수 있다. <box> 외에도 <cylinder>, <sphere> 등이 가능하며, 외부 3D 파일을 불러올 때에는 <mesh filename="..."/> 형태로 작성한다.

링크의 충돌 요소(collision)

시각 요소와 마찬가지로 <collision> 태그가 존재한다. 충돌 검출에는 복잡한 메쉬보다는 단순화된 형태(박스, 원기둥 등)가 자주 쓰인다. 예시는 다음과 같다:

여기서 <origin>은 충돌 검출용 메쉬가 링크에서 어떤 위치에 존재하는지 나타내며, <geometry>로는 충돌 계산에 사용할 실제 기하가 정의된다.

링크의 관성 요소(inertial)

URDF에서 동역학 계산을 위해서 관성(inertia)을 정의할 수 있다. 관성 요소는 일반적으로 $\mathbf{I}$(3×3 관성 행렬)과 질량 $m$, 그리고 질량중심(CoM) 정보로 구성된다. 예를 들어, 링크의 관성 행렬이 아래와 같다고 하자.

I=[IxxIxyIxzIxyIyyIyzIxzIyzIzz]I = \begin{bmatrix} I_{xx} & I_{xy} & I_{xz} \\ I_{xy} & I_{yy} & I_{yz} \\ I_{xz} & I_{yz} & I_{zz} \end{bmatrix}

URDF에서 <inertial> 태그로 이를 정의할 수 있다.

  • <origin>: 관성 좌표계의 위치와 자세(보통 질량중심 위치와 일치)

  • <mass>: 링크의 질량

  • <inertia>: 관성 행렬 성분. 예) $I_{xx} = 0.1$, $I_{yy} = 0.1$, $I_{zz} = 0.1$ 등

링크 관련 주요 주의사항

  • 좌표계 일치: URDF 상의 링크 원점, 관성 원점, 시각·충돌 기하의 원점은 혼동되지 않도록 명확히 구분해야 한다.

  • 실제 무게, 크기 반영: 관성, 충돌 모델은 실제 로봇 구조와 최대한 일치시키는 것이 동역학 해석 및 시뮬레이션의 정확도를 높인다.

  • 재질(material) 관리: 시각 표현을 위해서는 <material> 태그에서 색상, 텍스처 등을 지정할 수 있다.

조인트(joint)

조인트는 로봇의 링크들을 연결해 주는 조인트 요소로, 로봇의 자유도를 정의하는 핵심 개념이다. URDF에서는 조인트를 통해 링크 간의 상대적 운동 방식(회전, 직선 이동 등)을 기술하고, 조인트 한계(최소·최대 각도·이동량), 마찰, 감속기 기어비 등을 명시할 수 있다. 조인트는 <joint> 태그로 표현되며, 주로 다음과 같은 속성을 갖는다.

  • 이름(name): 조인트의 고유 식별자(중복 불가)

  • 타입(type): 조인트의 운동 형식 (revolute, prismatic, continuous, fixed, planar, floating 등)

  • 부모(parent)와 자식(child): 조인트가 연결하는 링크의 관계. 보통 parent가 상위 링크(기준 링크), child가 하위 링크(움직이는 링크)가 된다.

  • 오리진(origin): 조인트 기준좌표계. 링크 간의 상대 위치·자세를 표현

  • 제어 파라미터: 조인트 한계, 감속비, 마찰, 저항(댐핑) 등

위 예시는 회전 조인트( type="revolute" )에 대한 간단한 URDF 정의이다.

  • <parent>: 상위 링크명

  • <child>: 하위 링크명

  • <origin>: 부모 링크의 원점 대비 조인트 좌표계 원점 (xyz, rpy)

  • <axis>: 조인트가 회전(또는 이동)하는 축 (여기서는 $z$축이 회전축)

  • <limit>: 조인트 물리 한계

    • lower, upper: 하한·상한 (revolute에서는 각도, prismatic에서는 거리)

    • effort: 조인트가 낼 수 있는 최대 토크(회전의 경우) 또는 힘(직선의 경우)

    • velocity: 조인트의 최대 각속도(회전) 또는 선속도(직선)

  • <dynamics>: 동역학적 특성(마찰 friction, 감쇠 damping)

조인트 유형

URDF에서 대표적인 조인트 유형은 다음과 같다.

  1. revolute:

    • 유한한 범위에서 회전 운동을 하는 조인트

    • 예) 로봇 팔 조인트

  2. continuous

    • 회전 범위에 제한이 없는 조인트

    • 예) 바퀴 축

  3. prismatic

    • 직선 이동(슬라이딩) 조인트

    • 예) 선형 액추에이터

  4. fixed

    • 부모 링크와 자식 링크가 고정되어 상대 이동이 없음

    • 예) 로봇 내장 센서 등 움직이지 않는 부품 장착

  5. floating

    • 6자유도(3축 평행이동 + 3축 회전)를 전부 가짐

    • 보통 시뮬레이션에서 기준 링크를 정의할 때 사용

  6. planar

    • 2차원 평면 상에서 이동(2자유도 평행이동 + 1자유도 회전)을 허용

회전축 (axis)

회전 또는 직선 이동이 있는 조인트(revolute, continuous, prismatic)는 <axis> 태그에서 운동 방향 벡터를 정의한다. 예를 들어, $z$축에 대해 1로 설정한다면:

이는 조인트가 $z$축을 기준으로 회전(또는 이동)함을 의미한다.

조인트 한계(limit)

조인트의 운동 범위(최소·최대 값), 최대 토크(또는 힘), 최대 속도를 정의한다. 예:

  • $\text{lower} = 0$

  • $\text{upper} = 1.57$ (라디안 단위로 약 $90^\circ$)

  • $\text{effort} = 10.0$

  • $\text{velocity} = 1.0$

조인트 동역학 파라미터(dynamics)

  • 댐핑(damping): 조인트가 움직일 때 저항을 추가하여 과도진동을 줄이는 효과

  • 마찰(friction): 조인트 마찰력을 통해 조인트가 움직일 때 필요한 최소 토크 혹은 힘을 반영

주의사항

  • 조인트의 운동 범위가 실제 로봇과 일치하는지 확인해야 한다.

  • 불필요하게 복잡한 조인트를 정의하기보다는 실제 하드웨어에 근접하도록 모델링한다.

  • 각종 시뮬레이터에서 limitdynamics가 다르게 동작할 수 있으므로, 시뮬레이션 테스트가 필수적이다.

플러그인(plugin)

플러그인은 기본적인 URDF 요소(링크와 조인트)만으로는 표현하기 어려운 기능(센서, 제어기, 특정 물리 현상, 커스텀 동작 등)을 확장하기 위해 사용된다. ROS 생태계에서 시뮬레이터인 Gazebo를 예로 들면, URDF에 <gazebo> 태그를 활용하여 카메라, 레이저 센서, IMU 등의 센서를 연결할 수 있다.

  • <plugin> 태그는 주어진 시뮬레이터(또는 미들웨어)에 탑재되는 플러그인을 지정

  • namefilename으로 플러그인 라이브러리 파일(.so 등)을 명시

  • 필요한 파라미터(카메라 해상도, 토픽 이름, 업데이트 주기 등)를 함께 정의

플러그인은 각 시뮬레이터나 미들웨어별로 형식이 다를 수 있으며, URDF나 Xacro 파일 내의 <gazebo> 태그 혹은 별도 설정 파일(SDF) 등을 통해 확장 가능하다.

센서 플러그인

카메라, 레이저 스캐너(LiDAR), IMU, 초음파 센서 등 다양한 센서를 시뮬레이션 환경에서 사용하려면 해당 센서 플러그인을 로드해야 한다. 예컨대 Gazebo에서 카메라를 시뮬레이션하려면 카메라 플러그인을 설정하고, 주기적인 이미지 토픽을 ROS2로 퍼블리시하도록 설정한다.

제어 플러그인

로봇 조인트 제어나 이동 운동학(Mobile Base) 제어를 위해 사용되는 플러그인도 존재한다. 예컨대, diff_drive_controller를 URDF에 삽입하여 차륜 이동 로봇의 양쪽 바퀴를 동시에 제어할 수도 있다.

플러그인 작성

직접 플러그인을 작성해 기능을 확장할 수도 있다. Gazebo나 ROS2 제어를 위해 C++ 기반의 플러그인을 작성하여, 원하는 커스텀 동작 또는 물리 효과를 구현할 수 있다.

Last updated