좌표 변환은 로봇 시스템에서 매우 중요한 요소이다. 로봇의 센서나 액추에이터는 각각의 좌표계를 가지고 있으며, 이를 일관된 좌표계로 변환하는 것이 필수적이다. 특히 ROS2에서 TF 및 TF2는 이러한 좌표 변환을 효과적으로 관리하고 적용할 수 있는 도구를 제공한다.

좌표계의 정의

로봇 시스템에서 좌표계는 특정 지점에 대해 위치 및 방향을 설명하기 위한 기준이다. 각 좌표계는 다음과 같이 정의된다:

  1. 원점: 좌표계의 기준점이다.
  2. : 좌표계의 방향을 나타낸다 (보통 x, y, z 축으로 구분).
  3. 회전: 좌표계가 특정 각도로 회전할 수 있다.

좌표계는 정적 좌표계동적 좌표계로 나눌 수 있다. 정적 좌표계는 시간에 따라 변하지 않지만, 동적 좌표계는 움직임에 따라 변화한다.

좌표 변환 수식

좌표 변환은 주로 회전과 평행이동(translation)으로 이루어진다. 한 좌표계에서 다른 좌표계로 변환하기 위해서는 다음과 같은 변환이 필요하다:

  1. 평행이동 변환: 평행이동은 좌표계의 원점을 다른 위치로 이동시키는 변환이다. 이를 수식으로 표현하면 다음과 같다:
\mathbf{p}' = \mathbf{p} + \mathbf{t}

여기서: - \mathbf{p}는 원래 좌표계에서의 위치 벡터이다. - \mathbf{t}는 평행이동 벡터이다. - \mathbf{p}'는 변환된 좌표계에서의 위치 벡터이다.

  1. 회전 변환: 회전 변환은 좌표계를 일정한 각도만큼 회전시키는 변환이다. 회전 행렬 \mathbf{R}을 이용하여 다음과 같이 표현할 수 있다:
\mathbf{p}' = \mathbf{R} \mathbf{p}

여기서: - \mathbf{R}은 3x3 회전 행렬이다. - \mathbf{p}는 원래 좌표계에서의 위치 벡터이다. - \mathbf{p}'는 변환된 좌표계에서의 위치 벡터이다.

  1. 복합 변환: 실제로는 평행이동과 회전이 함께 적용되는 경우가 많다. 이를 동차 변환(homogeneous transformation)이라고 부른다. 다음과 같은 방식으로 표현된다:
\mathbf{T} = \begin{bmatrix} \mathbf{R} & \mathbf{t} \\ 0 & 1 \end{bmatrix}

좌표 변환은 \mathbf{T}를 이용하여 다음과 같이 표현된다:

\mathbf{p}' = \mathbf{T} \mathbf{p}

여기서 \mathbf{p}는 4x1 동차 좌표(homogeneous coordinates)로 표현된다.

\mathbf{p} = \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix}

동차 좌표는 3D 공간에서 위치뿐만 아니라 변환을 간단하게 계산할 수 있도록 해준다.

회전 행렬의 정의

회전 행렬은 3D 공간에서의 회전을 표현하는 수학적 방법이다. 주로 세 가지 축을 기준으로 한 회전으로 나눌 수 있다:

\mathbf{R}_x(\theta) = \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos\theta & -\sin\theta \\ 0 & \sin\theta & \cos\theta \end{bmatrix}
\mathbf{R}_y(\theta) = \begin{bmatrix} \cos\theta & 0 & \sin\theta \\ 0 & 1 & 0 \\ -\sin\theta & 0 & \cos\theta \end{bmatrix}
\mathbf{R}_z(\theta) = \begin{bmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix}

세 가지 회전이 함께 사용될 수 있으며, 이를 합성 회전이라고 한다.

합성 회전

3D 공간에서의 회전은 세 축을 기준으로 한 회전의 조합으로 이루어진다. 이를 합성 회전이라고 부른다. 예를 들어, 먼저 z축을 기준으로 회전한 후, y축을 기준으로 회전하고 마지막으로 x축을 기준으로 회전한다고 하면, 전체 회전 행렬 \mathbf{R}는 다음과 같이 합성된다:

\mathbf{R} = \mathbf{R}_x(\theta_x) \mathbf{R}_y(\theta_y) \mathbf{R}_z(\theta_z)

여기서: - \mathbf{R}_x(\theta_x)x축 회전 행렬, - \mathbf{R}_y(\theta_y)y축 회전 행렬, - \mathbf{R}_z(\theta_z)z축 회전 행렬이다.

이러한 합성 회전은 순서에 따라 결과가 달라지기 때문에, 회전의 순서가 중요하다. 로봇 공학에서는 종종 ZYX 오일러 각이나 XYZ 회전 순서를 사용하여 합성 회전을 정의한다.

오일러 각

회전을 표현하는 방법 중 하나로 오일러 각(Euler Angles)이 있다. 이는 세 축을 기준으로 차례대로 회전시키는 방식으로, 다음과 같은 세 가지 각도로 표현된다:

  1. \alpha: z축을 기준으로 회전한 각도
  2. \beta: y축을 기준으로 회전한 각도
  3. \gamma: x축을 기준으로 회전한 각도

이때, 회전 순서는 ZYX 회전으로 먼저 z축을 기준으로 회전한 후, y축, 그리고 x축을 기준으로 회전하는 방식이다. 이를 수식으로 표현하면 다음과 같다:

\mathbf{R}_{\text{Euler}} = \mathbf{R}_x(\gamma) \mathbf{R}_y(\beta) \mathbf{R}_z(\alpha)

오일러 각의 사용은 직관적이지만, 특정 각도에서 깁싱 문제(gimbal lock)가 발생할 수 있다. 이는 두 개의 회전 축이 정렬되면서 회전 자유도가 하나 감소하는 현상이다. 이를 극복하기 위해 쿼터니언 방식이 사용된다.

쿼터니언

쿼터니언(Quaternion)은 3D 회전을 나타내는 또 다른 방법으로, 회전 축과 회전 각도를 이용하여 정의된다. 4차원 벡터로 표현되며, 다음과 같은 형식을 갖는다:

\mathbf{q} = w + xi + yj + zk

여기서: - w는 스칼라 부분 (회전의 크기), - x, y, z는 회전 축을 나타내는 벡터 성분이다.

쿼터니언은 복잡한 회전을 계산하는데 매우 효율적이며, 오일러 각에서 발생하는 깁싱 문제를 해결할 수 있다. 쿼터니언을 이용한 좌표 변환은 다음과 같이 정의된다:

\mathbf{p}' = \mathbf{q} \mathbf{p} \mathbf{q}^{-1}

여기서: - \mathbf{p}는 원래 좌표계에서의 위치 벡터, - \mathbf{q}는 쿼터니언, - \mathbf{q}^{-1}은 쿼터니언의 역원이다.

쿼터니언은 각도와 회전 축을 모두 포함하고 있어, 회전 행렬보다 계산이 간결하고, 누적된 회전의 정밀도도 유지할 수 있다.

동차 좌표계 (Homogeneous Coordinates)

동차 좌표계를 사용하면 회전과 평행이동을 하나의 변환 행렬로 통합하여 다룰 수 있다. 이를 위해 3차원 좌표를 4차원 동차 좌표로 확장한다. 동차 좌표에서의 변환은 다음과 같은 행렬로 표현된다:

\mathbf{T} = \begin{bmatrix} \mathbf{R} & \mathbf{t} \\ 0 & 1 \end{bmatrix}

여기서: - \mathbf{R}은 회전 행렬 (3x3), - \mathbf{t}는 평행이동 벡터 (3x1), - \mathbf{T}는 동차 변환 행렬이다.

이때, 변환된 좌표 \mathbf{p}'는 다음과 같이 계산된다:

\mathbf{p}' = \mathbf{T} \mathbf{p}

동차 좌표계를 사용하면 회전과 평행이동을 동시에 처리할 수 있어 로봇 시스템에서 매우 유용하다.