# 좌표 변환의 기본 개념

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

#### 좌표계의 정의

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

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

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

#### 좌표 변환 수식

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

1. **평행이동 변환**: 평행이동은 좌표계의 원점을 다른 위치로 이동시키는 변환이다. 이를 수식으로 표현하면 다음과 같다:

$$
\mathbf{p}' = \mathbf{p} + \mathbf{t}
$$

여기서:

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

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

$$
\mathbf{p}' = \mathbf{R} \mathbf{p}
$$

여기서:

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

3. **복합 변환**: 실제로는 평행이동과 회전이 함께 적용되는 경우가 많다. 이를 \*\*동차 변환(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 공간에서의 회전을 표현하는 수학적 방법이다. 주로 세 가지 축을 기준으로 한 회전으로 나눌 수 있다:

* **x축 회전**: 각도 $\theta$만큼의 x축 회전은 다음과 같은 회전 행렬을 갖는다.

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

* **y축 회전**: 각도 $\theta$만큼의 y축 회전은 다음과 같은 회전 행렬을 갖는다.

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

* **z축 회전**: 각도 $\theta$만큼의 z축 회전은 다음과 같은 회전 행렬을 갖는다.

$$
\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}
$$

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