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