Transform Matrix 정리

OpenJR·2023년 2월 18일
0

이 글은 Tranform Matix의 전부를 설명하지는 않습니다. Transform Matrix의 의미를 자주 까먹어 정리하기 위한 용도의 글이며, 기초적인 내용을 서술하고 있지 않습니다. 다양한 분야에서 Transform Matrix를 사용하지만, 이 글에서는 SLAM에서 Pose로 Transform Matrix를 사용할 때의 내용을 담고 있습니다.

Translation

Transform Matrix(T=[Rt]T=[R|t])의 tt에 해당하는 Translation의 의미는 local coordinate Origin O1O_1의 위치다.
즉, O1O_1이 Global Coordinate Origin O0O_0으로 부터 (x, y, zx, ~y, ~z)만큼 떨어져 있다면 TT의 마지막 열은 다음과 같다.

T[:,3]=[xyz1]T[:, 3] = \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix}

여기서, x,y,zx, y, z의 축은 Global Coordinate Axis이다.

Rotation

이 글에서의 회전은 가장 회전을 직관적으로 이해할 수 있는 Euler Angle로 표현합니다. 회전을 표현할 수 있는 다른 방식인 Querternion과 Axis Angle도 있지만 결국 Transform Matrix의 Rotation term으로 가져왔을 때의 local coordinate의 회전을 표현한다는 의미는 같습니다.

Euler Angle Representation

오일러 앵글은 Roll(α\alpha), Pitch(β\beta), Yaw(γ\gamma)를 가지고 회전을 표현하는 방법이다.
가장 보편적으로 Z축 → Y축 → X축 순으로 회전하며, 각 회전축은 Global Axis가 아닌 Local Axis를 기준으로 회전한다.

def euler_to_rotation_matrix(roll, pitch, yaw):
  roll, pitch, yaw = np.deg2rad(roll), np.deg2rad(pitch), np.deg2rad(yaw)
  R_z = np.array([[np.cos(yaw), -np.sin(yaw), 0],
                [np.sin(yaw), np.cos(yaw), 0],
                [0, 0, 1]])
  R_y = np.array([[np.cos(pitch), 0, np.sin(pitch)],
                  [0, 1, 0],
                  [-np.sin(pitch), 0, np.cos(pitch)]])
  R_x = np.array([[1, 0, 0],
                  [0, np.cos(roll), -np.sin(roll)],
                  [0, np.sin(roll), np.cos(roll)]])
  R1_0 = R_z @ R_y @ R_x
  return R1_0

위 함수로 생성된 Matrix는 회전한 좌표계에서 바라본 점의 좌표(P1P_1)를 변환되기 전 좌표계에서 바라본 점(P0P_0)으로 변환하게 된다

P0=R01P1,   R01=f(α,β,γ)P_0 = R^1_0P_1, ~~~ R^1_0=f(\alpha, \beta, \gamma)

즉, 회전 매트릭스는 2가지 의미를 내포하고 있다.
1. 현재 Local Coordinate이 Global Coordinate기준 어떤 Rotation Pose를 가지고 있는지
2. Local Coordinate의 점을 Global Coordinate으로 변환하는 매트릭스

profile
Jacob

0개의 댓글