SDF (Simulation Description Format)는 로봇 시뮬레이션에서 로봇, 센서, 환경 등의 물리적 특성과 동작을 정의하는 XML 기반의 포맷이다. URDF와 달리, SDF는 더 정교한 물리 시뮬레이션을 지원하며, 다양한 물리 엔진 및 시뮬레이션 환경에 맞춰 확장될 수 있다. SDF의 주요 목적은 Gazebo와 같은 시뮬레이션 툴에서 로봇과 환경을 정확하게 모델링하고, 물리적인 상호작용을 시뮬레이션하는 데 있다.
SDF 파일의 기본 구조
SDF 파일은 XML 태그를 사용하여 정의되며, 각 태그는 시뮬레이션에서 사용되는 객체의 특성과 동작을 기술한다. SDF 파일의 기본적인 구조는 다음과 같다.
<sdfversion="1.6"><worldname="default"><modelname="robot"><linkname="base_link"><!-- 링크 속성 정의 --></link><jointname="joint1"type="revolute"><!-- 조인트 속성 정의 --></joint></model></world></sdf>
위의 예시에서는 <sdf>, <world>, <model>, <link>, 그리고 <joint> 태그가 사용되었다. 각 태그는 SDF에서 중요한 요소를 나타내며, 시뮬레이션의 구성 요소를 정의한다.
World
<world> 태그는 SDF에서 시뮬레이션이 실행되는 환경을 정의하는 가장 상위 태그이다. 하나의 SDF 파일은 하나의 <world>만을 가질 수 있으며, 그 안에 여러 모델과 환경 요소를 포함할 수 있다.
<worldname="default"><modelname="robot"><!-- 로봇 모델 정의 --></model><lightname="sun"type="directional"><!-- 빛 속성 정의 --></light></world>
여기서 <model> 태그는 로봇을 나타내고, <light> 태그는 조명 요소를 정의한다. 각 요소는 시뮬레이션에서 상호작용하며, 물리 엔진을 통해 동작한다.
Model
<model> 태그는 시뮬레이션에서 동작하는 개별적인 객체를 나타낸다. 이는 로봇일 수도 있고, 환경에 속하는 물체일 수도 있다. <model> 태그는 여러 개의 <link>와 <joint>로 구성되어 있으며, 이를 통해 모델의 구조와 동작을 정의한다.
모델은 로봇의 각 부분을 나타내는 링크들과 이들 간의 연결을 정의하는 조인트들로 구성된다.
Link
<link> 태그는 모델의 구성 요소 중 하나로, 로봇이나 환경의 개별적인 부위를 정의한다. 링크는 질량, 관성, 충돌 모델, 그리고 시각적 모델을 포함하여 물리적 특성을 정의한다.
링크의 질량과 관성 모멘트는 다음과 같은 수식을 통해 정의된다.
I=IxxIyxIzxIxyIyyIzyIxzIyzIzz
여기서, $\mathbf{I}$는 관성 행렬을 나타내며, $I_{xx}, I_{yy}, I_{zz}$는 각 축에 대한 관성 모멘트를 나타낸다. 관성 모멘트는 물체의 질량과 형상에 따라 계산된다.
링크의 물리적 특성은 시뮬레이션에서 중요한 역할을 하며, 로봇이 상호작용하는 힘과 모멘트에 직접적인 영향을 미친다.
Joint
<joint> 태그는 두 링크를 연결하는 요소로, 링크 간의 상대적인 움직임을 정의한다. 각 조인트는 특정한 종류의 운동을 허용하며, 여러 가지 타입이 있다. 대표적인 조인트 타입으로는 revolute(회전 조인트), prismatic(직선 운동 조인트), fixed(고정 조인트) 등이 있다.
각 조인트는 연결된 두 링크 간의 상대적인 변위를 수학적으로 모델링하며, 회전 조인트의 경우 회전 축과 각도를 정의한다. 예를 들어, 회전 조인트의 경우 회전 변위를 각도로 나타낼 수 있으며, 이는 다음과 같은 수식을 따른다:
θ(t)=θ0+ωt
여기서, $\mathbf{\theta}(t)$는 시간 $t$에서의 회전 각도, $\mathbf{\theta}_0$는 초기 각도, $\mathbf{\omega}$는 각속도를 나타낸다. 이 수식을 통해 로봇의 조인트 움직임을 시뮬레이션할 수 있다.
조인트에는 물리적 특성, 예를 들어 운동 범위, 감쇠(damping), 마찰 등의 요소도 포함될 수 있다. 이러한 요소들은 SDF에서 직접 정의할 수 있으며, 시뮬레이션의 정확도를 높이기 위해 필수적이다.
Visual
<visual> 태그는 모델의 시각적 표현을 정의하는 요소이다. 이는 시뮬레이션에서 사용자가 볼 수 있는 그래픽적 요소를 나타내며, 물리적 특성과는 독립적으로 존재한다. 각 링크에는 시각적 모델이 추가될 수 있으며, 이를 통해 로봇의 외관을 보다 실제적으로 나타낼 수 있다.
위의 예시에서, <mesh> 태그는 STL 파일을 사용하여 로봇의 외형을 나타내고, <material> 태그는 재질과 색상을 정의한다. 시각적 모델은 물리적 특성과는 별도로 존재하기 때문에, 충돌 계산 등에 영향을 미치지 않는다.
Collision
<collision> 태그는 모델의 충돌 모델을 정의하는 요소로, 시뮬레이션에서 물리적 상호작용이 일어나는 표면을 나타낸다. 시각적 모델과는 달리, 충돌 모델은 물리 엔진에서 실제로 충돌 검사를 할 때 사용된다. 충돌 모델은 단순한 기하학적 형상이나 복잡한 메쉬로 정의될 수 있다.
위의 예시에서는 box 기하학을 사용하여 충돌 모델을 정의하였으며, 마찰 계수 $\mu$를 지정하였다. 마찰 계수는 물체 간의 상호작용을 물리적으로 모델링하는 데 중요한 역할을 하며, 물체가 지면 위에서 미끄러지지 않도록 제어하는 요소이다.
Inertial
<inertial> 태그는 링크의 관성 정보를 정의하는 데 사용된다. 관성은 링크의 질량과 관성 모멘트를 포함하며, 링크의 움직임에 영향을 미친다. SDF에서 관성은 다음과 같이 정의된다.
위의 예시에서, 링크의 질량은 1.0이고, 각 축에 대한 관성 모멘트는 $I_{xx}, I_{yy}, I_{zz}$로 정의된다. 이는 다음과 같은 관성 모멘트 행렬로 나타낼 수 있다.
I=Ixx000Iyy000Izz
이 관성 행렬은 링크가 움직이거나 회전할 때 물리적으로 어떻게 반응할지를 결정하는 중요한 요소이다.
Sensor
<sensor> 태그는 로봇의 센서를 정의하는 데 사용된다. SDF에서 다양한 종류의 센서를 정의할 수 있으며, 대표적인 예로 카메라, LIDAR, IMU 등이 있다. 센서는 시뮬레이션에서 로봇이 환경을 인식하고 상호작용할 수 있게 해주는 중요한 구성 요소이다.
위의 예시에서는 카메라 센서를 정의하고, 카메라의 시야각과 해상도를 지정하였다. 각 센서는 고유한 특성을 가지며, 이를 통해 다양한 방식으로 로봇의 센서 데이터를 시뮬레이션할 수 있다.