센서 URDF의 기본 개념

센서를 URDF에 통합하려면 각 센서의 물리적 속성, 위치, 방향, 그리고 해당 센서가 로봇 시스템 내에서 어떻게 작동할 것인지에 대한 정보를 URDF 파일에 정의해야 한다. URDF는 로봇의 구조적 요소들을 표현하기 위한 파일 포맷으로, 센서도 마찬가지로 URDF에 포함되어야 하며, 로봇의 링크와 조인트처럼 다뤄진다.

URDF에서 센서 노드 구조

센서의 URDF 정의는 보통 <sensor> 태그와 함께 이루어진다. 이 태그는 센서가 어떤 종류인지, 어떤 플러그인을 사용할지, 센서의 좌표계가 로봇의 어느 부분에 연결될지 등을 기술한다. 기본적으로 URDF는 센서의 물리적 위치를 표현하는 방식과 플러그인을 통해 센서의 동작 방식을 정의하는 방식으로 나눌 수 있다.

예제: LIDAR 센서 URDF 정의

다음은 LIDAR 센서를 URDF에 정의하는 간단한 예제이다:

<sensor name="lidar_sensor" type="gpu_ray">
  <pose>0 0 0 0 0 0</pose>
  <visualize>true</visualize>
  <update_rate>10</update_rate>
  <ray>
    <scan>
      <horizontal>
        <samples>640</samples>
        <resolution>1</resolution>
        <min_angle>-1.57</min_angle>
        <max_angle>1.57</max_angle>
      </horizontal>
    </scan>
    <range>
      <min>0.1</min>
      <max>30</max>
      <resolution>0.01</resolution>
    </range>
  </ray>
  <plugin name="lidar_plugin" filename="liblidar_plugin.so"/>
</sensor>

센서 위치와 방향 설정

센서의 위치는 로봇의 특정 링크에 대한 상대적인 위치로 지정되며, pose 태그를 사용하여 표현된다. 이 태그는 센서의 위치와 방향을 나타내는데, 위치는 3차원 좌표계 (x, y, z)로, 방향은 3차원 회전 (\text{roll}, \text{pitch}, \text{yaw})로 정의된다.

위치 및 방향 수식

센서의 위치와 방향을 수식으로 나타낼 때는 다음과 같이 표현할 수 있다. 센서의 위치 벡터 \mathbf{p}_{sensor}는 로봇의 기준 좌표계에 대한 상대적인 위치를 나타내며, 방향 벡터 \mathbf{r}_{sensor}는 센서의 방향을 나타낸다.

\mathbf{p}_{sensor} = \begin{bmatrix} x \\ y \\ z \end{bmatrix}, \quad \mathbf{r}_{sensor} = \begin{bmatrix} \text{roll} \\ \text{pitch} \\ \text{yaw} \end{bmatrix}

이때, URDF 파일에서 pose 태그는 위치와 회전을 동시에 기술하며, 예를 들어 <pose>0 0 0 0 0 0</pose>와 같이 작성된다.

센서 정의 시 중요한 고려 사항

  1. 센서의 물리적 위치: URDF에서 센서는 로봇의 특정 링크에 물리적으로 연결된다. 따라서 센서의 좌표계가 어떤 링크에 부착될지 명확히 정의해야 한다. 센서가 링크의 중심에서 벗어난 경우, pose 태그를 사용하여 위치를 조정해야 한다.
  2. 센서의 좌표계: 로봇의 좌표계와 센서의 좌표계가 다를 수 있기 때문에, 이를 올바르게 변환하는 과정이 중요하다. 좌표 변환 행렬 \mathbf{T}_{link \to sensor}는 링크 좌표계에서 센서 좌표계로의 변환을 표현한다.
\mathbf{T}_{link \to sensor} = \begin{bmatrix} 1 & 0 & 0 & x_\text{sensor} \\ 0 & 1 & 0 & y_\text{sensor} \\ 0 & 0 & 1 & z_\text{sensor} \\ 0 & 0 & 0 & 1 \end{bmatrix}

여기서 x_\text{sensor}, y_\text{sensor}, z_\text{sensor}는 센서의 링크에 대한 위치를 나타낸다.

센서의 플러그인 설정

센서는 물리적인 정의뿐만 아니라 실제 동작을 구현하기 위해 플러그인 설정이 필요하다. URDF에서는 <plugin> 태그를 사용하여 센서의 동작 방식을 지정할 수 있다. 플러그인은 센서 데이터를 처리하거나 시뮬레이터(Gazebo 등)에서 센서의 기능을 구현하는 데 사용된다.

플러그인 설정 예시

플러그인은 특정 파일을 로드하여 센서의 동작을 정의하는데, 다음과 같은 형식으로 작성된다.

<plugin name="camera_plugin" filename="libgazebo_ros_camera.so">
  <always_on>true</always_on>
  <update_rate>30</update_rate>
  <camera>
    <horizontal_fov>1.3962634</horizontal_fov>
    <image>
      <width>800</width>
      <height>800</height>
      <format>R8G8B8</format>
    </image>
  </camera>
</plugin>

여기서 filename 속성은 플러그인의 파일 이름을 지정하고, 각 플러그인에 맞는 설정이 추가된다. 예를 들어, 위 예시는 카메라 센서에 대한 설정으로, 카메라의 시야각, 이미지 해상도 등을 정의한다.

센서와 링크의 관계

센서는 항상 로봇의 특정 링크에 연결되어야 한다. 이는 URDF 파일에서 센서를 정의할 때, 해당 센서가 어느 링크에 부착되는지 명시적으로 나타내야 함을 의미한다. 센서의 좌표계는 이 링크의 좌표계와 연동되므로, 정확한 위치와 방향 정의가 필수적이다.

링크와 센서의 상대적인 위치

센서가 부착된 링크의 좌표계를 \mathbf{T}_\text{link}라고 하고, 센서의 좌표계를 \mathbf{T}_\text{sensor}라고 할 때, 링크와 센서의 좌표계 간의 변환 행렬은 다음과 같이 표현된다.

\mathbf{T}_{\text{link} \to \text{sensor}} = \mathbf{T}_\text{link}^{-1} \mathbf{T}_\text{sensor}

이 변환 행렬은 센서의 상대적인 위치와 회전을 결정하며, URDF 파일에서는 이러한 변환을 통해 센서의 위치를 정확하게 정의할 수 있다.

센서의 물리적 특성 정의

센서는 로봇의 다른 물리적 요소처럼 질량, 관성 모멘트, 마찰 등의 물리적 특성을 가질 수 있다. 이러한 물리적 특성은 시뮬레이션에서 센서의 동작에 영향을 미치며, URDF에서 이를 정의하기 위해서는 <inertial>, <mass>, <inertia> 태그를 사용한다.

물리적 특성 수식

센서의 질량 m과 관성 행렬 \mathbf{I}는 다음과 같이 정의된다.

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

여기서 I_{xx}, I_{yy}, I_{zz}는 센서의 각 축에 대한 관성 모멘트를 나타내며, URDF에서는 이러한 값들을 직접 정의하거나 시뮬레이터가 이를 자동으로 계산할 수 있도록 설정할 수 있다.

URDF에서 센서의 관성 설정 예시

센서의 관성을 URDF에서 설정하는 방법은 다음과 같다:

<inertial>
  <mass value="0.1"/>
  <inertia ixx="0.001" ixy="0.0" ixz="0.0" iyy="0.001" iyz="0.0" izz="0.001"/>
</inertial>

이 예시에서는 질량 m = 0.1, 관성 모멘트 I_{xx} = I_{yy} = I_{zz} = 0.001로 설정되었다.