파일 구조의 차이

SDF(Simulation Description Format)와 URDF(Universal Robot Description Format)의 첫 번째 주요 차이점은 파일의 구조적 형태에서 나타난다. URDF는 XML 기반 파일 형식을 사용하며, 로봇의 각 구성 요소를 정의하는 데 주로 사용된다. 반면, SDF는 더 복잡한 시뮬레이션을 지원하기 위해 고안된 형식으로, 다중 로봇 또는 환경 요소를 포함한 시뮬레이션을 정의할 수 있다.

URDF는 주로 다음과 같은 기본 구조를 갖는다:

<robot name="robot_name">
    <link name="base_link">
        ...
    </link>
    <joint name="joint_name" type="revolute">
        ...
    </joint>
    ...
</robot>

SDF는 URDF와 달리 다중 로봇과 환경 설정을 포함할 수 있는 구조를 갖추고 있으며, 구조적으로 더욱 확장성이 크다. 예시로, SDF는 다음과 같이 작성된다:

<sdf version="1.6">
    <world name="default">
        <model name="robot_name">
            ...
        </model>
        <light name="light" type="directional">
            ...
        </light>
    </world>
</sdf>

URDF는 하나의 로봇을 정의하는 데 중점을 두고 있지만, SDF는 월드(world) 개념을 도입해 하나 이상의 로봇, 환경 요소, 센서 및 조명을 포함할 수 있다. 이는 복잡한 시뮬레이션에서 유리하며, 다중 객체 간의 상호작용을 정의하는 데 적합하다.

링크와 조인트의 정의 방식 차이

URDF에서는 각 링크와 조인트를 정의하는 방식이 비교적 단순하지만, SDF에서는 이러한 요소를 더 세밀하게 제어할 수 있다. URDF의 링크 정의는 다음과 같이 간단하게 작성된다:

<link name="link_name">
    <inertial>...</inertial>
    <visual>...</visual>
    <collision>...</collision>
</link>

반면 SDF에서는 동일한 링크와 조인트를 더 세밀하게 정의할 수 있다. 예를 들어, SDF의 링크 정의는 추가적인 물리적 속성을 포함할 수 있으며, 환경과의 상호작용을 보다 정확하게 모델링할 수 있다. 예시는 다음과 같다:

<link name="link_name">
    <inertial>...</inertial>
    <visual>...</visual>
    <collision>...</collision>
    <velocity_decay>...</velocity_decay>
</link>

SDF에서는 velocity_decay와 같은 물리 엔진에 대한 세부 설정을 추가하여 더 정확한 시뮬레이션이 가능하다. 또한, 링크 및 조인트에 대한 물리적 특성(예: 관성, 마찰력 등)을 더 구체적으로 정의할 수 있어, 현실 세계의 물리적 특성을 더 잘 반영할 수 있다.

물리 엔진 설정 차이

URDF는 로봇의 구성 요소와 관계를 정의하는 데 중점을 두는 반면, SDF는 시뮬레이션 환경과 물리 엔진 설정을 포함할 수 있다. SDF에서는 물리 엔진의 다양한 파라미터를 설정할 수 있으며, URDF보다 더 복잡한 물리적 상호작용을 모델링할 수 있다. 예를 들어, URDF는 물리 엔진의 세부 사항을 포함하지 않지만, SDF는 다음과 같이 물리 엔진에 대한 설정을 명시할 수 있다:

<physics name="default_physics" type="ode">
    <gravity>0 0 -9.8</gravity>
    <max_step_size>0.001</max_step_size>
    <real_time_factor>1</real_time_factor>
</physics>

위 코드에서 볼 수 있듯이 SDF는 중력(gravity), 시뮬레이션 스텝 크기(max_step_size), 그리고 실시간 인자(real_time_factor)를 정의할 수 있다. 이는 URDF로는 직접적으로 다룰 수 없는 영역이다. 물리 엔진 설정은 시뮬레이션의 정확도와 성능에 중요한 영향을 미친다.

월드 및 환경 설정

SDF는 URDF와 달리, 시뮬레이션 환경 전체를 정의할 수 있는 기능을 제공한다. URDF는 로봇의 구성 요소와 관계를 정의하는 데 그치지만, SDF는 로봇 외에도 환경, 조명, 센서 등을 포함한 전체 월드를 정의할 수 있다. 예를 들어, 다음과 같은 SDF 구문으로 환경을 설정할 수 있다:

<world name="default">
    <model name="ground_plane">
        <static>true</static>
        <link name="link">
            <collision>...</collision>
            <visual>...</visual>
        </link>
    </model>
    <light name="sun" type="directional">
        <diffuse>1 1 1 1</diffuse>
        <specular>0 0 0 1</specular>
        <direction>-0.5 0.5 -1</direction>
    </light>
</world>

이와 같이 SDF는 world 태그를 사용해 환경 요소들을 정의할 수 있으며, model 태그를 통해 지형, 건물, 그리고 고정 객체(static) 등을 설정할 수 있다. 또한, 조명(light) 설정을 통해 시뮬레이션 환경 내에서 빛의 방향과 색상 등을 제어할 수 있다. 이는 URDF에서는 불가능한 기능이다.

센서 설정 방식

SDF는 센서를 더 정밀하게 모델링할 수 있으며, 다양한 유형의 센서와 관련된 고급 기능을 지원한다. URDF는 ROS와의 통합을 통해 기본적인 센서 기능을 제공하지만, SDF는 시뮬레이션 내에서 센서의 행동을 구체적으로 정의할 수 있는 더 정교한 방식을 제공한다. 예를 들어, SDF에서 카메라 센서를 정의할 수 있는 구문은 다음과 같다:

<sensor name="camera" type="camera">
    <camera>
        <horizontal_fov>1.39626</horizontal_fov>
        <image>
            <width>800</width>
            <height>600</height>
            <format>R8G8B8</format>
        </image>
    </camera>
    <plugin name="camera_plugin" filename="libcamera_plugin.so"/>
</sensor>

SDF는 센서의 각종 파라미터를 세밀하게 설정할 수 있을 뿐만 아니라, 플러그인을 통해 시뮬레이션의 특정 요구에 맞춘 커스텀 기능을 추가할 수 있다. 이는 URDF에서는 플러그인 설정이 비교적 제한적인 반면, SDF는 훨씬 더 유연한 접근을 가능하게 한다.

플러그인 통합 차이

URDF와 SDF의 또 다른 주요 차이점은 플러그인 통합 방식이다. URDF에서도 플러그인을 사용할 수 있지만, SDF는 더 광범위하고 유연하게 플러그인을 통합할 수 있다. 특히, SDF는 센서나 로봇의 행동뿐만 아니라 환경과의 상호작용까지 포함한 다양한 기능을 플러그인으로 확장할 수 있다.

URDF에서는 다음과 같은 방식으로 플러그인을 정의한다:

<gazebo>
    <plugin name="plugin_name" filename="libplugin.so">
        ...
    </plugin>
</gazebo>

URDF의 플러그인은 로봇 자체에 대한 플러그인 적용에 초점이 맞춰져 있다. 반면, SDF는 플러그인을 로봇뿐만 아니라 시뮬레이션의 모든 요소에 적용할 수 있다. SDF에서 플러그인을 정의하는 예시는 다음과 같다:

<plugin name="plugin_name" filename="libplugin.so">
    <update_rate>100</update_rate>
    <robotNamespace>robot_name</robotNamespace>
    <cameraName>camera</cameraName>
</plugin>

위와 같은 SDF 플러그인 설정은 URDF에 비해 더 많은 세부 사항을 제어할 수 있다. 예를 들어, 업데이트 속도(update_rate)와 네임스페이스(robotNamespace), 그리고 특정 센서(cameraName)와 같은 항목을 지정할 수 있다. 플러그인을 통해 시뮬레이션의 동작, 센서 데이터의 흐름, 로봇의 물리적 행동을 더 세밀하게 제어할 수 있으며, 이는 URDF보다 유연하고 확장성이 높은 방식이다.

시뮬레이션 제어 및 확장성

SDF는 URDF에 비해 시뮬레이션 제어 및 확장성이 뛰어나다. SDF는 월드의 물리적 요소뿐만 아니라, 시뮬레이션에서 일어나는 다양한 이벤트를 제어할 수 있다. 예를 들어, SDF는 물리 엔진, 플러그인, 센서 등을 통합하여 복잡한 상호작용을 시뮬레이션할 수 있으며, 이를 통해 다양한 로봇 및 환경 상호작용을 모델링할 수 있다.

URDF는 단순한 로봇 모델링에 중점을 두고 있으며, 복잡한 시뮬레이션이나 환경과의 상호작용을 모델링하기에는 제한이 있다. 반면, SDF는 URDF에 비해 확장성이 뛰어나, 보다 복잡하고 현실적인 시뮬레이션 환경을 구축하는 데 적합하다. 예를 들어, SDF는 다수의 로봇이 포함된 환경에서 로봇 간의 상호작용을 모델링하거나, 환경 내에서 물체들이 서로 충돌하는 상황을 시뮬레이션할 수 있다.

SDF는 물리 엔진 설정, 센서 및 환경 모델링, 플러그인 통합 등에서 더욱 발전된 기능을 제공하며, 이를 통해 로봇 시뮬레이션을 보다 정밀하게 제어할 수 있다.