2장. 위치와 방향을 숫자로 적기
물체가 어디에 어느 방향으로 있는지는 회전행렬과 원점 위치로 적는다. 이 장은 평면(2차원)에서 먼저 익히고 3차원으로 넓힌다. 강의 2강(68분)에 해당한다.
2.1 관절과 자유도
팔에 모터가 몇 개 필요한지, 손끝을 얼마나 자유롭게 놓을 수 있는지는 자유도(degree of freedom)가 정한다. 자유도는 "서로 상관없이 움직일 수 있는 방향의 수"다.
- 문: 경첩으로 돌기만 한다. 자유도 1.
- 책상 위의 마우스: 앞뒤, 좌우로 밀고 제자리에서 돌릴 수 있다. 자유도 3.
- 공중의 드론: 앞뒤·좌우·위아래로 가고, 세 방향으로 기울 수 있다. 자유도 6.
관절은 두 가지만 생각한다
로봇 팔의 관절은 거의 다 이 두 가지다. 둘 다 자유도가 1이다. 서보 관절은 회전 관절이다.
사람 어깨처럼 여러 방향으로 도는 관절(구형 관절, 자유도 3)은 어떻게 할까? 회전 관절 3개를 한 점에 겹쳐 놓은 것으로 본다. 사이 링크의 길이는 0이다. 그러면 관절은 항상 자유도 1짜리만 다루면 된다.
자유도 세기: 6n − 5n = n
관절을 모두 떼어 내면 링크들이 공중에 떠 있다. 그 상태에서 다시 붙이며 세어 보자.
- 떠 있는 링크 하나는 드론처럼 6개의 숫자(이동 3 + 회전 3)가 있어야 위치가 정해진다. 링크가 n개면 6n개다.
- 회전 관절로 붙이면 돌기 1개만 남는다. 나머지 5개는 관절이 막는다. 관절이 n개면 5n개를 막는다.
- 남는 자유도는 6n − 5n = n이다.
받침이 고정된 팔은 관절 개수가 곧 자유도다. 관절 하나에 모터 하나다.
잠깐, 생각해 보기. "받침 회전 + 어깨 + 팔꿈치"로 된 팔이 있다. 자유도는 몇이고, 모터는 몇 개 필요한가?
자유도 3, 모터 3개다(집게를 여닫는 모터는 따로 센다).
걷는 로봇은 더 어렵다
사람처럼 걷는 로봇은 받침(몸통)도 떠서 움직인다. 몸통 자체가 자유도 6을 더 가져 모두 n + 6이다. 그런데 몸통에는 직접 미는 모터가 없다. 발로 땅을 밀어서만 움직일 수 있다. 그래서 걷는 로봇의 제어가 어렵다.
영상에서 보기: 03:35 관절의 종류 · 08:50 자유도 세기 · 13:01 휴머노이드는 n + 6
2.2 관절 공간과 작업 공간
같은 팔 자세를 두 가지 숫자 묶음으로 적을 수 있다. 관절 각도로 적거나, 손끝 위치로 적는다.
모양을 정하는 숫자는 최소 몇 개인가
종이 팔의 모양을 친구에게 숫자로 알려 준다고 하자. 방법은 여러 가지다.
- 팔꿈치와 손끝의 (x, y)를 모두 알려 준다: 숫자 4개. 그런데 링크 길이가 정해져 있어서 네 숫자는 서로 얽혀 있다. 팔꿈치를 정하면 손끝은 원 위에서만 고를 수 있다.
- 어깨 각도와 팔꿈치 각도를 알려 준다: 숫자 2개. 둘은 서로 상관없이 아무 값이나 가질 수 있다.
모양을 완전히 정하는 숫자 묶음을 설정 파라미터라 한다. 그중 서로 얽히지 않은 최소 묶음을 일반화 좌표라 한다. 관절 각도가 바로 일반화 좌표다. 일반화 좌표의 개수는 자유도와 같다.
두 개의 판
관절 각도 (θ₁, θ₂)를 가로·세로로 잡으면 판 위의 점 하나가 팔 자세 하나를 나타낸다. 이 판을 관절 공간(joint space)이라 한다. 손끝의 (x, y)로 만든 판은 작업 공간(operational space)이다. 슬라이더를 움직여 두 판의 점이 함께 움직이는 것을 보자.
눈여겨볼 것 두 가지:
- 관절 공간의 점 하나는 손끝 하나로 간다. 순기구학이 이 화살표다.
- 손끝 하나에는 관절 공간의 점이 두 개 있다. 점선 팔이 같은 손끝에 닿는 다른 자세다. 관절 공간에서는 속이 빈 점으로, 전혀 다른 곳에 있다. θ₂ = 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이다. 슬라이더를 움직여 보자.
1.3절의 "두 답"과 무엇이 다른가
- 여유가 없을 때(관절 2개, 손끝 위치 2개): 답이 뿔뿔이 몇 개다. 팔꿈치 위 하나, 아래 하나.
- 여유가 있을 때(관절 3개, 손끝 위치 2개): 답이 이어져 있다. 슬라이더를 조금씩 밀면 팔 모양도 조금씩 끝없이 바뀐다.
여유가 있으면 장애물을 돌아서 손을 뻗을 수 있다. 대신 "어느 자세를 고를까"라는 문제가 생긴다. 이 수업은 여유가 없는 팔만 다루고, 여유는 스탠퍼드의 다음 수업(고급 로봇공학)에서 배운다.
잠깐, 생각해 보기. 평면 팔에 관절이 4개다. 손끝의 위치와 방향을 모두 지킨다면 여유는 얼마인가?
평면에서 위치와 방향은 m₀ = 3이다. 여유는 4 − 3 = 1이다. 강의에 나오는 예가 바로 이것이다.
영상에서 보기: 25:49 여유자유도
2.4 점, 벡터, 좌표계
여기서부터가 이 장의 본론이다. "컵이 어디 있나"를 숫자로 말하려면 두 가지를 먼저 정해야 한다. 어디서부터 잴지(원점), 그리고 어느 방향으로 잴지(축)다.
- 점은 공간의 한 곳이다. 누가 보든 같은 곳이다.
- 벡터는 원점에서 그 점까지 그은 화살표다. 원점을 정해야 생긴다.
- 좌표계(frame)는 원점 하나와, 서로 수직이고 길이가 1인 축 세 개(평면이면 두 개)다. {A}, {B}처럼 중괄호로 이름을 붙인다.
로봇에서는 받침, 링크, 손끝, 카메라에 좌표계를 하나씩 붙인다. 물체가 움직이면 그 물체의 좌표계도 함께 움직인다. 그러면 "이 물체가 어디 어떻게 놓였나"는 "이 좌표계가 어디 어떻게 놓였나"와 같은 질문이 된다.
표기를 하나 정한다. ᴬP는 "점 P를 {A}의 원점과 축으로 잰 숫자"다. 왼쪽 위의 작은 글자가 "어느 좌표계에서 본 것인지"를 말해 준다.
그림에서 두 가지를 읽어 내자.
- (가) 원점이 다르면 화살표 자체가 다르다. 같은 점 P인데 원점 A에서 그은 화살표와 원점 B에서 그은 화살표는 길이도 방향도 다르다. 점선(원점 사이)을 더하면 두 화살표가 이어진다. 이 더하기가 2.8절의 평행이동이다.
- (나) 축만 돌리면 화살표는 그대로, 숫자만 바뀐다. 원점이 같으니 화살표는 하나다. 그런데 {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 θ다. 고등학교에서 배운 바로 그 정의다. 아래 그림의 점선이 그것이다.
- {B}의 x축을 {A}로 재면 (cos θ, sin θ)이다.
- {B}의 y축은 x축에서 90° 더 돈 방향이라 (−sin θ, cos θ)이다.
이 두 화살표를 세로로 세워 나란히 놓은 것이 회전행렬이다.
회전행렬의 열은 돌린 축이다. 이 한 줄이 이 장에서 가장 중요하다. 외울 것은 이것 하나뿐이다. 슬라이더를 움직여 행렬의 숫자가 화살표를 따라 바뀌는 것을 보자.
질문 둘: {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)가 편하다.
슬라이더로 해 볼 것
- θ = 0°: 행렬이 [[1, 0], [0, 1]]이 된다. 아무것도 안 바뀐다. 이런 행렬을 단위행렬이라 한다.
- θ = 90°: 행렬이 [[0, −1], [1, 0]]이 된다. P는 (−1, 2)다. 종이에 그려 확인해 보자.
- θ = 180°: 두 축이 모두 반대를 본다. P는 (−2, −1)이다.
- 어느 각도에서든 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}로 읽는다.
- xB는 xA와 같다. → (1, 0, 0)
- yB는 위를 본다. zA 방향이다. → (0, 0, 1)
- 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)을 쓴다.
수학 더하기: 내적. 두 벡터 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)
- 서로 다른 두 열의 내적이 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}로 잰 숫자뿐이다.
잠깐, 생각해 보기. 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에 컵이 있다"고 알려 주었다. 팔은 받침 기준으로 컵이 어디인지 알아야 한다.
두 단계로 푼다.
- 돌린다. 카메라의 숫자를 받침의 방향으로 돌린다. 2.5절의 R을 곱한다.
- 더한다. 받침에서 카메라까지의 거리 (10, 5)를 더한다.
순서가 중요하다. 카메라 숫자 (2, 0)에 (10, 5)를 바로 더하면 틀린다. 두 숫자는 서로 다른 방향으로 잰 것이기 때문이다. 더하기 전에 같은 방향으로 돌려 놓는다.
세 화살표가 삼각형을 이룬다. 점선(받침 → 카메라) 더하기 파란 화살표(카메라 → 컵) = 주황 화살표(받침 → 컵)다. θ = 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 같은 행렬의 두 가지 뜻: 매핑과 연산자
교수는 여기서 "이제 다 이해했으니 헷갈리게 해 주겠다"고 농담을 한다. 같은 회전행렬(또는 동차변환)을 두 가지 뜻으로 읽을 수 있기 때문이다.
| 매핑 (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절에서는 "돌리고 → 더한다"였다. 거꾸로 갈 때는 순서도 거꾸로 "빼고 → 되돌린다".
- 뺀다. 받침 기준 숫자에서 카메라 위치 p를 뺀다.
- 되돌린다. Rᵀ를 곱해 카메라 방향의 숫자로 바꾼다.
이것을 동차변환 모양으로 쓰면 역변환이 된다.
- 왼쪽 위는 회전행렬을 전치한 것이다.
- 오른쪽 위는 −Rᵀp다. 뜻은 "{B}에서 본 {A}의 원점"이다. 뜻을 알면 외울 필요가 없다. 방향을 뒤집었으니 "저쪽에서 이쪽 원점이 어디 보이나"를 적는 것이다.
예제: 받침 기준 → 카메라 기준
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개 아래에 있다. 답을 보기 전에 손으로 끝까지 풀어 본다.
- {A}와 {B}의 원점이 같다. xB는 xA와 같은 방향, yB는 zA 방향, zB는 −yA 방향이다. {A}에서 본 {B}의 회전행렬을 구하라. (2.6절 그림을 보지 않고)
- 문제 1의 {B}를, {A}에서 본 원점이 (0, 3, 1)인 곳으로 옮겼다. {B}에서 (0, 1, 1)인 점은 {A}에서 어디인가?
- 문제 2의 역변환을 구하고, (0, 2, 2)를 넣어 (0, 1, 1)이 나오는지 확인하라.
- 평면에서 점 (3, 1)을 원점을 중심으로 90° 돌린다(연산자). 어디로 가나?
- 2.8절의 카메라가 (10, 5) cm에 있고, 이번에는 θ = 180°(받침 쪽)를 본다. 카메라 앞 3 cm에 컵이 있다. 받침 기준으로 컵은 어디인가?
- 자유도와 여유를 세라. 손끝은 3차원에서 위치 3 + 방향 3이다.
- 사람 팔: 어깨 3, 팔꿈치 1, 손목 3
- 받침 회전 1, 어깨 1, 팔꿈치 1인 팔
- 평면에서 움직이는 관절 4개 팔 (손끝 위치와 방향)
- 아래 행렬이 회전행렬인지 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.
- 사람 팔: n = 7, m₀ = 6 → 여유 1. 손을 컵에 대고도 팔꿈치를 움직일 수 있다.
- 받침 회전 + 어깨 + 팔꿈치 팔: n = 3. 손끝 위치(x, y, z)는 고를 수 있지만 손 방향은 따라 정해진다. 방향까지 고르려면 손목 관절이 더 필요하다.
- 평면 4관절 팔: n = 4, 평면의 위치와 방향은 m₀ = 3 → 여유 1.
답 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강 영상을 한 번 본다.