처음← 이전 장다음 장 →

2장. 위치와 방향을 숫자로 적기

물체가 어디에 어느 방향으로 있는지는 회전행렬과 원점 위치로 적는다. 이 장은 평면(2차원)에서 먼저 익히고 3차원으로 넓힌다. 강의 2강(68분)에 해당한다.

2.1 관절과 자유도

팔에 모터가 몇 개 필요한지, 손끝을 얼마나 자유롭게 놓을 수 있는지는 자유도(degree of freedom)가 정한다. 자유도는 "서로 상관없이 움직일 수 있는 방향의 수"다.

관절은 두 가지만 생각한다

관절은 두 가지다: 돌거나, 미끄러지거나
그림 2-1 · 회전 관절과 직동 관절

로봇 팔의 관절은 거의 다 이 두 가지다. 둘 다 자유도가 1이다. 서보 관절은 회전 관절이다.

사람 어깨처럼 여러 방향으로 도는 관절(구형 관절, 자유도 3)은 어떻게 할까? 회전 관절 3개를 한 점에 겹쳐 놓은 것으로 본다. 사이 링크의 길이는 0이다. 그러면 관절은 항상 자유도 1짜리만 다루면 된다.

자유도 세기: 6n − 5n = n

관절을 모두 떼어 내면 링크들이 공중에 떠 있다. 그 상태에서 다시 붙이며 세어 보자.

관절 하나가 움직임 6개 중 5개를 막는다
그림 2-2 · 자유도 세기
  1. 떠 있는 링크 하나는 드론처럼 6개의 숫자(이동 3 + 회전 3)가 있어야 위치가 정해진다. 링크가 n개면 6n개다.
  2. 회전 관절로 붙이면 돌기 1개만 남는다. 나머지 5개는 관절이 막는다. 관절이 n개면 5n개를 막는다.
  3. 남는 자유도는 6n − 5n = n이다.

받침이 고정된 팔은 관절 개수가 곧 자유도다. 관절 하나에 모터 하나다.

잠깐, 생각해 보기. "받침 회전 + 어깨 + 팔꿈치"로 된 팔이 있다. 자유도는 몇이고, 모터는 몇 개 필요한가?

자유도 3, 모터 3개다(집게를 여닫는 모터는 따로 센다).

걷는 로봇은 더 어렵다

사람처럼 걷는 로봇은 받침(몸통)도 떠서 움직인다. 몸통 자체가 자유도 6을 더 가져 모두 n + 6이다. 그런데 몸통에는 직접 미는 모터가 없다. 발로 땅을 밀어서만 움직일 수 있다. 그래서 걷는 로봇의 제어가 어렵다.

영상에서 보기: 03:35 관절의 종류 · 08:50 자유도 세기 · 13:01 휴머노이드는 n + 6

2.2 관절 공간과 작업 공간

같은 팔 자세를 두 가지 숫자 묶음으로 적을 수 있다. 관절 각도로 적거나, 손끝 위치로 적는다.

모양을 정하는 숫자는 최소 몇 개인가

종이 팔의 모양을 친구에게 숫자로 알려 준다고 하자. 방법은 여러 가지다.

모양을 완전히 정하는 숫자 묶음을 설정 파라미터라 한다. 그중 서로 얽히지 않은 최소 묶음을 일반화 좌표라 한다. 관절 각도가 바로 일반화 좌표다. 일반화 좌표의 개수는 자유도와 같다.

두 개의 판

관절 각도 (θ₁, θ₂)를 가로·세로로 잡으면 판 위의 점 하나가 팔 자세 하나를 나타낸다. 이 판을 관절 공간(joint space)이라 한다. 손끝의 (x, y)로 만든 판은 작업 공간(operational space)이다. 슬라이더를 움직여 두 판의 점이 함께 움직이는 것을 보자.

팔 자세 하나 = 두 공간의 점 하나씩
그림 2-3 · 직접 돌려 보기: 위는 작업 공간, 아래는 관절 공간

눈여겨볼 것 두 가지:

  1. 관절 공간의 점 하나는 손끝 하나로 간다. 순기구학이 이 화살표다.
  2. 손끝 하나에는 관절 공간의 점이 두 개 있다. 점선 팔이 같은 손끝에 닿는 다른 자세다. 관절 공간에서는 속이 빈 점으로, 전혀 다른 곳에 있다. θ₂ = 0°로 팔을 펴면 두 점이 하나로 겹친다.

손끝을 적는 숫자: 작업 좌표

손끝은 위치뿐 아니라 방향도 있다. 컵을 잡으려면 집게가 컵 쪽을 봐야 한다. 손끝의 위치와 방향을 적는 독립인 숫자를 작업 좌표라 하고, 그 개수를 m₀라 쓴다.

어디서 움직이나 위치 방향 m₀
평면(책상 면) x, y 각도 α 하나 3
3차원 공간 x, y, z 각도 세 개 6

우리 팔은 관절이 2개라 손끝 (x, y)만 고를 수 있다. 손 방향 α는 θ₁ + θ₂로 따라 정해진다. 위치와 방향을 모두 고르려면 평면에서도 관절이 3개 필요하다.

알아 두기. 관절 공간은 장애물을 피하는 길을 찾을 때 쓸모가 있다. 책상 위 장애물을 관절 공간에 옮겨 그리면, 팔의 길 찾기가 "판 위에서 점 하나 옮기기"가 된다(10강).

영상에서 보기: 06:46 설정 파라미터와 일반화 좌표 · 14:07 손끝의 작업 좌표 · 22:33 관절 공간과 작업 공간

2.3 여유자유도

팔의 자유도 n이 손끝에 필요한 자유도 m₀보다 크면, 손끝을 고정해도 팔이 움직일 여유가 남는다. 이것을 여유자유도(redundancy)라 하고, 여유의 크기는 n − m₀이다.

직접 해 보자. 한 손을 책상에 짚고 손바닥을 그대로 둔 채 팔꿈치를 올렸다 내렸다 해 본다. 사람 팔은 관절이 7개(어깨 3, 팔꿈치 1, 손목 3)이고, 손의 위치와 방향은 6개다. 여유가 1이라서 팔꿈치가 자유롭다.

아래 그림은 관절이 3개인 평면 팔이다. 손끝 위치 (x, y)만 지키면 되므로 m₀ = 2이고, 여유는 3 − 2 = 1이다. 슬라이더를 움직여 보자.

손끝은 그대로, 팔 모양은 계속 바뀐다
관절 3개(8 cm, 7 cm, 5 cm) 팔이 손끝 위치만 지킬 때. 회색 선은 같은 손끝에 닿는 다른 자세 몇 개다.
그림 2-4 · 직접 바꿔 보기: 여유자유도가 있는 팔

1.3절의 "두 답"과 무엇이 다른가

여유가 있으면 장애물을 돌아서 손을 뻗을 수 있다. 대신 "어느 자세를 고를까"라는 문제가 생긴다. 이 수업은 여유가 없는 팔만 다루고, 여유는 스탠퍼드의 다음 수업(고급 로봇공학)에서 배운다.

잠깐, 생각해 보기. 평면 팔에 관절이 4개다. 손끝의 위치와 방향을 모두 지킨다면 여유는 얼마인가?

평면에서 위치와 방향은 m₀ = 3이다. 여유는 4 − 3 = 1이다. 강의에 나오는 예가 바로 이것이다.

영상에서 보기: 25:49 여유자유도

2.4 점, 벡터, 좌표계

여기서부터가 이 장의 본론이다. "컵이 어디 있나"를 숫자로 말하려면 두 가지를 먼저 정해야 한다. 어디서부터 잴지(원점), 그리고 어느 방향으로 잴지(축)다.

로봇에서는 받침, 링크, 손끝, 카메라에 좌표계를 하나씩 붙인다. 물체가 움직이면 그 물체의 좌표계도 함께 움직인다. 그러면 "이 물체가 어디 어떻게 놓였나"는 "이 좌표계가 어디 어떻게 놓였나"와 같은 질문이 된다.

표기를 하나 정한다. ᴬP는 "점 P를 {A}의 원점과 축으로 잰 숫자"다. 왼쪽 위의 작은 글자가 "어느 좌표계에서 본 것인지"를 말해 준다.

벡터는 원점과 축을 정해야 숫자가 된다
그림 2-5 · 원점을 옮기면 벡터가, 축을 돌리면 숫자가 바뀐다

그림에서 두 가지를 읽어 내자.

  1. (가) 원점이 다르면 화살표 자체가 다르다. 같은 점 P인데 원점 A에서 그은 화살표와 원점 B에서 그은 화살표는 길이도 방향도 다르다. 점선(원점 사이)을 더하면 두 화살표가 이어진다. 이 더하기가 2.8절의 평행이동이다.
  2. (나) 축만 돌리면 화살표는 그대로, 숫자만 바뀐다. 원점이 같으니 화살표는 하나다. 그런데 {A}의 축으로 재면 (2, 3), 30° 돌린 {B}의 축으로 재면 (3.2, 1.6)이다. 점선은 각 축에 내린 수선이다.

잠깐, 생각해 보기. (나)의 (3.2, 1.6)은 어떻게 구했을까? 자로 재지 않고 계산만으로 구할 수 있을까?

구할 수 있다. {B}의 축이 {A}에서 어느 방향인지만 알면 된다. 그 방법이 다음 절의 회전행렬이다.

영상에서 보기: 29:00 점과 벡터 · 33:12 좌표계는 강체에 붙인다

2.5 평면 회전부터

강의는 바로 3차원으로 들어가지만, 여기서는 평면에서 먼저 익힌다. 생각하는 방법은 3차원에서도 똑같다.

책상에 그린 축이 {A}다. 같은 원점에서 θ만큼 돌린 축이 {B}다. 예를 들어 종이 팔의 어깨가 θ만큼 돌면, 링크 1에 붙은 좌표계가 바로 {B}다.

질문 하나: {B}의 축을 {A}로 재면?

길이가 1인 화살표가 x축에서 θ만큼 돌아가 있다. 그 끝에서 두 축에 수선을 내리면 가로 길이는 cos θ, 세로 길이는 sin θ다. 고등학교에서 배운 바로 그 정의다. 아래 그림의 점선이 그것이다.

이 두 화살표를 세로로 세워 나란히 놓은 것이 회전행렬이다.

회전행렬의 열은 돌린 축이다. 이 한 줄이 이 장에서 가장 중요하다. 외울 것은 이것 하나뿐이다. 슬라이더를 움직여 행렬의 숫자가 화살표를 따라 바뀌는 것을 보자.

돌린 축을 원래 축으로 적으면 cos와 sin이 나온다
점선: xB 방향으로 2칸, 그다음 yB 방향으로 1칸 = 점 P
그림 2-6 · 직접 돌려 보기: 회전행렬의 열은 돌린 축이다

질문 둘: {B}에서 (2, 1)인 점은 {A}에서 어디?

{B}에서 (2, 1)이라는 말은 "xB 방향으로 2칸, yB 방향으로 1칸 간 곳"이다. 그림의 점선 경로가 그것이다. xB와 yB를 {A}로 쓴 숫자는 이미 안다. 그러니 섞어서 더하기만 하면 된다.

이것이 행렬 × 벡터의 뜻이다. 벡터의 숫자만큼 행렬의 열을 섞어 더한다. θ = 30°이면 cos 30° ≈ 0.87, sin 30° = 0.5이므로

수학 더하기: 행렬 × 벡터를 계산하는 두 가지 방법. (1) 열을 섞는다: 위에서 한 것처럼 벡터 숫자만큼 각 열을 곱해 더한다. (2) 행과 곱한다: 답의 첫 숫자는 첫 행 (0.87, −0.50)과 (2, 1)을 칸끼리 곱해 더한 것이다. 0.87×2 + (−0.50)×1 = 1.23. 두 방법은 같은 답을 준다. 뜻을 생각할 때는 (1), 손으로 계산할 때는 (2)가 편하다.

슬라이더로 해 볼 것

  1. θ = 0°: 행렬이 [[1, 0], [0, 1]]이 된다. 아무것도 안 바뀐다. 이런 행렬을 단위행렬이라 한다.
  2. θ = 90°: 행렬이 [[0, −1], [1, 0]]이 된다. P는 (−1, 2)다. 종이에 그려 확인해 보자.
  3. θ = 180°: 두 축이 모두 반대를 본다. P는 (−2, −1)이다.
  4. 어느 각도에서든 P까지의 거리는 √5 ≈ 2.24로 같다. 회전은 길이를 바꾸지 않는다.

2.4절 (나)의 (3.2, 1.6)은 방향이 반대다. {A}의 숫자를 {B}의 숫자로 바꾸는 것이라 2.7절에서 구한다.

영상에서 보기: 35:18 회전행렬의 정의 · 37:23 열 = 새 축

2.6 3차원 회전행렬과 내적

3차원에서도 생각은 같다. 축이 세 개가 되었을 뿐이다. {B}의 x, y, z축을 각각 {A}의 숫자 세 개로 적고, 세로로 세워 나란히 놓으면 3×3 회전행렬이 된다.

왼쪽 위 A는 "{A}의 숫자로", 왼쪽 아래 B는 "{B}의 축을"이라는 뜻이다. 교재와 강의가 이 표기를 쓴다.

예제: x축으로 90° 돌린 좌표계

강의 43분쯤에 나오는 예제다. {B}는 {A}를 x축을 중심으로 90° 돌린 것이다.

B의 축을 A로 적으면 회전행렬의 세 열이 된다
그림 2-7 · x축으로 90° 돌린 좌표계 (강의 예제)

그림을 보고 {B}의 축 세 개를 하나씩 {A}로 읽는다.

  1. xB는 xA와 같다. → (1, 0, 0)
  2. yB는 위를 본다. zA 방향이다. → (0, 0, 1)
  3. zB는 yA의 반대쪽을 본다. → (0, −1, 0)

세 개를 세로로 세워 나란히 놓는다.

수학 더하기: 오른손 법칙. 오른손 엄지를 x, 검지를 y로 펴면 중지가 가리키는 쪽이 z다. 로봇공학은 항상 이 방향을 쓴다. 예제의 {B}도 xB, yB, zB가 오른손 순서를 지킨다. 손가락으로 직접 맞춰 보자.

축 하나로 도는 기본 회전 세 가지

한 축을 중심으로 돌면 그 축은 그대로고, 나머지 두 축이 2.5절의 평면 회전처럼 돈다. 그래서 행렬 안에 2×2 회전행렬이 들어 있다.

잠깐, 생각해 보기. RX(90°)에 cos 90° = 0, sin 90° = 1을 넣으면 무엇이 나오나?

위 예제의 행렬과 똑같다. 그림으로 읽은 답과 공식으로 구한 답이 맞는다.

각도가 어중간할 때: 내적으로 칸 채우기

축이 90°씩 딱 떨어지지 않으면 그림만 보고 읽기 어렵다. 그때는 내적(dot product)을 쓴다.

내적 = 한 축이 다른 축 위에 드리우는 그림자 길이
그림 2-8 · 내적과 cos

수학 더하기: 내적. 두 벡터 a = (a₁, a₂, a₃), b = (b₁, b₂, b₃)의 내적은 칸끼리 곱해서 더한 것이다. a·b = a₁b₁ + a₂b₂ + a₃b₃. 두 벡터의 길이가 1이면 이 값은 둘 사이 각도의 cos과 같다. 예: (1, 0, 0)·(0, 0, 1) = 0이다. 두 축이 수직이라는 뜻이다.

회전행렬의 각 칸은 "{B}의 축 하나가 {A}의 축 하나 위에 드리우는 그림자"다. i행 j열 칸은 {B}의 j번째 축과 {A}의 i번째 축의 내적이다.

칸마다 두 축 사이 각도의 cos이 들어 있어서, 회전행렬을 방향 코사인(direction cosines)이라고도 부른다.

회전행렬인지 확인하는 법

어떤 3×3 행렬이 회전행렬인지는 두 가지만 보면 된다. 스탠퍼드 숙제 1의 4번이 이 문제다.

  1. 각 열의 길이가 1인가? (숫자를 제곱해 더하면 1)
  2. 서로 다른 두 열의 내적이 0인가? (서로 수직)

여기에 "오른손 순서인가"까지 맞으면 회전행렬이다. 이런 행렬을 정규직교 행렬이라 한다.

영상에서 보기: 39:28 내적으로 회전행렬 구하기 · 43:00 예제

2.7 거꾸로 보기: 회전행렬의 역행렬은 전치

지금까지는 {B}의 숫자를 {A}의 숫자로 바꾸었다. 이번에는 반대로 간다. 카메라가 본 컵을 팔 기준으로 바꾸고, 다시 팔 기준을 카메라 기준으로 돌리는 일은 로봇에서 자주 일어난다.

행에 이미 답이 들어 있다

평면 회전행렬을 다시 보자.

열은 "{B}의 축을 {A}로 쓴 것"이었다. 이번에는 행을 본다. 첫 행은 (cos θ, −sin θ)다.

{B}에 서서 {A}를 보면, {A}는 거꾸로 −θ만큼 돌아가 있다. 그러니 {A}의 x축을 {B}로 재면 (cos(−θ), sin(−θ)) = (cos θ, −sin θ)이다. 바로 첫 행이다.

행은 {A}의 축을 {B}로 쓴 것이다. 그러니 행과 열을 뒤바꾼 행렬(전치행렬, Rᵀ)이 반대 방향 회전행렬이다.

3차원에서도 같다. 2.6절의 내적 표에서 두 좌표계의 역할을 맞바꾸면 행과 열이 뒤바뀐다.

수학 더하기: 역행렬과 전치. 어떤 행렬을 곱했다가 되돌리는 행렬을 역행렬이라 하고 R⁻¹로 쓴다. 보통은 구하기 귀찮다. 전치는 첫 행을 첫 열로, 둘째 행을 둘째 열로 옮겨 적기만 하면 된다. 회전행렬은 두 가지가 같아서, 되돌리기가 공짜다.

2.4절의 질문에 답하기

2.4절 (나)에서 {A}로 (2, 3)인 점을 30° 돌린 {B}로 재면 (3.2, 1.6)이었다. 이제 계산으로 구할 수 있다.

아래 그림에서 θ를 바꿔 보자. 점 P는 움직이지 않는다. 돌아가는 것은 {B}의 축이고, 바뀌는 것은 {B}로 잰 숫자뿐이다.

A의 숫자를 B의 숫자로: 전치행렬을 곱한다
그림 2-9 · 직접 돌려 보기: 점은 그대로, 돌린 축으로 다시 잰 숫자

잠깐, 생각해 보기. Rᵀ와 R을 곱하면 무엇이 나올까?

단위행렬 [[1, 0], [0, 1]]이 나온다. 돌렸다가 도로 돌리면 제자리다. 직접 곱해 보면 cos²θ + sin²θ = 1이 나와서 맞아떨어진다.

영상에서 보기: 40:31 행은 반대 방향 · 41:33 역행렬 = 전치

2.8 회전 + 이동 = 동차변환

이제 2.4절의 (가)와 (나)를 합친다. 실제 로봇에서는 두 좌표계의 원점도 다르고 방향도 다르다.

상황: 카메라가 컵을 봤다

책상에 종이 팔 받침 {0}이 있다. 받침에서 (10, 5) cm 떨어진 곳에 카메라 {C}가 놓여 있다. 카메라는 받침의 x축에서 θ만큼 돌아간 쪽을 본다. 카메라가 "내 앞 2 cm에 컵이 있다"고 알려 주었다. 팔은 받침 기준으로 컵이 어디인지 알아야 한다.

두 단계로 푼다.

  1. 돌린다. 카메라의 숫자를 받침의 방향으로 돌린다. 2.5절의 R을 곱한다.
  2. 더한다. 받침에서 카메라까지의 거리 (10, 5)를 더한다.

순서가 중요하다. 카메라 숫자 (2, 0)에 (10, 5)를 바로 더하면 틀린다. 두 숫자는 서로 다른 방향으로 잰 것이기 때문이다. 더하기 전에 같은 방향으로 돌려 놓는다.

돌리고, 더한다: 카메라 숫자 → 팔 받침 숫자
그림 2-10 · 직접 움직여 보기: 책상을 위에서 본 모습, 카메라는 (10, 5) cm에 있다

세 화살표가 삼각형을 이룬다. 점선(받침 → 카메라) 더하기 파란 화살표(카메라 → 컵) = 주황 화살표(받침 → 컵)다. θ = 90°, 거리 2 cm일 때 답은 (10, 7) cm다. 카메라가 받침의 y 방향을 보고 있어서, 카메라 앞 2 cm는 받침 기준으로 y로 2 cm다.

왜 4×4로 묶나

"돌리고 더하기"는 한 번이면 괜찮다. 그런데 팔에서는 여러 번 건너간다. 받침 → 링크 1 → 링크 2 → 손끝으로 가다 보면 곱셈과 덧셈이 얽혀 식이 길어진다.

요령이 하나 있다. 점의 숫자 끝에 1을 하나 더 붙이고, 행렬도 한 칸 키운다. 그러면 "돌리고 더하기"가 곱셈 한 번이 된다. 평면이면 3×3, 3차원이면 4×4다. 이 행렬을 동차변환(homogeneous transform)이라 하고 T로 쓴다.

평면 예제(θ = 90°, 카메라 (10, 5), 컵 (2, 0))를 3×3으로 계산하면 이렇다.

왼쪽 위 2×2는 회전행렬, 오른쪽 열은 카메라 위치, 맨 아래 줄은 (0, 0, 1)이다. 끝에 붙인 1이 카메라 위치를 한 번 더해 주는 역할을 한다. 맨 아래 줄은 "1 = 1"을 유지할 뿐 다른 뜻은 없다.

3차원에서는 같은 모양의 4×4다.

여러 번 건너기는 곱하기만

동차변환의 진짜 장점은 이것이다. {A}에서 {B}, {B}에서 {C}로 건너가는 변환을 알면, {A}에서 {C}는 두 행렬을 곱하기만 하면 된다.

표기의 글자가 도미노처럼 이어진다(A←B, B←C). 4~5강에서는 관절마다 T를 하나씩 만들고, 전부 곱해서 손끝 위치를 구한다. 이것이 순기구학의 계산 방법이다.

알아 둘 것. 끝에 붙이는 숫자는 점이면 1, 방향이면 0이다. 속도나 힘처럼 "어디에 있느냐"가 아니라 "어느 쪽이냐"만 있는 것은 0을 붙인다. 그러면 회전만 되고 이동은 안 된다. 방향은 옮겨도 방향이기 때문이다.

영상에서 보기: 45:46 좌표계 기술과 매핑 · 48:59 평행이동 · 53:10 동차변환 · 56:17 예제

2.9 같은 행렬의 두 가지 뜻: 매핑과 연산자

교수는 여기서 "이제 다 이해했으니 헷갈리게 해 주겠다"고 농담을 한다. 같은 회전행렬(또는 동차변환)을 두 가지 뜻으로 읽을 수 있기 때문이다.

같은 행렬, 두 가지 읽기
그림 2-11 · 매핑과 연산자
매핑 (mapping) 연산자 (operator)
점 그대로 있다 움직인다 (P₁ → P₂)
바뀌는 것 보는 좌표계 점의 위치
식 ᴬP = R · ᴮP P₂ = R · P₁
예 카메라가 본 컵을 팔 기준으로 (2.8절) "집게를 30° 돌려라"

두 경우 모두 계산은 똑같다. 행렬을 곱할 뿐이다. 그러니 문제를 풀 때는 "지금 점이 움직이는가, 보는 쪽이 바뀌는가"만 먼저 정하면 된다.

연산자 예제 (강의 예제)

점 P₁ = (0, 2, 1)을 x축을 중심으로 θ만큼 돌린다. cos θ = 0.8, sin θ = 0.6이다(θ ≈ 36.9°). x 성분은 0이라 변하지 않고, y·z 면에서만 돈다. 그림 2-11 (나)가 그 y·z 면이다.

길이는 돌기 전과 후 모두 √5다. 회전은 길이를 바꾸지 않는다.

이동 연산자와 일반 연산자

점을 Q만큼 옮기는 것도 연산자다. P₂ = P₁ + Q. 돌리고 옮기는 것을 한꺼번에 하면 2.8절과 똑같은 4×4 행렬이 된다.

여기서 주의할 점이 하나 있다. P₁, Q, P₂는 모두 같은 좌표계의 숫자로 적어야 한다.

영상에서 보기: 57:18 두 번째 해석 · 1:00:31 회전 연산자 예제 · 1:03:46 일반 연산자

2.10 거꾸로 가는 동차변환

회전행렬은 전치만 하면 거꾸로 간다. 동차변환은 이동 칸 때문에 전치만으로는 안 된다. 대신 조금만 더 하면 된다.

두 단계를 거꾸로 되감는다

2.8절에서는 "돌리고 → 더한다"였다. 거꾸로 갈 때는 순서도 거꾸로 "빼고 → 되돌린다".

  1. 뺀다. 받침 기준 숫자에서 카메라 위치 p를 뺀다.
  2. 되돌린다. Rᵀ를 곱해 카메라 방향의 숫자로 바꾼다.

이것을 동차변환 모양으로 쓰면 역변환이 된다.

예제: 받침 기준 → 카메라 기준

2.8절의 카메라(θ = 90°, 위치 (10, 5))로 해 보자. Rᵀ를 구하고, −Rᵀp를 계산한다.

받침 기준 (10, 7)인 컵이 카메라 기준 (2, 0)으로 돌아왔다. 2.8절과 거꾸로 맞아떨어진다.

잠깐, 생각해 보기. (−5, 10)은 "카메라에서 본 받침의 원점"이다. 그림 2-10(θ = 90°)을 보고 정말 그런지 확인해 보자.

카메라는 받침의 y 방향을 본다. 카메라의 x축은 y₀ 쪽, y축은 −x₀ 쪽이다. 받침은 카메라에서 보면 뒤로 5 cm(xC = −5), 왼쪽으로 10 cm(yC = 10) 떨어져 있다. 맞다.

이것으로 2강 내용이 끝난다. 다음 3강에서는 변환을 여러 번 겹치는 법과, 방향을 세 각도로 적는 법(오일러 각)을 배운다.

영상에서 보기: 1:05:54 동차변환의 역행렬 · 1:07:30 다음 시간 예고

2.11 연습문제

종이에 축을 그리면서 푼다. 답은 문제 7개 아래에 있다. 답을 보기 전에 손으로 끝까지 풀어 본다.

  1. {A}와 {B}의 원점이 같다. xB는 xA와 같은 방향, yB는 zA 방향, zB는 −yA 방향이다. {A}에서 본 {B}의 회전행렬을 구하라. (2.6절 그림을 보지 않고)
  2. 문제 1의 {B}를, {A}에서 본 원점이 (0, 3, 1)인 곳으로 옮겼다. {B}에서 (0, 1, 1)인 점은 {A}에서 어디인가?
  3. 문제 2의 역변환을 구하고, (0, 2, 2)를 넣어 (0, 1, 1)이 나오는지 확인하라.
  4. 평면에서 점 (3, 1)을 원점을 중심으로 90° 돌린다(연산자). 어디로 가나?
  5. 2.8절의 카메라가 (10, 5) cm에 있고, 이번에는 θ = 180°(받침 쪽)를 본다. 카메라 앞 3 cm에 컵이 있다. 받침 기준으로 컵은 어디인가?
  6. 자유도와 여유를 세라. 손끝은 3차원에서 위치 3 + 방향 3이다.
    1. 사람 팔: 어깨 3, 팔꿈치 1, 손목 3
    2. 받침 회전 1, 어깨 1, 팔꿈치 1인 팔
    3. 평면에서 움직이는 관절 4개 팔 (손끝 위치와 방향)
  7. 아래 행렬이 회전행렬인지 2.6절의 두 가지로 확인하라. [[0, 1], [−1, 0]]

답

답 1. 열은 {B}의 축을 {A}로 쓴 것이다. xB = (1, 0, 0), yB = (0, 0, 1), zB = (0, −1, 0). RX(90°)와 같다.

답 2. 먼저 돌린다. R × (0, 1, 1) = (0, −1, 1). 그다음 원점 (0, 3, 1)을 더한다. 답은 (0, 2, 2)다.

답 3. Rᵀ는 아래와 같고, −Rᵀ × (0, 3, 1) = (0, −1, 3)이다. 확인하면 Rᵀ × (0, 2, 2) + (0, −1, 3) = (0, 2, −2) + (0, −1, 3) = (0, 1, 1)이다. (0, −1, 3)은 {B}에서 본 {A}의 원점이다.

답 4. 90° 회전행렬은 [[0, −1], [1, 0]]이다. 첫 숫자는 0×3 + (−1)×1 = −1, 둘째는 1×3 + 0×1 = 3. 답은 (−1, 3)이다. 길이는 √10으로 그대로다.

답 5. 180° 회전행렬은 [[−1, 0], [0, −1]]이다. R × (3, 0) = (−3, 0). 카메라 위치를 더하면 (7, 5) cm다. 카메라가 받침 쪽을 보니 컵은 카메라보다 받침에 3 cm 더 가까운 곳에 있다. 그림 2-10에서 θ = 180°, 거리 3 cm로 맞춰 확인해 보자.

답 6.

답 7. 회전행렬이다. 첫 열 (0, −1)과 둘째 열 (1, 0)은 둘 다 길이가 1이다. 두 열의 내적은 0×1 + (−1)×0 = 0이라 수직이다. −90° 회전이다.

파이썬으로 확인

파이썬(numpy)이 있으면 아래를 붙여 넣어 돌려 본다. 주석의 값이 그대로 나온다.

import numpy as np

def rot2(deg):
    t = np.radians(deg)
    return np.array([[np.cos(t), -np.sin(t)], [np.sin(t), np.cos(t)]])

def rot_x(deg):
    t = np.radians(deg)
    c, s = np.cos(t), np.sin(t)
    return np.array([[1, 0, 0], [0, c, -s], [0, s, c]])

def homog(R, p):
    """회전행렬 R과 원점 위치 p로 동차변환을 만든다 (평면 3×3, 3차원 4×4)."""
    n = len(p)
    T = np.eye(n + 1)
    T[:n, :n] = R
    T[:n, n] = p
    return T

def inv_homog(T):
    """동차변환의 역: 왼쪽 위는 전치, 오른쪽 위는 -R^T p."""
    n = T.shape[0] - 1
    R, p = T[:n, :n], T[:n, n]
    return homog(R.T, -R.T @ p)

np.set_printoptions(precision=2, suppress=True)

# 2.5 평면 회전: B에서 (2, 1) -> A
print(rot2(30) @ [2, 1])                    # [1.23 1.87]
# 2.7 전치: A에서 (2, 3) -> B
print(rot2(30).T @ [2, 3])                  # [3.23 1.6 ]
# 2.8 카메라 -> 팔 받침 (평면 3×3)
T_0C = homog(rot2(90), [10, 5])
print(T_0C @ [2, 0, 1])                     # [10.  7.  1.]
# 2.10 팔 받침 -> 카메라
print(inv_homog(T_0C) @ [10, 7, 1])         # [2. 0. 1.]
# 문제 1~3 (3차원 4×4)
R = rot_x(90)
print(R)                                    # [[ 1.  0.  0.] [ 0.  0. -1.] [ 0.  1.  0.]]
T = homog(R, [0, 3, 1])
print(T @ [0, 1, 1, 1])                     # [0. 2. 2. 1.]
print(inv_homog(T) @ [0, 2, 2, 1])          # [0. 1. 1. 1.]
# 문제 4
print(rot2(90) @ [3, 1])                    # [-1.  3.]
# 문제 5
print(homog(rot2(180), [10, 5]) @ [3, 0, 1])  # [7. 5. 1.]
# 회전행렬 확인: 열 길이 1, 서로 수직
print(np.allclose(R.T @ R, np.eye(3)))      # True

스탠퍼드 숙제

스탠퍼드 강의 페이지의 Homework 1에서 1번(회전 두 번 겹치기)과 3번(동차변환의 역)은 이 장으로 풀 수 있다. 2번과 4번은 3강을 배운 뒤에 푼다. 풀이는 같은 페이지의 Solution 1에 있다.

다 풀었으면 2강 영상을 한 번 본다.

← 1장. 로봇 팔은 무엇을 풀어야 하나3장. 변환을 잇고, 방향을 세 각도로 적기 →