4장. 링크를 숫자 네 개로 적기: DH 파라미터
팔의 링크마다 좌표계를 규칙대로 붙이면, 이웃한 좌표계 사이를 숫자 네 개(DH 파라미터)로 적을 수 있다. 이 네 숫자로 만든 변환을 차례로 곱하면 손끝의 위치와 방향이 나온다. 강의 4강(72분)에 해당한다.
4.1 좌표계를 어디에 붙일까
3.2절에서 종이 팔에 좌표계를 붙이고 변환을 이어 곱해 손끝 위치를 구했다. 그때는 좌표계를 눈으로 보기에 자연스러운 곳에 붙였다. 관절이 6개이고 축이 비틀린 팔에서도 그렇게 할 수 있을까?
좌표계는 링크에 단단히 붙어 함께 움직이기만 하면 어디에 붙여도 된다. 예를 들어 링크 가운데에 아무 방향으로 붙일 수도 있다. 문제는 그다음이다.
잠깐, 생각해 보기. 좌표계 두 개 사이의 동차변환을 적으려면 숫자가 몇 개 필요할까?
6개다. 원점 사이의 이동 3개와 방향의 회전 3개다(2.1절의 드론과 같다). 좌표계를 아무 데나 붙이면 이웃 링크 사이마다 숫자 6개가 생긴다. 게다가 관절이 돌면 6개가 모두 얽혀서 함께 바뀐다.
관절은 한 방향으로만 움직인다(자유도 1). 이 제약을 쓰면 숫자를 줄일 수 있다. 좌표계를 관절 축에 맞춰 규칙대로 붙이면, 이웃 좌표계 사이는 숫자 4개로 적힌다.
네 숫자 중 3개는 로봇을 만들 때 정해지는 상수다. 관절이 움직일 때 바뀌는 것은 1개뿐이다.
이 네 숫자를 DH 파라미터(Denavit–Hartenberg parameters)라 한다. 1955년 Denavit과 Hartenberg가 제안한 방법이다.
이 장은 네 숫자의 뜻(4.2~4.4절), 좌표계를 붙이는 규칙(4.5~4.6절), 네 숫자로 변환을 만들고 곱하는 법(4.8~4.9절)을 차례로 본다. 강의는 IBM의 초고속 위치 결정 장치 Hummingbird 영상(1992년)으로 시작하고, 본론은 5분쯤부터다.
영상에서 보기: 04:50 오늘 할 일: 링크에서 순기구학까지 · 07:26 좌표계 사이의 숫자 6개 · 07:58 제약을 쓰자
4.2 링크 하나 = 숫자 두 개: 길이 a와 비틀림 α
관절 축은 직선이다
회전 관절은 한 직선을 중심으로 돈다. 이 직선을 관절 축(joint axis)이라 한다. 직동 관절은 한 직선을 따라 미끄러지고, 그 방향이 관절 축이다.
관절 i의 축을 "축 i"라 부른다. 링크 번호는 받침이 링크 0이고, 관절 1 다음이 링크 1이다. 그러면 링크 i−1은 축 i−1과 축 i를 잇는다.
기구학에 중요한 것은 링크의 모양이 아니다. 링크가 굽었든 두껍든, 양 끝의 두 축이 서로 어떻게 놓였는지만 중요하다. 두 직선의 관계는 숫자 두 개로 적힌다.
공통 수선과 링크 길이 a
3차원에서 두 직선은 대개 만나지도 않고 나란하지도 않다. 이런 관계를 꼬인 위치(skew)라 한다.
꼬인 두 직선 사이에는 두 직선에 모두 수직인 선분이 꼭 하나 있다. 이것을 공통 수선(common normal)이라 한다.
공통 수선의 길이가 링크 길이(link length) ai−1이다. 두 축 사이의 가장 짧은 거리다. 공통 수선의 방향은 축 i−1에서 축 i 쪽(손끝 쪽)으로 잡는다.
수학 더하기: 꼬인 위치와 가장 짧은 거리. 방의 천장에서 앞벽을 따라가는 모서리와, 바닥에서 왼쪽 벽을 따라가는 모서리를 떠올려 보자. 둘은 만나지도 나란하지도 않다. 둘을 잇는 가장 짧은 선은 두 벽이 만나는 세로 모서리이고, 두 모서리에 모두 수직이다. 그보다 비스듬한 선은 모두 더 길다. 그래서 두 직선 사이의 거리는 공통 수선의 길이로 정한다.
링크 비틀림 α
축 i의 발(공통 수선이 닿는 점)에 축 i−1과 나란한 선을 그어 보자. 그 선과 축 i 사이에 각이 생긴다. 이 각이 링크 비틀림(link twist) αi−1이다.
각의 부호는 오른손 법칙으로 정한다. 오른손 엄지를 공통 수선 방향(축 i−1 → 축 i)으로 세운다. 네 손가락이 감기는 쪽으로 돌아 축 i에 닿으면 +다.
해 볼 것 세 가지:
- α를 0°로 둔다. 두 축이 나란해진다. 종이 팔의 어깨 축과 팔꿈치 축이 이렇다.
- a를 0으로 둔다. 두 축이 한 점에서 만난다. 여러 축이 한 점에 모인 손목이 이렇다.
- α를 +40°와 −40°로 바꿔 본다. 축 i가 기우는 쪽이 반대가 된다. 부호가 방향을 말해 준다.
a와 α는 로봇을 만들 때 정해진다. 관절이 돌아도 링크 모양은 그대로라서 바뀌지 않는다.
잠깐, 생각해 보기. 종이 팔의 어깨 축(축 1)과 팔꿈치 축(축 2)에서 a₁과 α₁은 얼마인가?
두 축 모두 책상 면에 수직이라 나란하다. 그래서 α₁ = 0이다. 두 축 사이의 거리는 링크 1의 길이이므로 a₁ = 10 cm다.
영상에서 보기: 10:02 링크와 양 끝의 두 축 · 10:34 공통 수선 · 12:08 비틀림 각
4.3 축이 나란하거나 만날 때
꼬인 위치에서는 공통 수선이 하나로 정해진다. 그런데 실제 로봇 팔은 축이 나란하거나 만나는 경우가 더 많다. 이때는 우리가 골라야 할 것이 생긴다.
나란한 축
두 축이 나란하면 α = 0이다(두 축의 + 방향을 반대로 잡았다면 180°). 두 축에 모두 수직인 선은 높이만 바꿔 얼마든지 그을 수 있다. 길이는 모두 같으므로 a는 하나로 정해진다.
어느 높이에 그을지는 우리가 고른다. 보통은 다음 절의 숫자 d가 0이 되는 높이를 고른다.
만나는 축
두 축이 한 점에서 만나면 a = 0이다. 공통 수선은 만나는 점을 지나고, 두 축이 함께 놓인 평면에 수직이다.
그런데 평면에 수직인 방향은 두 가지다. 어느 쪽을 고르느냐에 따라 α의 부호가 바뀐다.
어느 쪽을 골라도 틀리지 않는다. 고른 방향은 변환에 그대로 담기고, 그다음 링크의 숫자가 알아서 맞춰 준다. 다만 한번 고르면 끝까지 그 방향을 쓴다.
수학 더하기: 외적. 두 방향 u, v에 모두 수직인 방향은 외적(cross product) u × v로 구한다. u = (u₁, u₂, u₃), v = (v₁, v₂, v₃)이면 u × v = (u₂v₃ − u₃v₂, u₃v₁ − u₁v₃, u₁v₂ − u₂v₁)이다. 예: (1, 0, 0) × (0, 1, 0) = (0, 0, 1)이다. 엄지를 u, 검지를 v로 펴면 중지가 u × v 쪽이다(오른손 법칙). 만나는 두 축의 공통 수선은 이 방향이거나 그 반대 방향이다.
실제 팔에서는 이렇다.
- PUMA 같은 산업용 팔은 축 1과 축 2가 만난다.
- 손목은 축 4, 5, 6이 한 점에서 만난다. 만들기 쉽고 손 방향을 자유롭게 바꿀 수 있어서다. 대신 특이점 문제가 생기는데, 7강에서 본다.
- 종이 팔은 축 1과 축 2가 나란하다.
알아 두기. 같은 팔이라도 사람마다 DH 표가 조금씩 다를 수 있다. 축의 + 방향, 나란한 축의 수선 높이, 만나는 축의 수선 방향을 고르는 방법이 여럿이기 때문이다. 고른 대로 일관되게 계산하면 손끝 위치는 모두 같게 나온다. 스탠퍼드 숙제 풀이에도 "다른 답도 맞다"고 적혀 있다.
영상에서 보기: 13:41 나란한 축과 만나는 축 · 14:12 만나는 축의 공통 수선 · 49:18 x 방향이 α의 부호를 정한다
4.4 링크 잇기 = 숫자 두 개: 오프셋 d와 관절 각 θ
a와 α는 링크 하나를 적는다. 이제 링크와 다음 링크가 어떻게 이어지는지 적는다.
축 i에는 공통 수선 두 개가 닿는다. 하나는 뒤에서 오는 ai−1(축 i−1 → 축 i)이고, 다른 하나는 앞으로 가는 ai(축 i → 축 i+1)다.
두 수선은 축 i 위의 서로 다른 점에 닿고, 서로 다른 방향을 본다. 이 어긋남이 숫자 두 개다.
- 링크 오프셋(link offset) di: 축 i를 따라 잰, 두 수선이 닿는 점 사이의 거리.
- 관절 각(joint angle) θi: 축 i를 중심으로 잰, ai−1 방향에서 ai 방향까지 돈 각. 오른손 엄지를 축 i의 + 방향으로 세우고 부호를 정한다.
관절 i가 회전 관절이면, 관절이 돌 때 ai가 축 i를 중심으로 함께 돈다. 그래서 θi가 바뀌고 di는 그대로다. 직동 관절이면 ai가 축 i를 따라 미끄러져서 di가 바뀐다.
잠깐, 생각해 보기. 그림 4-4에서 θ 슬라이더만 움직이면 축 i+1은 어떻게 되나? d 슬라이더만 움직이면?
θ만 움직이면 축 i+1이 축 i를 중심으로 빙 돈다. 앞쪽 링크 전체가 도는 회전 관절이다. d만 움직이면 앞쪽 전체가 축 i를 따라 오르내리는 직동 관절이 된다.
네 숫자 정리
| 숫자 | 이름 | 무엇을 적나 | 회전 관절 | 직동 관절 |
|---|---|---|---|---|
| ai−1 | 링크 길이 | 링크 i−1 | 고정 | 고정 |
| αi−1 | 링크 비틀림 | 링크 i−1 | 고정 | 고정 |
| di | 링크 오프셋 | 링크 i−1과 i의 이음 | 고정 | 변수 |
| θi | 관절 각 | 링크 i−1과 i의 이음 | 변수 | 고정 |
어느 관절이든 넷 중 셋은 고정이고 하나만 변수다. 이 변수를 관절 변수(joint variable)라 한다. 회전 관절이면 θi, 직동 관절이면 di다.
영상에서 보기: 15:46 다음 링크와 잇기 · 17:52 링크 오프셋 d · 18:53 관절 각 θ · 34:47 네 숫자의 두 역할
4.5 좌표계를 붙이는 네 단계
네 숫자를 변환으로 바꾸려면 링크마다 좌표계를 붙여야 한다. 좌표계 {i}는 링크 i에 붙어 함께 움직인다. 규칙은 네 단계다.
- 공통 수선을 찾는다. 축 i와 축 i+1 사이의 공통 수선 ai를 긋는다.
- 원점을 정한다. 공통 수선 ai가 축 i와 만나는 점이 {i}의 원점이다.
- z축을 정한다. zi는 관절 축 i를 따라간다.
- x축을 정한다. xi는 공통 수선 ai를 따라 축 i+1 쪽을 본다. yi는 오른손 법칙으로 저절로 정해진다.
z축을 관절 축에 맞추는 데는 이유가 있다. 관절이 돌면 링크는 z축을 중심으로 돈다. 그러면 관절 각이 곧 "z축을 중심으로 돈 각"이 되어 계산이 가장 간단해진다.
특별한 경우는 4.3절에서 고른 대로 따른다.
- 축 i와 축 i+1이 만나면: 원점은 만나는 점이다. xi는 두 축이 놓인 평면에 수직이다(두 방향 중 하나).
- 나란하면: 공통 수선의 높이를 고른다. d가 0이 되는 높이가 편하다.
- 받침 좌표계 {0}과 마지막 좌표계 {n}은 양쪽 축이 다 있지 않다. 4.6절에서 따로 정한다.
좌표계로 다시 쓰는 네 숫자
좌표계를 붙이고 나면 네 숫자를 축 이름만으로 말할 수 있다. 강의에서 교수가 "복사해서 곁에 두라"고 한 표다.
| 숫자 | 뜻 |
|---|---|
| ai | zi에서 zi+1까지의 거리, xi를 따라 잰다 |
| αi | zi에서 zi+1까지의 각, xi를 중심으로 잰다 |
| di | xi−1에서 xi까지의 거리, zi를 따라 잰다 |
| θi | xi−1에서 xi까지의 각, zi를 중심으로 잰다 |
외우는 요령은 하나다. a와 α는 z축 두 개 사이를 x로 재고, d와 θ는 x축 두 개 사이를 z로 잰다. 아래첨자도 조심한다. a와 α는 i와 i+1을, d와 θ는 i−1과 i를 본다.
잠깐, 생각해 보기. 4.1절에서 좌표계 사이의 숫자는 6개였다. 왜 4개로 줄었을까?
좌표계를 아무 데나 붙이지 않았기 때문이다. xi−1은 공통 수선이라서 (1) zi에 수직이고 (2) zi와 만난다. 이 두 조건이 숫자 두 개를 미리 정해 버려서 6 − 2 = 4개만 남는다.
알아 두기. y축은 꼭 오른손 법칙으로 정한다. 엄지 x, 검지 y, 중지 z다. y를 반대로 그리면 왼손 좌표계가 되고, 그 뒤의 변환이 모두 틀린다. 강의에서 교수가 몇 번이나 "손을 쓰라"고 하는 이유다.
영상에서 보기: 37:51 좌표계를 어떻게 붙이나 · 41:32 원점은 수선과 만나는 점 · 46:42 네 단계 요약 · 54:03 네 숫자 요약표
4.6 처음과 끝 좌표계: 0을 많이 만든다
4.5절의 규칙은 양쪽에 축이 있어야 쓸 수 있다. 관절이 n개면 축 1부터 축 n까지 있다. 그래서 a₁~an−1과 α₁~αn−1은 축들이 정해 준다.
맨 앞의 a₀, α₀와 맨 뒤의 an, αn은 축이 하나 모자라서 정해지지 않는다. d와 θ도 비슷하다. d₁, θ₁은 x₀으로, dn, θn은 xn으로 재는데, 두 x축은 아직 정해지지 않았다.
정해지지 않은 숫자는 0이 되게 고른다. 0이 아닌 각(예: 30°)이 들어가면 그만큼 cos, sin 상수를 끝까지 들고 다녀야 한다. 0이 많을수록 순기구학 식이 짧아진다.
받침 좌표계 {0}
{0}은 받침에 붙어 움직이지 않는다. 축 0은 실제로 없으니 마음대로 놓을 수 있다. 가장 간단한 선택은 관절 변수가 0일 때 {0}과 {1}이 완전히 겹치게 하는 것이다.
- z₀을 z₁과 같은 직선에 놓는다. → a₀ = 0, α₀ = 0
- 관절 1이 회전 관절이면 원점도 같은 점에 둔다. → d₁ = 0이고, θ₁ = 0일 때 x₀ = x₁
- 관절 1이 직동 관절이면 x 방향을 같게 둔다. → θ₁ = 0이고, d₁ = 0일 때 {0} = {1}
마지막 좌표계 {n}
끝에서도 같은 생각을 쓴다. 관절 변수가 0일 때 {n}이 xn−1 위에 오고, xn이 xn−1과 같은 방향이 되게 고른다.
- 관절 n이 회전 관절이면 → dn = 0
- 관절 n이 직동 관절이면 → θn = 0
an과 αn은 0으로 둔다. 축 n+1이 없으니 표의 1~n행에는 나오지도 않는다.
손 좌표계
실제로 알고 싶은 것은 {n}이 아니라 집게 끝이나 펜 끝일 때가 많다. 이때는 손 좌표계(tool frame) {H}를 하나 더 붙인다.
{n}에서 {H}까지는 링크에 고정된 변환이라 숫자가 모두 상수다. 도구를 바꾸면 이 변환만 바꾸면 된다.
받침 쪽도 마찬가지다. 책상이나 방에 기준 좌표계가 따로 필요하면 {0} 앞에 고정 변환을 하나 붙인다. 순기구학 본체는 그대로 두고, 양 끝에 상수 변환을 곱하기만 하면 된다.
영상에서 보기: 24:40 처음과 끝 링크 · 26:14 0을 많이 만들자 · 28:22 손 좌표계 · 50:52 첫 링크와 마지막 링크
4.7 종이 팔의 DH 표
이제 규칙을 종이 팔에 써 보자. 종이 팔은 책상 면을 따라 평면으로 움직인다. 어깨 축(축 1)과 팔꿈치 축(축 2)은 모두 책상 면에 수직이고, 위쪽을 + 방향으로 잡는다.
좌표계를 하나씩 붙인다.
- 좌표계 1: 축 1과 축 2가 나란하니 공통 수선은 책상 면 높이에서 링크 1을 따라 긋는다. 원점은 어깨, z₁은 위쪽, x₁은 링크 1을 따라 팔꿈치 쪽이다.
- 좌표계 2: 마지막 관절이다. 원점은 x₁이 축 2와 만나는 팔꿈치에 둔다(d₂ = 0). x₂는 링크 2를 따라 손끝 쪽이다. θ₂ = 0이면 x₂가 x₁과 같은 방향이 된다.
- 좌표계 0: 어깨에 받침과 함께 고정한다. x₀은 책상의 x 방향이다. θ₁ = 0이면 {1}과 겹친다.
- 좌표계 H: 손끝에 둔다. 방향은 {2}와 같고, x₂를 따라 8 cm 간 곳이다.
θ의 뜻도 확인하자. θ₁은 x₀에서 x₁까지, θ₂는 x₁에서 x₂까지 z축을 중심으로 잰 각이다. 1장에서 팔꿈치 각을 "링크 1을 늘인 선에서" 잰 이유가 바로 이것이다. 그렇게 재야 DH의 θ₂와 같아진다.
| i | αi−1 | ai−1 | di | θi |
|---|---|---|---|---|
| 1 | 0 | 0 | 0 | θ₁ |
| 2 | 0 | 10 cm | 0 | θ₂ |
| H | 0 | 8 cm | 0 | 0 |
- 1행: {0}과 {1}은 원점과 z축이 같다. 다른 것은 θ₁뿐이다.
- 2행: z₁에서 z₂까지 x₁을 따라 10 cm다(a₁ = 10 cm). 두 z축이 나란해서 α₁ = 0이다.
- H행: 관절이 아니라서 θ도 0으로 고정이다. 링크 2의 길이 8 cm가 여기 들어간다.
표의 θ 칸에는 숫자 대신 θ₁, θ₂를 쓴다. 움직이는 변수이기 때문이다. 특정 자세를 적고 싶으면 칸을 하나 더 만든다(4.10절).
슬라이더로 해 볼 것:
- θ₁ = 0°: {1}이 {0}과 겹친다. 받침 좌표계를 그렇게 골랐기 때문이다.
- θ₂ = 0°: x₂가 x₁을 곧게 늘인 방향이 된다.
- 어느 자세에서든 {2}와 {H}는 방향이 같다. 행렬의 왼쪽 위 2×2가 θ₁ + θ₂로만 정해지는 것을 보자.
영상에서 보기: 57:13 평면 팔 예제 · 1:00:51 받침 좌표계 고르기
4.8 링크 변환: 기본 변환 네 번
DH 표의 한 행은 {i−1}에서 {i}로 가는 변환 i−1Ti 하나가 된다. {i−1}을 네 번 움직여 {i}에 겹쳐 보자. 한 번에 축 하나만 쓴다.
- xi−1을 중심으로 αi−1만큼 돈다. z축이 축 i와 나란해진다.
- xi−1을 따라 ai−1만큼 간다. 원점이 축 i 위에 올라선다. z축이 축 i와 겹친다.
- z축(= 축 i)을 중심으로 θi만큼 돈다. x축이 xi와 나란해진다.
- z축을 따라 di만큼 간다. 원점이 {i}의 원점에 닿아 {i}와 완전히 겹친다.
그림에서 α는 축 i의 발에, θ는 {i}의 원점에 그렸다. x축을 중심으로 돌기와 x축을 따라 가기는 순서를 바꿔도 결과가 같다. z축의 두 움직임도 마찬가지다.
네 번 움직인 것을 곱으로
움직일 때마다 중간 좌표계가 하나씩 생긴다. 차례로 {R}, {Q}, {P}라 하자. 3.2절처럼 이웃끼리의 변환을 이어 곱하면 된다.
각 단계는 방금 움직인 좌표계의 축 하나로만 움직이므로, 회전만 있거나 이동만 있다. 이런 변환을 기본 변환이라 하자. R은 회전(rotation), D는 이동(displacement)이다.
3.6절의 오일러 각과 같은 이치다. 방금 움직인 새 축으로 다음 동작을 하므로, 움직인 순서대로 오른쪽에 곱해 나간다.
기본 변환은 2.6절의 기본 회전을 4×4로 키우거나, 2.8절의 동차변환에서 회전 없이 이동만 넣으면 된다. x축에 관한 둘과 z축에 관한 둘을 먼저 각각 곱한다.
이 둘을 곱하면 링크 변환이 나온다(곱하는 법은 3.2절의 "행렬 × 행렬"). c는 cos, s는 sin을 줄여 쓴 것이다.
행렬 읽기
- 1열, 2열, 3열은 {i−1}에서 본 xi, yi, zi다(2.6절: 회전행렬의 열은 돌린 축).
- 3열 (0, −sα, cα)에는 θ와 d가 없다. zi는 축 i 방향이고, 축 i는 관절이 돌아도 그대로이기 때문이다.
- 4열은 {i}의 원점이다. xi−1을 따라 a만큼 간 뒤, zi 방향 (0, −sα, cα)로 d만큼 더 간 곳이다.
α = 0이면 평면 팔의 변환이 된다. 종이 팔의 2행(α₁ = 0, a₁ = 10, d₂ = 0)을 넣으면 이렇다.
왼쪽 위는 2.5절의 평면 회전이고, 4열은 "x₁을 따라 10 cm"다. 팔꿈치는 어깨에서 링크 1을 따라 10 cm에 있고, 링크 2는 거기서 θ₂만큼 꺾인다는 뜻이다.
알아 두기: DH는 두 가지다. 이 장은 강의와 Craig 교재를 따라 수정 DH(modified DH)를 쓴다. 좌표계 {i}가 링크 i의 받침 쪽 끝(축 i)에 붙고, 변환은 RX(αi−1) DX(ai−1) RZ(θi) DZ(di)다. Spong, Siciliano 등 다른 많은 책은 고전 DH(standard DH)를 쓴다. 고전 DH는 {i}를 링크 i의 손끝 쪽 끝(축 i+1)에 붙이고, 변환을 RZ(θi) DZ(di) DX(ai) RX(αi)로 쓴다. 아래첨자와 곱하는 순서가 달라서, 한 책의 표를 다른 책의 공식에 넣으면 틀린다. 남이 만든 DH 표를 보면 어느 방식인지부터 확인한다.
영상에서 보기: 1:06:02 링크 변환 만들기 · 1:08:11 기본 변환 네 개 · 1:09:16 곱하면 끝
4.9 순기구학: 링크 변환을 차례로 곱한다
링크 변환을 모두 구했으면 받침에서 마지막 링크까지 차례로 곱한다. 3.2절의 변환 잇기 그대로다.
손 좌표계까지 가려면 끝에 상수 변환 nTH를 하나 더 곱한다. 이것이 순기구학이다. 관절 변수를 넣으면 손의 위치와 방향이 한 번에 나온다.
종이 팔 끝까지 계산하기
4.7절의 표 세 행을 4.8절의 행렬에 넣는다. 모두 α = 0이라 간단하다. c₁은 cos θ₁, s₁₂는 sin(θ₁ + θ₂)를 줄여 쓴 것이다.
앞의 두 개를 먼저 곱한다. 회전 부분에서 삼각함수의 덧셈정리가 나온다.
수학 더하기: 삼각함수 덧셈정리. cos(θ₁ + θ₂) = cos θ₁ cos θ₂ − sin θ₁ sin θ₂다. sin(θ₁ + θ₂) = sin θ₁ cos θ₂ + cos θ₁ sin θ₂다. 줄여 쓰면 c₁₂ = c₁c₂ − s₁s₂, s₁₂ = s₁c₂ + c₁s₂다. 평면에서 θ₁ 돌고 다시 θ₂ 돌면 θ₁ + θ₂ 돈 것과 같다는 뜻이다.
4열은 팔꿈치의 위치다. 여기에 손 변환을 곱한다.
4열의 위 두 칸이 1장의 손끝 공식과 똑같다. 왼쪽 위 2×2는 θ₁ + θ₂만큼 돈 회전이고, 손이 보는 방향을 말해 준다.
숫자로 확인해 보자. θ₁ = 30°, θ₂ = 45°이면 c₁ ≈ 0.866, s₁ = 0.5, c₁₂ = cos 75° ≈ 0.259, s₁₂ = sin 75° ≈ 0.966이다. x = 8.66 + 2.07 = 10.73, y = 5 + 7.73 = 12.73이다.
그림 4-6의 처음 자세가 바로 이 자세다. 슬라이더를 움직이며 행렬이 어떻게 바뀌는지 보자.
잠깐, 생각해 보기. 종이 팔의 받침을 돌리지 않고 책상 모서리에서 (20, 5) cm인 곳에 놓았다. 책상 모서리 기준으로 손끝은 어디인가?
책상 좌표계 {W}에서 {0}까지의 고정 변환을 앞에 곱해 WTH = WT0 · 0TH로 구한다. 받침이 돌지 않았으니 회전은 단위행렬이고, 위치에 (20, 5)가 더해진다. θ₁ = 30°, θ₂ = 45°이면 (30.73, 17.73) cm다.
닿는 영역
강의 중간에 6관절 팔의 손끝이 움직이며 공간을 채우는 영상이 나온다. 손끝이 닿을 수 있는 모든 곳을 닿는 영역(workspace)이라 한다. 링크 길이와, 관절이 돌 수 있는 범위(관절 한계)가 정한다.
종이 팔에서는 1장 그림의 고리(2~18 cm)가 닿는 영역이다. 2.2절의 작업 공간(operational space)과는 다른 말이다.
영상에서 보기: 1:10:17 변환을 곱해 순기구학 · 23:04 닿는 영역
4.10 강의 예제: 관절 3개 평면 팔
강의는 관절 3개짜리 평면 팔로 DH 표를 만든다. 세 관절 모두 회전 관절이고, 축은 모두 종이 면에 수직이다. 여기서는 이 교재의 3관절 팔(8 cm, 7 cm, 5 cm)로 따라가 보자.
좌표계 붙이기
- 공통 수선: 세 축이 나란하다. 종이 면 안에서 링크를 따라 긋는다. 그러면 d가 모두 0이 된다.
- 원점: 수선이 축과 만나는 점, 곧 관절 1, 2, 3의 자리다.
- z축: 모두 종이에서 나오는 쪽(⊙)이다.
- x축: x₁은 링크 1을, x₂는 링크 2를 따라간다. 마지막 x₃은 링크 3을 따라 둔다. 그러면 θ₃ = 0일 때 x₃이 x₂와 같은 방향이다.
{0}은 z₀ = z₁으로 두고, θ₁ = 0일 때 x₀ = x₁이 되게 한다. 링크 3 끝의 손에는 {4}를 따로 붙인다.
DH 표
| i | αi−1 | ai−1 | di | θi | 그림의 자세 |
|---|---|---|---|---|---|
| 1 | 0 | 0 | 0 | θ₁ | 30° |
| 2 | 0 | 8 | 0 | θ₂ | 40° |
| 3 | 0 | 7 | 0 | θ₃ | −50° |
| 4 (손) | 0 | 5 | 0 | 0 | 고정 |
마지막 칸이 강의에서 말하는 "configuration shown" 칸이다. 표 본체에는 변수 이름을 쓰고, 이 칸에만 지금의 값을 쓴다. 숙제에서 그림을 보고 이 칸을 채우라는 문제가 나온다.
잠깐, 생각해 보기. 링크 3의 길이 5 cm는 1~3행 어디에도 없다. 왜 그런가?
ai−1은 축 i−1과 축 i 사이의 거리다. 링크 3 뒤에는 축 4가 없으니 1~3행에 들어갈 자리가 없다. 손까지의 5 cm는 4행, 곧 고정된 손 변환 3T4에 들어간다(강의에서 학생이 묻는 것도 이것이다).
표를 4.8절의 행렬에 넣어 곱하면 4.9절과 같은 모양이 나온다. c₁₂₃은 cos(θ₁ + θ₂ + θ₃)이다.
그림의 자세를 넣으면 손끝은 (14.02, 12.29) cm이다. 손은 30° + 40° − 50° = 20° 방향을 본다.
다음 5강에서는 축이 비틀리고 만나는 3차원 팔(RPRR 팔, 스탠퍼드 Scheinman 팔)로 DH 표를 만든다. 이 장의 규칙을 그대로 쓰되, 4.3절의 고르기가 많이 나온다.
영상에서 보기: 57:13 관절 3개 평면 팔 · 1:01:53 DH 표 만들기 · 1:04:28 그림의 자세 칸 · 1:05:00 손끝까지는?
4.11 연습문제
종이에 축을 그리면서 푼다. 오른손을 꼭 쓴다. 답은 문제 7개 아래에 있다.
- 축 i−1은 {i−1}의 z축이고 원점을 지난다. 축 i는 점 (3, 0, 0)을 지나고 + 방향이 (0, −1, 0)이다. ai−1과 αi−1을 구하라. 축 i의 + 방향을 (0, 1, 0)으로 잡으면 αi−1은 어떻게 되나?
- 맞으면 ○, 틀리면 ×를 하고 이유를 써라.
- a는 링크의 실제 길이다.
- 두 축이 나란하고 + 방향이 같으면 α = 0이다.
- 회전 관절의 d는 늘 0이다.
- 종이 팔이 θ₁ = 90°, θ₂ = −90°일 때 0TH를 구하라. 그림 4-6으로 확인하라.
- 링크 변환에 αi−1 = 90°, ai−1 = 3 cm, di = 2 cm, θi = 90°를 넣어 i−1Ti를 구하라. {i−1}에서 본 {i}의 원점과 xi는 무엇인가? 그림 4-7로 확인하라.
- 종이 팔 손끝에 펜을 달았다. 펜은 손끝을 지나는 수직 축을 따라 오르내린다(직동 관절 3). 펜 끝 높이 d₃는 팔이 놓인 면에서 위쪽이 +다. DH 표를 쓰고 0T3을 구하라. θ₁ = 30°, θ₂ = 45°, d₃ = −2 cm이면 펜 끝은 어디인가?
- 4.10절의 3관절 팔(8, 7, 5 cm)이 θ₁ = 90°, θ₂ = −90°, θ₃ = 90°일 때 손끝 위치와 손 방향을 구하라. 종이에 그려서도 확인하라.
- 친구가 다른 책에서 종이 팔의 DH 표를 가져왔다. 열이 θi, di, ai, αi 순이고, 1행이 (θ₁, 0, 10, 0), 2행이 (θ₂, 0, 8, 0)이다. 이 표를 이 장의 링크 변환에 그대로 넣으면 어떻게 되나?
답
답 1. 공통 수선은 원점에서 (3, 0, 0)까지 x축 위에 있다. 그래서 ai−1 = 3이다.
엄지를 +x로 세우면 손가락은 +y → +z → −y 순으로 감긴다. z축 (0, 0, 1)이 (0, −1, 0)이 되려면 + 쪽으로 90° 돌아야 하므로 αi−1 = 90°다. RX(90°)의 셋째 열이 (0, −1, 0)인 것으로도 확인된다.
축 i의 + 방향을 (0, 1, 0)으로 잡으면 αi−1 = −90°다. 둘 다 맞고, 고른 방향을 끝까지 쓰면 된다.
답 2.
- ×. a는 두 관절 축 사이의 가장 짧은 거리다. 링크가 휘어 있으면 실제 길이와 다르다.
- ○. + 방향을 반대로 잡으면 180°가 된다.
- ×. 회전 관절의 d는 변하지 않을 뿐, 0이 아닐 수 있다. 두 공통 수선이 축 위의 다른 높이에 닿으면 d ≠ 0이다. 5강의 스탠퍼드 팔에 나오는 d₂가 그 예다.
답 3. c₁ = 0, s₁ = 1이고, θ₁ + θ₂ = 0이라 c₁₂ = 1, s₁₂ = 0이다. 위치는 x = 10 × 0 + 8 × 1 = 8, y = 10 × 1 + 8 × 0 = 10이다. 링크 1은 위로 서고, 링크 2는 직각으로 꺾여 x₀ 방향을 본다.
답 4. cos θ = 0, sin θ = 1, cos α = 0, sin α = 1을 넣는다. {i}의 원점은 4열의 (3, −2, 0)이다. xi는 1열 (0, 0, 1)이라 zi−1 방향이다.
네 단계로도 확인하자.
- x축으로 90° 비틀면 z축이 −y 쪽을 본다.
- x를 따라 3 cm 가면 원점이 (3, 0, 0)이다.
- 새 z축을 중심으로 90° 돌면 x축이 +z 쪽을 본다.
- 새 z축(−y 쪽)을 따라 2 cm 가면 원점이 (3, −2, 0)이다.
답 5. 축 3은 축 2와 나란하고 8 cm 떨어져 있다(α₂ = 0, a₂ = 8 cm). 직동 관절이라 θ₃는 0으로 고정하고(x₃ = x₂ 방향), d₃가 변수다. 이런 팔을 SCARA라 하며, 공장에서 부품을 끼울 때 많이 쓴다.
| i | αi−1 | ai−1 | di | θi |
|---|---|---|---|---|
| 1 | 0 | 0 | 0 | θ₁ |
| 2 | 0 | 10 cm | 0 | θ₂ |
| 3 | 0 | 8 cm | d₃ | 0 |
직동 관절은 4열의 셋째 칸에만 나타난다. 값을 넣으면 펜 끝은 (10.73, 12.73, −2) cm다.
답 6. 링크 1은 90° 방향이라 관절 2가 (0, 8)에 있다. 링크 2는 90° − 90° = 0° 방향이라 관절 3이 (7, 8)이다. 링크 3은 0° + 90° = 90° 방향이라 손끝이 (7, 13) cm이고, 손은 90° 방향(y₀ 쪽)을 본다.
답 7. 틀린 답이 나온다. 이 표는 고전 DH 표다(4.8절 알아 두기). 1행의 10은 고전 DH에서 a₁(축 1 → 축 2)인데, 수정 DH 공식에 넣으면 a₀으로 읽힌다. 그러면 θ₁로 돌기 전에 x₀을 따라 10 cm를 먼저 가 버린다.
θ₁ = 30°, θ₂ = 45°로 계산하면 손끝이 (16.93, 4.00) cm로 나온다. 맞는 값 (10.73, 12.73)과 전혀 다르다. 고전 DH 표는 고전 DH 공식으로 계산해야 맞는 값이 나온다(아래 파이썬).
파이썬으로 확인
파이썬(numpy)이 있으면 아래를 붙여 넣어 돌려 본다. 주석의 값이 그대로 나온다.
import numpy as np
def dh(a, alpha, d, theta):
"""수정 DH(이 장, Craig)의 링크 변환. 각은 도."""
al, th = np.radians(alpha), np.radians(theta)
ca, sa, ct, st = np.cos(al), np.sin(al), np.cos(th), np.sin(th)
return np.array([[ct, -st, 0, a],
[st * ca, ct * ca, -sa, -sa * d],
[st * sa, ct * sa, ca, ca * d],
[0, 0, 0, 1]])
def rot_x(deg):
t = np.radians(deg); c, s = np.cos(t), np.sin(t)
return np.array([[1, 0, 0, 0], [0, c, -s, 0],
[0, s, c, 0], [0, 0, 0, 1]])
def rot_z(deg):
t = np.radians(deg); c, s = np.cos(t), np.sin(t)
return np.array([[c, -s, 0, 0], [s, c, 0, 0],
[0, 0, 1, 0], [0, 0, 0, 1]])
def move(x=0, y=0, z=0):
T = np.eye(4); T[:3, 3] = [x, y, z]
return T
def fk(table):
"""DH 표(행마다 a, alpha, d, theta)를 차례로 곱한다."""
T = np.eye(4)
for row in table:
T = T @ dh(*row)
return T
def r2(v):
return np.round(v, 2) + 0.0 # + 0.0은 -0.0을 0.0으로 바꾼다
def show(T):
print(r2(T))
np.set_printoptions(precision=2, suppress=True)
# 4.8 기본 변환 네 번 = 링크 변환 (그림 4-7의 처음 값)
four = rot_x(50) @ move(x=3) @ rot_z(-40) @ move(z=2)
print(np.allclose(four, dh(3, 50, 2, -40))) # True
show(dh(3, 50, 2, -40))
# [[ 0.77 0.64 0. 3. ]
# [-0.41 0.49 -0.77 -1.53]
# [-0.49 0.59 0.64 1.29]
# [ 0. 0. 0. 1. ]]
# 4.9 종이 팔: 행마다 (a, alpha, d, theta)
def paper_arm(t1, t2):
return fk([(0, 0, 0, t1), (10, 0, 0, t2), (8, 0, 0, 0)])
show(paper_arm(30, 45))
# [[ 0.26 -0.97 0. 10.73]
# [ 0.97 0.26 0. 12.73]
# [ 0. 0. 1. 0. ]
# [ 0. 0. 0. 1. ]]
# 받침을 책상 모서리에서 (20, 5) cm에 놓았을 때
print(r2((move(20, 5) @ paper_arm(30, 45))[:3, 3])) # [30.73 17.73 0. ]
# 4.10 강의 예제: 3관절 평면 팔 (8, 7, 5 cm), 그림의 자세
def arm3(t1, t2, t3):
return fk([(0, 0, 0, t1), (8, 0, 0, t2), (7, 0, 0, t3), (5, 0, 0, 0)])
T = arm3(30, 40, -50)
print(r2(T[:3, 3]), r2(np.degrees(np.arctan2(T[1, 0], T[0, 0]))))
# [14.02 12.29 0. ] 20.0
# 문제 1: alpha = 90이면 z_i = (0, -1, 0)
print(r2(dh(3, 90, 0, 0)[:3, 2]), r2(dh(3, 90, 0, 0)[:3, 3]))
# [ 0. -1. 0.] [3. 0. 0.]
# 문제 3
show(paper_arm(90, -90))
# [[ 1. 0. 0. 8.]
# [ 0. 1. 0. 10.]
# [ 0. 0. 1. 0.]
# [ 0. 0. 0. 1.]]
# 문제 4
show(dh(3, 90, 2, 90))
# [[ 0. -1. 0. 3.]
# [ 0. 0. -1. -2.]
# [ 1. 0. 0. 0.]
# [ 0. 0. 0. 1.]]
# 문제 5: 펜 달린 종이 팔 (SCARA)
print(r2(fk([(0, 0, 0, 30), (10, 0, 0, 45), (8, 0, -2, 0)])[:3, 3]))
# [10.73 12.73 -2. ]
# 문제 6
show(arm3(90, -90, 90))
# [[ 0. -1. 0. 7.]
# [ 1. 0. 0. 13.]
# [ 0. 0. 1. 0.]
# [ 0. 0. 0. 1.]]
# 문제 7: 고전 DH 표를 수정 DH 공식에 넣으면 틀린다
def dh_classic(theta, d, a, alpha):
"""고전 DH(Spong 등): R_Z(θ) D_Z(d) D_X(a) R_X(α)."""
return rot_z(theta) @ move(z=d) @ move(x=a) @ rot_x(alpha)
wrong = dh(10, 0, 0, 30) @ dh(8, 0, 0, 45)
right = dh_classic(30, 0, 10, 0) @ dh_classic(45, 0, 8, 0)
print(r2(wrong[:3, 3]), r2(right[:3, 3]))
# [16.93 4. 0. ] [10.73 12.73 0. ]
print(np.allclose(right, paper_arm(30, 45))) # True
스탠퍼드 숙제
스탠퍼드 강의 페이지의 Homework 2에서 2번(RRP 팔: 좌표계 그리기, DH 표, 0T3)과 3번(2RP2R 팔의 DH 표)은 이 장으로 풀 수 있다. 1번은 연산자를 여러 번 겹치는 문제라 2.9절의 연산자와 3.7절(순서가 거꾸로 되는 이유)을 바탕으로 한다.
Homework 3의 3번 (a), (b)(RRR 팔의 DH 표와 0T4)도 이 장으로 풀 수 있고, 나머지는 자코비안을 배운 뒤에 푼다. 풀이는 같은 페이지의 Solution 2, 3에 있다.
숙제의 DH 표는 열 순서가 ai−1, αi−1, di, θi로 이 장과 조금 다르다. 열 순서는 자료마다 다르니 머리글을 보고 채운다.
다 풀었으면 4강 영상을 한 번 본다.