2강 Homogeneous Matrix and numpy

다관절 로봇 뿐만 아니라 바퀴 기반 로봇, 드론과 같이 대부분의 로봇 시스템에서 현재 로봇이 위치한 좌표와 이를 표현하는 방식은 필수적입니다. 따라서 대부분의 로보틱스 강의들 또한 좌표계 변환과 표현 방식을 가장 먼저 소개하고 있습니다.

image from : compass https://compas.dev/compas/0.18.1/tutorial/robots.html


강체인 로봇을 공부하는 우리에게 필요한 좌표계 변환은 크게 두 종류로 나뉩니다.

  1. translation - 평행 이동
  2. rotation - 회전 이동

복잡한 3차원에서의 좌표계 변환 이전에 우리는 2차원에서의 예시를 통해 먼저 개념을 잡아보도록 하겠습니다.

Translation - 평행 이동

  • 아래 그림을 한번 살펴봅시다.

  • $O_1$ 좌표계를 기준으로 한 C점의 좌표는 $(x'_c, y'_c)$ 가 될 것입니다.
  • 반면, $O_0$좌표계를 기준으로 한 C점의 좌표는 $(x'_c+x_0, \,y'_c + y_0)$가 됩니다.
  • 또한, $O_0$ 좌표계 기준에서 본 $O_1$ 좌표계의 원점의 좌표는 $(x_0, y_0)$ 가 되지요.

그렇다면, 이러한 결론을 내릴 수 있게 됩니다.


❗ $O_1$ 좌표계의 임의의 점을, $O_0$ 좌표계로 변환하고 싶다면, $(x_0, y_0$) 를 더해주면 되는구나❗
  • Q) 그렇다면 반대로 $O_1$ 좌표계의 임의의 점을, $O_0$ 좌표계로 변환하고 싶다면, 어떠한 연산이 필요할까요?
  • A) $(-x_0, -y_0)$를 더해주면 됩니다 😃

결국, $O_i$ 상의 임의의 점을 $O_j$ 상의 좌표로 변환하고 싶다면 $O_j$ 의 원점에서 바라본 $O_i$ 의 좌표를 더해주면 되는 것이지요!!

⇒ 이 컨셉을 유지한 채로, 회전 변환을 살펴봅시다!

Rotation - 회전 이동

2차원 평면에서 임의의 각도 $theta$만큼 회전시키는 변환 행렬은 같습니다.

잠시, 이러한 행렬값을 갖게 된 증명을 진행해보겠습니다.

점 C의 $O_1$ 좌표를 기준으로 $O_0$에서의 좌표를 표현하면, 다음과 같습니다.

  • $x_0 = x_1 \, cos(\theta) - y_1 \, sin(\theta)$
  • $y_0 = x_1\,sin(\theta) + y_1 \,sin(\theta)$

⇒  이를 행렬 형태로 정리한 것이 앞선 행렬이 되는 것이지요.

이 행렬을 좀 더 직관적으로 이해해봅시다.

  1. $O_1$ 상 임의의 점의 좌표를 $O_0$ 상의 좌표로 변환하고 싶다면,
  2. $O_0$ 의 원점에서 바라본 $O_1$의 원점의 좌표 변환을 적용해 주면 됩니다. ( 이전 translation 처럼요! )
  3. 좌표 변환 행렬은 x0와 x1 혹은 y0와 y1이 이루는 사이각(theta)만 알면 구할 수 있고,
  4. 좌표 변환 행렬을 $O_1$ 상의 임의의 점에 곱해주게 되면, $O_0$상의 좌표를 얻을 수 있게 됩니다.

좌표계 i 상의 점을 좌표계 j 상의 점으로 변환해주는 회전 행렬은 다음과 같이 표기합니다.

Rotation 행렬이 갖는 특별한 성질이 있습니다. 후에 3차원 좌표상의 여러 값들을 구하는 작업에서 요긴하게 사용되는 성질로 잘 기억해둡시다!

Translation + Rotation ⇒ Homogeneous Matrix


이제, translation과 rotation을 함께 생각해봅시다.

$O_i$ 상의 임의의 점을 $O_j$ 상의 좌표로 변환하기 위해서 두 좌표계 사이의 rotation와 translation을 적용해야 합니다.

이러한 좌표변환이 N번 반복된다고 생각해봅시다.

    • 좌표계 n ⇒ n-1의 변환
    • 좌표계 n-1 ⇒ n-2의 변환
    • 좌표계 n-2 ⇒ n-3의 변환
    • 좌표계 n-3 ⇒ n-4의 변환
    • ….
    • 좌표계 1 ⇒ 0의 변환

rotation과 translation은 별개의 연산이기 때문에 매번 귀찮은 작업이 이루어집니다.

이를 해결하기 위해, 로봇 공학자들은 homogeneous matrix라는 방식을 사용하고 있습니다. 2차원을 기준으로 3*3 행렬을 통해 rotation과 translation을 한번에 표현하는 방법입니다.

homogeneous matrix를 사용하면 연속적인 좌표계 변환도 행렬 연산을 통해 손쉽게 계산할 수 있습니다.

💡다만, 계산한 결과인 3 x 1 vector에서 첫 두개의 element만 의미를 갖고 마지막 element는 항상 1이 됩니다.



Homogeneous Matrix를 통한 좌표계 간의 변환을 배워보았습니다. 이제 python 실습을 통해 이해도를 더욱 높여봅시다!

코드 구현


  • 예제 코드 실행
cd lec1_python_basics
python3 matrix.py

첫 이론 시간인만큼 python을 통해 행렬을 다루는 방법에 대해 복습해보고, rotation과 translation을 표현하는 방법을 익혀보겠습니다.



  • numpy's array

python의 numpy패키지를 통해 행렬을 생성할 수 있습니다.

numpy를 통해 행렬을 생성하는 방식에 크게 두가지가 존재합니다. (np.array np.matrix) 우리 강의에서는 최대 2차원 행렬만 사용할 것이며, 앞으로의 구현을 위해 np.array를 사용하는 것으로 통일하고자 합니다.

  • 행렬곱

행렬 간 곱셈 연산을 표현하는 방식에도 크게 두가지가 있습니다. ( A.dot(B)A @ B)

이후 manipulator와 같은 다관절 로봇을 다루게 되면 행렬 연산이 많아지는데, 이를 대비하여 저는 @ 연산을 선호하고 있습니다.


  • Transpose, Inverse

행렬의 전치 (Transpose)와 역행렬 (Inverse)를 구하는 방법은 다음과 같습니다.


  • Element wise multiplication vs Matrix Multiplication

실수가 자주 발생하는 부분을 짚고 넘어가고자 합니다.

  1. A * B는 행렬 요소 간 곱셈으로, 일반적인 행렬곱과 전혀 다른 결과를 얻게 됩니다.
  2. 행렬과 벡터 사이의 연산 시에도 dot 표기를 하거나 @를 사용하여 이러한 혼란을 방지합시다.


  • 2D Translation & Rotation

오늘의 학습하였던 주된 내용의 구현입니다. 코드의 구현 자체는 쉽지만, 이 두 연산이 어떠한 의미를 갖는지 상기해보면서 계속해서 이어가겠습니다.


  • Identity & Zero Matrix

행렬의 형태를 미리 지정하고 요소들을 추가하는 식으로 구현하면 실수를 방지할 수 있습니다. 이러한 측면에서 영행렬과 단위 행렬의 생성 방법을 제시드립니다.

앞으로의 강의에서 로봇의 좌표 / 움직임을 모두 행렬과 벡터 형태로 표현하게 됩니다. 이번 강의를 착실히 수행하고 다음 강의로 넘어가시길 추천드립니다.

Complete and Continue