처음← 이전 장다음 장 →

12장. 운동 에너지에서 운동 방정식으로: 질량 행렬, 원심력·코리올리 힘, 중력

링크마다 운동 에너지를 적어 더하면 질량 행렬 M(q)이 나온다. M을 미분하면 원심력·코리올리 힘이, 질량 중심 높이를 미분하면 중력이 나와 종이 팔의 M q̈ + V + G = τ가 끝까지 완성된다. 강의 12강(74분)에 해당한다.

12.1 11장에서 이어서: 무엇을 구하나

11.2절에서 로봇 팔의 운동 방정식이 아래 모양이라는 것을 보았다. 관절마다 모터가 토크 τ를 내면, 관절 가속도 q̈가 이 식으로 정해진다.

라그랑주 방정식에서 출발

11.10절은 이 식을 라그랑주 방정식(Lagrange equations)으로 얻었다. 필요한 것은 운동 에너지 K와 위치 에너지 U 둘뿐이다. U는 자세 q만의 함수라서 따로 떼어 쓸 수 있다.

운동 에너지는 관절 속도로 K = ½ q̇ᵀ M(q) q̇라고 쓸 수 있다. 그래서 M을 운동 에너지 행렬이라고도 한다. 이것을 넣으면 앞의 두 항이 M q̈ + V가 되고, 셋째 항이 G가 된다.

오늘의 순서: M → V → G

V의 식에는 M과 q̇만 들어 있다. 그러니 M만 구하면 V는 미분으로 따라 나온다. 11.10절 끝에서 예고한 대로, 이 장은 M을 직접 구하는 데서 시작한다.

  1. 링크마다 운동 에너지를 적어 더하고, 거기서 M을 꺼낸다(12.2~12.5절).
  2. M을 미분해 V를 만든다(12.6~12.8절).
  3. 질량 중심의 높이로 G를 만든다(12.9절). 교수는 "G는 식은 죽 먹기"라고 한다.

V의 식에서 바로 보이는 것이 있다. 팔이 멈춰 있으면(q̇ = 0) 모든 항에 0이 곱해지고, M이 일정하면 Ṁ과 ∂M/∂q가 0이다. 그러니 원심력·코리올리 힘은 팔이 움직이는 중이고, 자세에 따라 M이 바뀔 때만 생긴다.

영상에서 보기: 05:34 라그랑주 방정식 다시 보기 · 07:37 K = ½ q̇ᵀMq̇ · 09:41 M을 찾으면 V, 그다음 G

12.2 링크 하나의 운동 에너지

M은 운동 에너지 안에 숨어 있다. 그러니 링크 하나의 운동 에너지부터 정확히 적는다. 교수는 "운동 에너지를 이해하면 동역학을 다 가진 것이고, 나머지는 수학일 뿐"이라고 강조한다.

점 하나: ½ m v²

운동 에너지(kinetic energy)는 멈춰 있던 물체를 지금 속도까지 끌어올리는 데 바깥 힘이 한 일이다. 질량 m인 점이 빠르기 v로 움직이면 ½ m v²이다. 속도가 화살표 v로 주어지면 v² 대신 vᵀv를 쓴다.

수학 더하기: vᵀv. 세로 벡터 v = (v₁, v₂, v₃)의 전치 vᵀ는 가로로 눕힌 것이다. vᵀv = v₁² + v₂² + v₃²로, 길이의 제곱이다.

가운데에 행렬을 끼운 q̇ᵀ M q̇도 결과는 숫자 하나다(11.2절). 이런 꼴을 이차 형식(quadratic form)이라 한다.

링크: 미끄러지기 + 제자리 돌기

링크는 점이 아니다. 링크가 돌면 링크 위의 점마다 속도가 다르다. 그래도 운동 에너지는 두 몫으로 깔끔하게 나뉜다.

앞의 몫은 링크 전체가 질량 중심 속도로 미끄러지는 몫이다. 뒤의 몫은 질량 중심을 축으로 제자리에서 도는 몫이다.

링크의 움직임 = 통째로 미끄러지기 + 질량 중심 둘레로 돌기
링크 2(15 g, 8 cm)가 한쪽 끝을 축으로 2 rad/s로 돌 때다. 화살표와 그 위 숫자는 그 점의 속도(cm/s), 맨 아래 숫자는 운동 에너지(g·cm²/s²)다.
그림 12-1 · 끝을 축으로 도는 링크의 운동 에너지 나누기

그림의 링크는 왼쪽 끝을 축으로 돈다. 왼쪽 끝은 멈춰 있고 오른쪽 끝이 가장 빠르다. 이 속도 분포는 ①과 ②를 점마다 더한 것과 같다.

손끝에 매단 작은 추처럼 크기가 없는 점이라면 ② 몫은 0이다. 제자리에서 돌아도 아무것도 움직이지 않아서 Ic = 0이고, ½ m vcᵀvc만 남는다. 1장 그림 1-5는 링크 무게를 가운데 한 점에 모아서 이 몫만 셌다.

알아 두기. 꼭 질량 중심을 기준으로 나누어야 한다. 다른 점을 기준으로 잡으면 미끄러지기와 돌기가 섞인 항이 하나 더 생긴다.

평면 팔에서는 ω가 책상 면에 수직인 z 방향뿐이다. 그래서 ωᵀIcω = Izzωz²로, 관성 텐서의 한 칸만 쓴다.

영상에서 보기: 11:45 운동 에너지란 · 12:48 멈춘 상태에서 v까지 한 일 · 13:51 도는 몸의 운동 에너지 · 15:24 두 몫을 더한다

12.3 팔 전체: 운동 에너지에서 M 꺼내기

같은 에너지를 두 가지로 적는다

팔 전체의 운동 에너지는 링크마다의 Ki를 더한 것이다. 이때는 관절이 어떻게 이어졌는지 생각하지 않아도 된다. 링크를 하나씩 보며 더하기만 한다.

한편 같은 에너지를 관절 속도로 적으면 K = ½ q̇ᵀ M q̇다. 두 식은 같은 값이다. 그러니 위의 합을 "½ q̇ᵀ (무엇) q̇" 꼴로 고쳐 쓰면, 그 (무엇)이 M이다.

질량 중심의 자코비안

고쳐 쓰려면 vci와 ωi를 q̇로 적어야 한다. 6~7장의 자코비안이 바로 그 일을 한다. 다만 이번에는 손끝이 아니라 링크 i의 질량 중심에서 잰 자코비안이다.

0 열을 붙여 열 수를 n개로 맞춘다. 그래야 길이 n인 q̇를 곱할 수 있다. ε̄i는 7장의 표시로, 회전 관절이면 1, 직동 관절이면 0이다.

잠깐, 생각해 보기. Jvi의 i + 1번째 열부터는 왜 0인가?

관절 i + 1부터는 링크 i보다 바깥에 있다. 바깥 관절이 돌면 그 뒤의 링크만 움직이고 링크 i는 그대로다. 종이 팔에서 팔꿈치를 돌려도 링크 1의 질량 중심은 꼼짝하지 않는다.

넣고 묶으면 M이 나온다

vci = Jvi q̇를 넣으면 vciᵀvci = q̇ᵀ Jviᵀ Jvi q̇다. 각속도 쪽도 똑같이 바뀐다.

수학 더하기: 곱의 전치. (A x)ᵀ = xᵀ Aᵀ다. 곱을 전치하면 순서가 뒤집히고 각각 전치된다. 그래서 (J q̇)ᵀ(J q̇) = q̇ᵀ Jᵀ J q̇가 되고, 가운데 Jᵀ J는 정사각 행렬이다.

q̇는 링크 번호 i와 상관없으니 합 바깥으로 꺼낸다.

대괄호 안이 바로 M이다.

교수는 이 식을 보이며 "정말 놀랍다"고 한다. 질량 행렬은 질량 중심 자코비안의 Jᵀ J에 질량과 관성을 곱해 더한 것뿐이다. 링크마다 자기 몫을 따로 계산해 더하면 된다.

링크마다 자기 몫을 M에 더한다
c₁은 어깨만 움직이므로 링크 1은 왼쪽 위 칸에만 보탠다. c₂는 두 관절이 다 움직이므로 링크 2는 네 칸 모두에 보탠다. 단위는 g·cm²다.
그림 12-2 · 종이 팔(θ₁ = 30°, θ₂ = 60°)에서 링크가 M에 보태는 몫

알아 두기. Jωi와 Ici는 같은 좌표계의 숫자여야 한다. Jωi를 받침 {0}의 숫자로 적었다면 Ici도 {0}의 방향으로 돌린 R Ici Rᵀ를 쓴다(11.6절). 평면 팔은 z축으로만 돌아서 Izz가 그대로이니 걱정하지 않아도 된다.

영상에서 보기: 16:27 운동 에너지를 다 더한다 · 19:04 무엇이 필요한가: 자코비안 · 25:46 M이 보인다 · 28:25 질량 중심 자코비안의 정의

12.4 종이 팔의 질량 행렬

이제 종이 팔로 직접 계산한다. 링크는 1장의 예시 무게 그대로인, 고르게 생긴 종이 막대다. 손에 든 물건은 연습문제 3에서 더한다.

링크 1 링크 2
길이 l₁ = 10 cm l₂ = 8 cm
질량 m₁ = 20 g m₂ = 15 g
질량 중심까지 (가운데) lc1 = 5 cm lc2 = 4 cm
질량 중심 둘레 관성 m l²/12 (11.4절) I₁ = 166.7 g·cm² I₂ = 80 g·cm²

① 질량 중심 위치

7장처럼 s₁ = sin θ₁, c₁₂ = cos(θ₁ + θ₂)로 줄여 쓴다.

② 질량 중심 자코비안

θ₁, θ₂로 편미분해 열을 만든다. Jv1의 둘째 열은 0이다.

각속도는 z 성분만 있다. 링크 1은 θ̇₁로, 링크 2는 θ̇₁ + θ̇₂로 돈다. 그래서 Jω1 = [1 0], Jω2 = [1 1]이다(z 줄만 적었다).

③ 곱해서 더하기

Jv2ᵀJv2의 칸은 열끼리의 내적이다. 7장에서 본 대로 각 열은 관절에서 c₂까지의 화살표를 90° 돌린 것이다. 둘 다 돌려도 내적은 그대로라서, 화살표끼리 내적하면 된다.

네 몫을 더하면 종이 팔의 질량 행렬이다.

숫자를 넣는다. 단위는 g·cm²다.

2487은 링크 1의 몫 666.7과 링크 2의 몫 1820을 더한 것이다. 1200 = 2m₂l₁lc2, 600 = m₂l₁lc2다.

팔꿈치를 접으면 M₁₁이 cos θ₂를 따라 줄어든다
M에 θ₁은 들어 있지 않아서 θ₁은 20°로 두고 그렸다. 아래 막대는 M₁₁을 링크 1, 링크 2, 손에 든 물건의 몫으로 나눈 것이다.
그림 12-3 · 직접 접어 보기: 종이 팔의 질량 행렬

해 볼 것 세 가지:

  1. θ₂ = 0°(쭉 편 팔): M = [[3687, 920], [920, 320]]이다. M₁₁이 가장 크다.
  2. θ₂를 접어 간다. M₁₁과 M₁₂는 cos θ₂를 따라 줄고, M₂₂는 320에서 움직이지 않는다. θ₂가 122°를 넘으면 M₁₂가 음수가 된다.
  3. 물건을 50 g으로 올린다. 편 팔의 M₁₁이 3687에서 19887로 5배 넘게 커진다. 어깨에서 먼 무게는 거리의 제곱으로 크게 보인다.

50 g을 든 편 팔의 M = [[19887, 8120], [8120, 3520]]은 11.9절에서 뉴턴-오일러로 한 열씩 채운 값과 같다. 두 방법이 같은 M을 준다.

1.4절의 "어깨가 가벼워진다"는 M₁₁이었다

1.4절에서 팔꿈치를 접으면 어깨가 돌리기 쉬워진다고 했다. 그때 막대로 보인 "어깨가 느끼는 무거움"이 바로 M₁₁이다. M₁₁ 안의 2m₂l₁lc2 cos θ₂가 접을수록 작아져서 어깨가 가벼워진다.

그림 1-5는 링크 무게를 가운데 한 점에 모으고(I = 0), 손에 50 g을 들린 M₁₁이었다. 이 장의 막대 모형으로 다시 계산해도 150°로 접으면 편 팔의 14%쯤으로 준다(연습문제 3).

잠깐, 생각해 보기. M에는 θ₁이 하나도 들어 있지 않다. 왜 그럴까?

어깨를 돌리면 팔 전체가 모양 그대로 돈다. 어깨에서 본 무게의 배치가 변하지 않으니 돌리기 어려운 정도도 같다. 그래서 M은 팔 모양을 정하는 θ₂만의 함수다.

영상에서 보기: 26:49 링크마다 몫을 더한다 · 32:39 자세를 바꾸면 M₁₁이 바뀐다 · 1:04:34 질량의 몫은 거리의 제곱

12.5 질량 행렬을 읽는 법

M의 칸마다 몸으로 느낄 수 있는 뜻이 있다. 강의는 교수의 팔을 예로 칸을 하나씩 읽는다.

대각 칸은 혼자 돌릴 때의 관성, 비대각 칸은 서로 끌려가는 정도
자물쇠는 그 관절을 얼려 둔다는 뜻이다. 점선은 조금 움직인 뒤의 모습이다.
그림 12-4 · 질량 행렬의 칸 읽기

대각 칸: 다른 관절을 얼리고 돌릴 때의 관성

(가) 팔꿈치를 얼리면 팔은 막대 하나다. 책상 위에서 멈춘 팔을 어깨로 돌리기 시작하면 τ₁ = M₁₁ θ̈₁이다. 그래서 M₁₁은 팔꿈치를 얼렸을 때 어깨가 느끼는 관성, 곧 진자 하나의 관성이다.

(나) M₂₂는 어깨를 얼리고 팔꿈치만 돌릴 때의 관성이다. 팔뚝 하나가 팔꿈치를 축으로 도는 관성이라 늘 같다. 종이 팔은 M₂₂ = m₂l₂²/3 = 320이다.

일반적으로 마지막 칸 Mnn은 늘 일정하다. 앞쪽 칸 Mii는 자기보다 바깥 관절 qi+1, …, qn에만 달렸다. M₁₁은 θ₁에 달리지 않고, M 전체가 q₁과 상관없다.

잠깐, 생각해 보기. 강의에서 한 학생이 "Mnn은 마지막 관절 qn의 함수"라고 답한다. 무엇이 틀렸나?

마지막 관절을 돌려도 마지막 링크는 모양 그대로 자기 축 둘레를 돈다. 축에서 본 질량의 배치가 그대로이니 관성도 그대로다. M에 θ₁이 없는 것과 같은 까닭이다.

비대각 칸: 한 관절의 가속이 다른 관절에 걸린다

첫째 줄을 풀어 쓰면 τ₁ = M₁₁θ̈₁ + M₁₂θ̈₂ + V₁ + G₁이다. 팔꿈치만 가속해도(θ̈₂ ≠ 0) 어깨에 M₁₂θ̈₂만큼 토크가 걸린다. (다)처럼 어깨가 제자리를 지키려면 어깨 모터가 그만큼 버텨야 한다.

이렇게 관절끼리 서로 끌려가는 것이 11.2절의 얽힘(coupling)이다. M은 대칭이라 M₁₂ = M₂₁이다. 팔꿈치가 어깨를 끄는 정도와 어깨가 팔꿈치를 끄는 정도가 같다.

양의 정부호: 질량은 늘 양수

움직이는 물체의 운동 에너지는 반드시 양수다. 그러니 q̇ ≠ 0인 모든 q̇에서 q̇ᵀ M q̇ > 0이다. 11.2절에서 본 양의 정부호(positive definite)로, "질량은 양수"를 행렬로 넓힌 것이다.

수학 더하기: 2 × 2가 양의 정부호인지 보는 법. 대칭인 2 × 2 행렬은 M₁₁ > 0이고 det M = M₁₁M₂₂ − M₁₂² > 0이면 양의 정부호다. 종이 팔은 det M = 693,333 − 360,000 cos²θ₂다. cos²θ₂ ≤ 1이라 가장 작아도 333,333으로, 어느 자세에서나 양수다.

받침에 관절을 하나 더 달면

팔꿈치 관절 하나만 있는 로봇의 질량 행렬은 숫자 하나 [320]이다. 이 로봇을 어깨 관절 위에 얹으면 종이 팔이 된다. 종이 팔의 M에서 오른쪽 아래 칸은 그 320 그대로이고, 새 관절의 줄과 칸만 더해진다.

강의는 이것을 "같은 블록이 그대로 끼워진다"고 설명한다. 새로 생긴 비대각 칸이 새 관절과 원래 로봇 사이의 얽힘이다.

알아 두기. 실제 관절은 모터에 감속기를 달아 쓴다. 감속비가 N이면 모터 회전자의 관성이 N²배로 커져서 그 관절의 대각 칸에 더해진다. 감속비가 큰 팔에서는 이 몫이 링크의 관성보다 커서, M이 거의 일정한 대각 행렬처럼 보이기도 한다.

영상에서 보기: 31:02 M₁₁은 얼린 팔의 관성 · 33:40 Mₙₙ은 상수 · 39:30 비대각 칸은 얽힘 · 40:30 양의 정부호

12.6 원심력과 코리올리 힘: 몸으로 먼저 느끼기

V를 계산하기 전에 그 정체를 몸으로 느껴 보자. V에는 두 종류가 있다. 한 관절 속도의 제곱(θ̇₁², θ̇₂²)에 비례하는 원심력(centrifugal force)과, 두 관절 속도의 곱(θ̇₁θ̇₂)에 비례하는 코리올리 힘(Coriolis force)이다.

돌면 바깥으로 쏠리고, 돌면서 반지름을 바꾸면 옆으로 밀어야 한다
(가) 어깨가 θ̇₁로 돌면 팔뚝의 질량 중심 c₂가 큰 원을 그린다. (나) 도는 판 위의 구슬이 레일을 따라 바깥으로 나간다. 흐린 점은 조금 전의 구슬이다.
그림 12-5 · 원심력과 코리올리 힘의 느낌

원심력: 돌면 바깥으로 쏠린다

회전목마를 타면 몸이 바깥으로 쏠리고, 11.2절에서 교수가 돌린 마이크도 바깥으로 당겨졌다. (가)처럼 어깨가 빨리 돌면 팔뚝도 바깥으로 쏠린다. 이 쏠림은 어깨에서 c₂를 잇는 선을 따라 바깥으로 향한다.

그 결과 팔꿈치가 펴지려 한다. 팔꿈치 각을 지키려면 팔꿈치 모터가 반대로 버텨야 하고, 그 토크는 θ̇₁²에 비례한다. 쭉 편 팔(θ₂ = 0°)이면 쏠림이 팔꿈치 축을 똑바로 지나서 토크가 생기지 않는다.

코리올리 힘: 돌면서 반지름을 바꾸면

(나)의 판이 θ̇로 돌고, 구슬이 레일을 따라 바깥으로 나간다. 판 위의 점은 바깥일수록 옆으로 빨리 간다(빠르기 rθ̇). 구슬이 판을 따라가려면 레일이 구슬을 옆으로 밀어 줘야 하고, 판을 돌리는 모터가 그 몫을 낸다.

이 몫은 각운동량(angular momentum)으로 세면 간단하다. 구슬의 각운동량은 L = m r² θ̇다. θ̇를 그대로 두고 r만 바꾸면 L이 변하고, L이 변하는 빠르기만큼 토크가 든다.

마지막 등호는 θ̇가 일정하다고 놓은 것이다. 이 토크는 θ̇와 ṙ의 곱에 비례하는데, 두 관절 속도의 곱에 비례하는 코리올리 힘이 바로 이런 것이다. 12.10절의 강의 예제(돌면서 늘어나는 팔)가 정확히 이 모양이다.

잠깐, 생각해 보기. 피겨 선수가 두 팔을 펴고 돌다가 오므리면 더 빨리 돈다. 위 식으로 설명해 보라.

얼음 위에서는 몸을 돌리는 토크가 거의 없어서 L = m r² θ̇가 그대로 유지된다. 팔을 오므려 r이 줄면 θ̇가 커져야 한다.

종이 팔도 같다. 어깨가 도는 중에 팔꿈치를 접으면 어깨가 저절로 빨라지려 한다. 어깨 빠르기를 그대로 지키려면 어깨 모터가 브레이크를 걸어야 한다.

둘 다 M이 바뀌어서 생긴다

두 힘 모두 "자세가 바뀌면 관성이 바뀐다"에서 나온다. M이 일정하면 원심력도 코리올리 힘도 없다(12.1절). 종이 팔에서 팔꿈치를 접어 M₁₁이 줄어드는 것이 피겨 선수가 팔을 오므리는 것과 같다.

알아 두기. 원심력과 코리올리 힘은 함께 도는 쪽에 서서 볼 때 느끼는 힘이다. 받침에 서서 보면 "원을 그리게 하려면 안쪽으로 당겨야 한다"는 뜻일 뿐이다. 운동 방정식에서는 둘 다 "지금 속도 때문에 모터가 더 내거나 덜 내야 하는 토크"로 나타난다.

영상에서 보기: 52:01 C는 원심력, B는 코리올리 · 55:38 M이 일정하면 V도 없다 · 1:11:28 어느 관절에 원심력이 걸리나

12.7 크리스토펠 기호로 V 계산하기

이제 V를 M의 편미분으로 정리한다. 처음 보면 무서운 식이지만, 한 줄씩 풀면 같은 무늬 하나가 되풀이될 뿐이다.

한 칸씩 풀어 쓰기

V의 i번째 칸을 풀어 쓴다. mij는 M의 i행 j열 칸이다.

mij는 시간에 직접 달리지 않고 q를 거쳐 달린다. 그래서 시간 미분은 연쇄 법칙으로 쓴다.

수학 더하기: 연쇄 법칙. f가 q₁, q₂의 함수이고 q₁, q₂가 시간에 따라 변하면 df/dt = (∂f/∂q₁) q̇₁ + (∂f/∂q₂) q̇₂다. 예를 들어 M₁₁ = 2487 + 1200 cos θ₂이면 Ṁ₁₁ = −1200 sin θ₂ · θ̇₂다.

앞으로 ∂mij/∂qk를 짧게 mij,k로 쓴다. 강의는 쉼표 없이 mijk로 쓴다.

ṁij = Σk mij,k q̇k를 넣으면 두 합이 같은 모양 q̇jq̇k로 묶인다.

크리스토펠 기호

q̇jq̇k와 q̇kq̇j는 같은 값이다. 그래서 mij,k를 mij,k와 mik,j의 평균으로 바꿔 써도 합은 그대로다. 그렇게 고르게 나눈 계수를 크리스토펠 기호(Christoffel symbols)라 한다.

앞의 두 항은 ij와 ik 칸을 남은 아래첨자로 미분하고, 셋째 항은 jk 칸을 i로 미분해 뺀다. j와 k를 바꿔도 값이 같다(bijk = bikj). 19세기 수학자 크리스토펠의 이름이 붙었다.

제곱 항과 곱 항으로 나누기

j = k인 항은 속도의 제곱 q̇j²에 붙고, 이것이 원심력이다. j ≠ k인 항은 (j, k)와 (k, j)로 두 번 나와 합치면 2bijk q̇jq̇k(j < k)이고, 이것이 코리올리 힘이다.

관절 2개면 이렇게 된다.

관절이 6개면 C는 6 × 6, B는 6 × 15다. B는 옆으로 긴 행렬이다.

계산 전에 0부터 지운다

손으로 계산할 때는 0이 되는 칸이 많아서 생각보다 짧다.

biii = 0은 몸으로도 알 수 있다. 관절 i 하나만 돌면 쏠림은 관절 i의 축에서 곧장 바깥으로 향한다. 축을 지나는 힘은 그 축을 돌리지 못하니, 그 관절에는 원심력 토크가 생기지 않는다.

영상에서 보기: 44:10 V를 풀어 쓴다 · 48:52 되풀이되는 무늬 · 50:59 크리스토펠 기호 · 53:04 C와 B의 크기

12.8 종이 팔의 원심력·코리올리 힘

0이 아닌 편미분은 두 개뿐

종이 팔의 M에서 자세에 달린 칸은 M₁₁과 M₁₂이고, 둘 다 θ₂만의 함수다. 그래서 0이 아닌 편미분은 둘뿐이다. 식을 줄이려고 h = −m₂l₁lc2 sin θ₂로 쓴다.

b를 하나씩

0인 편미분을 지우면서 여섯 개를 구한다(b₁₂₁ = b₁₁₂, b₂₂₁ = b₂₁₂).

단위는 g·cm²/s²다. 10,000 g·cm²/s²가 1 mN·m(1000분의 1 N·m)다.

읽어 보기

속도만 있어도 모터가 더 내야 할 토크가 생긴다
가속도가 0이라 할 때, 지금 빠르기를 그대로 지키려고 모터가 더 내야 하는 토크다. 둥근 화살표는 그 방향(시계 반대가 +)이고 길이는 크기를 나타낸다. 회색 점선 화살표는 관절이 도는 방향이다.
그림 12-6 · 직접 돌려 보기: 종이 팔의 V (책상 위, 중력 없음)

해 볼 것 네 가지:

  1. θ̇₂ = 0으로 두고 θ̇₁만 올린다. V₁ = 0이고 V₂만 생긴다. θ̇₁을 2배로 하면 V₂는 4배다.
  2. θ̇₁ = 0으로 두고 θ̇₂만 올린다. 이번에는 V₂ = 0이고 어깨에만 원심력 몫이 생긴다.
  3. θ̇₁과 θ̇₂를 같은 쪽으로 같은 빠르기로 돌린다. 어깨의 코리올리 몫이 원심력 몫의 두 배다. θ̇₂의 방향을 바꾸면 코리올리 몫의 부호가 바뀐다.
  4. θ₂ = 0°(쭉 편 팔)나 180°로 가면 모두 0이다. sin θ₂ = 0이기 때문이다.

잠깐, 생각해 보기. 쭉 편 팔에서는 어깨를 아무리 빨리 돌려도 V₂ = 0이다. 그래도 팔꿈치 관절에는 힘이 걸리지 않나?

걸린다. 팔뚝을 원 위에 붙잡아 두려면 팔꿈치가 팔뚝을 어깨 쪽으로 당겨야 한다. 그런데 그 힘은 팔 방향이라 팔꿈치 축을 똑바로 지나서, 축받이가 버틸 뿐 팔꿈치 모터가 낼 토크는 없다.

알아 두기. 취미용 서보는 빨라야 1초에 10 rad(약 600°)쯤 돈다. 그 빠르기면 종이 팔의 V도 10 mN·m을 넘어, 12.9절의 중력(최대 30 mN·m)과 견줄 만하다. 천천히 움직이면 V는 속도의 제곱으로 빠르게 작아진다.

영상에서 보기: 1:08:50 b를 계산하자 · 1:09:23 0이 되는 칸이 많다 · 1:10:25 m₁₁₂만 남는다

12.9 중력 벡터 G

책상 위에서는 G = 0

종이 팔이 책상 위에 누워 있으면 관절 축은 모두 위를 본다. 무게는 아래로 당기니 관절 축과 나란하다. 축과 나란한 힘은 그 축을 돌리지 못하므로 G = 0이다.

중력을 보려면 종이 팔을 벽에 세운다. 받침을 벽에 붙여 팔이 세로 면에서 움직이게 한다. x는 수평, y는 위쪽이고, 중력 가속도 g = 980 cm/s²(9.8 m/s²)는 −y 쪽을 향한다.

위치 에너지를 미분한다

링크 i의 위치 에너지(potential energy)는 질량 중심 높이 yci로 Ui = mi g yci다. 다 더한 U를 관절 각도로 편미분하면 G다.

종이 팔은 yc1 = lc1s₁, yc2 = l₁s₁ + lc2s₁₂다. θ₁, θ₂로 미분한다.

숫자를 넣으면 (m₁lc1 + m₂l₁)g = 250 × 980 = 245,000, m₂lc2g = 60 × 980 = 58,800 g·cm²/s²다. 10,000으로 나누어 mN·m로 쓴다.

같은 답을 Jᵀ F로

교수는 더 쉬운 그림을 권한다. 질량 중심마다 무게 mig가 매달려 아래로 당긴다고 보는 것이다. 손끝에 건 힘 F가 τ = Jᵀ F로 관절 토크가 되었듯이(8.8절), 질량 중심에 건 힘에는 질량 중심 자코비안을 쓴다.

앞의 빼기는 "무게가 거는 토크를 모터가 거꾸로 받친다"는 뜻이다. Jv1, Jv2는 12.4절에서 이미 구했으니 곱하기만 하면 된다. 위치 에너지를 미분하는 것과 같은 일인데, ∂yci/∂qj가 바로 Jvi의 y 줄 j번째 칸이기 때문이다.

질량 중심까지의 수평 거리가 중력 토크를 정한다
팔을 멈춰 두려고 모터가 내야 하는 토크다(시계 반대가 +). 점선은 무게가 걸리는 세로선이고, 관절에서 그 선까지의 수평 거리가 지렛대 길이다.
그림 12-7 · 직접 움직여 보기: 벽에 세운 종이 팔의 G

해 볼 것:

  1. θ₁ = 0°, θ₂ = 0°: 팔을 수평으로 편다. G₁ = 24.5 + 5.9 ≈ 30.4 mN·m로 가장 크다.
  2. θ₁ = 90°, θ₂ = 0°: 팔을 똑바로 세운다. 무게가 모두 관절 위를 지나 G = 0이다.
  3. θ₁ = 90°에서 θ₂만 움직인다. 팔꿈치가 꺾이면 G₂가 생기고, 같은 무게가 어깨에도 걸린다.

잠깐, 생각해 보기. 해 볼 것 2에서 G = 0이면 모터를 꺼도 되나?

이론으로는 그대로 서 있다. 하지만 조금만 기울어도 무게가 한쪽으로 쏠려 쓰러지는, 거꾸로 세운 연필 같은 불안정한 자세다. 아래로 늘어뜨린 자세(θ₁ = −90°)도 G = 0이지만, 이쪽은 밀어도 돌아오는 안정한 자세다.

알아 두기. 서보 설명서는 토크를 kg·cm로 적는다. 1 kg·cm(1 kg 추를 1 cm 팔로 드는 토크)는 약 98 mN·m다.

벽에 세운 종이 팔은 어깨에 최대 30 mN·m, 약 0.3 kg·cm가 든다. 손에 50 g을 들고 수평으로 펴면 119 mN·m, 약 1.2 kg·cm로 커진다(연습문제 5).

영상에서 보기: 56:09 중력은 높이에서 · 57:12 기울기를 구하면 자코비안 · 57:43 무게를 τ = Jᵀ F로 · 1:12:29 중력 방향 조심

12.10 다 모으기: M q̈ + V + G = τ

벽에 세운 종이 팔의 운동 방정식

12.4, 12.8, 12.9절을 모으면 운동 방정식이 완성된다. 단위는 모두 g·cm²/s²이고, 10,000으로 나누면 mN·m다.

줄마다 앞의 두 항이 M q̈, 가운데가 V, 끝이 G다. 책상 위에 눕히면 G 항만 빠진다.

이 식을 어디에 쓰나

같은 식을 두 방향으로 쓴다.

  1. 시뮬레이션: τ를 주면 q̈ = M⁻¹(τ − V − G)로 가속도를 구한다. 이것을 조금씩 적분하면 팔이 어떻게 움직일지 컴퓨터로 미리 볼 수 있다.
  2. 제어: 원하는 가속도 q̈를 정하면 τ를 바로 계산한다. 13강부터 배우는 제어가 이 식을 쓴다.

한 순간 계산해 보기

벽에 세운 종이 팔이 θ = (0°, 90°)에 있다. 어깨는 θ̇₁ = 3 rad/s로 돌면서 θ̈₁ = 10 rad/s²로 빨라지고, 팔꿈치는 각을 지킨다(θ̇₂ = θ̈₂ = 0). 이때 모터 토크를 항별로 나누면 이렇다(단위 mN·m).

M q̈ V G τ
어깨 2.49 0 24.50 26.99
팔꿈치 0.32 0.54 0 0.86

가볍고 느린 종이 팔은 중력이 대부분이다. 팔꿈치는 각을 지키기만 하는데도 얽힘 몫(M₂₁θ̈₁ = 0.32)과 원심력 몫(0.54)을 내야 한다.

강의 예제: 돌면서 늘어나는 팔

강의는 회전 관절 하나와 직동 관절 하나로 된 팔(RP 팔)로 같은 과정을 끝까지 해 본다. 세로 면에서 움직이고, 중력은 −y 쪽이다.

돌면서 늘어나는 팔: 직동 관절은 원심력, 회전 관절은 코리올리 힘
링크 1의 질량 중심은 축에서 l₁, 링크 2의 질량 중심은 d₂에 있다. d₂가 직동 관절 변수다. 링크 2가 링크 1 속으로 미끄러져 드나든다.
그림 12-8 · 강의 예제: 회전 + 직동 팔

Jv2의 두 열이 서로 수직이라 비대각 칸이 0이다. 돌리는 방향과 늘이는 방향이 수직이기 때문이다. M₂₂ = m₂는 늘이는 쪽에서 본 질량 그대로라 늘 같다.

자세에 달린 칸은 M₁₁ 하나이고 d₂에만 달렸다. m₁₁,₂ = 2m₂d₂만 남아서 b₁₁₂ = m₂d₂, b₂₁₁ = −m₂d₂다.

영상에서 보기: 59:16 강의 예제: 회전 + 직동 팔 · 1:02:27 질량 중심 위치부터 · 1:06:12 비대각이 0인 M · 1:13:02 완성된 모델

12.11 연습문제

종이 팔의 숫자(12.4절 표)를 쓴다. 답은 문제 8개 아래에 있다.

  1. 링크 1(20 g, 10 cm 막대)이 한쪽 끝을 축으로 3 rad/s로 돈다. ½ m vc²와 ½ Icω²를 각각 구하라. 합이 ½(m l²/3)ω²와 같은지 확인하라.
  2. 종이 팔이 θ₂ = 90°에 있다.
    1. M을 구하라.
    2. θ̇ = (1, −1) rad/s일 때 운동 에너지 K를 구하라.
    3. det M을 구해 양의 정부호인지 확인하라.
  3. 손끝에 50 g짜리 작은 물건(크기 없는 점)을 단다.
    1. 물건이 M에 보태는 몫을 손끝 자코비안 J로 적어라.
    2. M₁₁을 θ₂ = 0°와 150°에서 구하고, 150°는 0°의 몇 %인지 구하라.
    3. 1장 그림 1-5의 값(편 팔 19,640, 접은 팔 13%)과 무엇이 다른가?
  4. 종이 팔의 크리스토펠 기호 bijk 여덟 개 가운데 0이 아닌 것을 모두 적어라. θ₂ = 90°에서 θ̇ = (4, 0)일 때와 (4, 4)일 때 V를 mN·m로 구하라.
  5. 벽에 세운 종이 팔의 G를 mN·m로 구하라.
    1. θ = (0°, 0°)
    2. θ = (90°, 0°)
    3. θ = (0°, 90°)
    4. θ = (0°, 0°)에서 손끝에 50 g을 들 때
  6. 강의 예제의 RP 팔에서 m₂ = 2 kg, d₂ = 0.5 m다. θ̇₁ = 1 rad/s, ḋ₂ = 0.2 m/s일 때 V를 구하라. 각 관절이 무엇을 느끼는지 말하라.
  7. 벽에 세운 종이 팔이 θ = (30°, 60°)에 멈춰 있다(θ̇ = 0). 여기서 팔꿈치만 θ̈ = (0, 20) rad/s²로 가속하려 한다. τ를 mN·m로 구하라. 어깨 토크 가운데 얽힘 몫은 얼마인가?
  8. 관절이 6개인 팔이 있다.
    1. C와 B의 크기는?
    2. b₃₃₃은?
    3. M₆₆은 어느 관절 변수에 달렸나?
    4. M₁₁은 어느 관절 변수에 달렸나?

답

답 1.

답 2.

  1. cos 90° = 0을 넣는다. M = [[2486.7, 320], [320, 320]] g·cm²다.
  2. K = ½(M₁₁q̇₁² + 2M₁₂q̇₁q̇₂ + M₂₂q̇₂²) = ½(2486.7 − 640 + 320) = 1083.3 g·cm²/s²다.
  3. det M = 2486.7 × 320 − 320² = 693,333이다. M₁₁ > 0이고 det > 0이라 양의 정부호다. 12.5절의 식과도 맞는다.

답 3.

  1. 크기 없는 점이라 회전 몫은 없고 mp Jᵀ J만 더해진다. 7장대로 J의 열은 어깨→손끝, 팔꿈치→손끝 화살표를 90° 돌린 것이다. 그래서 Jᵀ J = [[164 + 160c₂, 64 + 80c₂], [64 + 80c₂, 64]]이다.
  2. 물건의 몫은 M₁₁에 50(164 + 160c₂)이 더해져 M₁₁ = 10,686.7 + 9200 cos θ₂다. 0°에서 19,886.7, 150°에서 2719.2다. 비율은 13.7%다.
  3. 그림 1-5는 링크를 점으로 보아(I = 0) 19,640과 2472.6(12.6%)이었다. 차이는 어느 자세에서나 I₁ + I₂ = 246.7이다. 링크가 제자리에서 도는 몫만큼 다르다.

답 4. 0이 아닌 것은 b₁₁₂ = b₁₂₁ = h, b₁₂₂ = h, b₂₁₁ = −h다. 나머지 b₁₁₁, b₂₁₂ = b₂₂₁, b₂₂₂는 0이다. θ₂ = 90°이면 h = −600이다.

답 5.

  1. c₁ = c₁₂ = 1이다. G = (24.5 + 5.9, 5.9) = (30.4, 5.9)다.
  2. c₁ = cos 90° = 0, c₁₂ = cos 90° = 0이다. G = (0, 0)이다.
  3. c₁ = 1, c₁₂ = cos 90° = 0이다. G = (24.5, 0)이다.
  4. 물건은 −Jᵀ mp𝐠를 더한다(J는 손끝 자코비안). 수평으로 편 팔이라 50 × 980 × 18 = 882,000이 어깨에, 50 × 980 × 8 = 392,000이 팔꿈치에 더해진다. G = (118.6, 45.1)이다.

답 6. V₁ = 2m₂d₂θ̇₁ḋ₂ = 2 × 2 × 0.5 × 1 × 0.2 = 0.4 N·m, V₂ = −m₂d₂θ̇₁² = −2 × 0.5 × 1 = −1.0 N이다.

답 7. θ₂ = 60°에서 M = [[3086.7, 620], [620, 320]]이다. 멈춰 있으니 V = 0이다. G는 c₁ = cos 30° = 0.866, c₁₂ = cos 90° = 0으로 (21.22, 0)이다.

M q̈ = (620 × 20, 320 × 20) = (12,400, 6400) g·cm²/s²이고, 1만으로 나누면 (1.24, 0.64) mN·m다. 그래서 τ = (22.46, 0.64) mN·m다. 어깨의 얽힘 몫은 M₁₂θ̈₂ = 1.24 mN·m로, 팔꿈치만 움직이려 해도 어깨가 이만큼 버텨야 한다.

답 8.

  1. C는 6 × 6, B는 6 × 15다(6 × 5/2 = 15).
  2. 0이다. biii = ½ mii,i이고 Mii는 qi에 달리지 않는다.
  3. 어느 변수에도 달리지 않는다. 마지막 링크 하나가 자기 축으로 도는 관성이라 늘 같다.
  4. q₂, …, q₆에 달렸다. q₁에는 달리지 않는다.

파이썬으로 확인

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

질량 중심 자코비안으로 M을 만들어 닫힌 꼴과 맞춰 보고, 크리스토펠 기호는 M을 수치로 미분해 구한다. 마지막에는 토크 0으로 팔을 2초 굴려 운동 에너지가 그대로인지 본다. M이나 V가 틀렸다면 에너지가 새어 나간다.

import numpy as np

np.set_printoptions(precision=2, suppress=True)
D = np.pi / 180
m1, m2, l1, l2 = 20.0, 15.0, 10.0, 8.0          # g, cm
lc1, lc2 = l1 / 2, l2 / 2                        # 질량 중심은 가운데
I1, I2 = m1 * l1**2 / 12, m2 * l2**2 / 12        # 막대의 z축 관성 (g·cm²)
g = 980.0                                        # cm/s² (9.8 m/s²)
TO_mNm = 1e-4                                    # g·cm²/s² → mN·m

def com_jacobians(q):
    """질량 중심 자코비안 J_v1, J_v2 (2 × 2)와 J_w1, J_w2 (z 줄만, 1 × 2)."""
    t1, t2 = q
    s1, c1, s12, c12 = np.sin(t1), np.cos(t1), np.sin(t1 + t2), np.cos(t1 + t2)
    Jv1 = np.array([[-lc1 * s1, 0], [lc1 * c1, 0]])
    Jv2 = np.array([[-l1 * s1 - lc2 * s12, -lc2 * s12], [l1 * c1 + lc2 * c12, lc2 * c12]])
    return Jv1, Jv2, np.array([[1.0, 0]]), np.array([[1.0, 1]])

def tip_jacobian(q):
    t1, t2 = q
    return np.array([[-l1 * np.sin(t1) - l2 * np.sin(t1 + t2), -l2 * np.sin(t1 + t2)],
                     [l1 * np.cos(t1) + l2 * np.cos(t1 + t2), l2 * np.cos(t1 + t2)]])

def mass_matrix(q, mp=0.0):
    """M = Σ (m J_vᵀ J_v + J_wᵀ I J_w). mp는 손끝에 단 점 질량(g)."""
    Jv1, Jv2, Jw1, Jw2 = com_jacobians(q)
    M = m1 * Jv1.T @ Jv1 + I1 * Jw1.T @ Jw1 + m2 * Jv2.T @ Jv2 + I2 * Jw2.T @ Jw2
    J = tip_jacobian(q)
    return M + mp * J.T @ J

def mass_closed(t2):
    """12.4절의 닫힌 꼴."""
    c = np.cos(t2)
    a = m1 * lc1**2 + I1 + m2 * (l1**2 + lc2**2 + 2 * l1 * lc2 * c) + I2
    b = m2 * (lc2**2 + l1 * lc2 * c) + I2
    return np.array([[a, b], [b, m2 * lc2**2 + I2]])

def christoffel(q, eps=1e-6):
    """b[i, j, k] = ½(m_ij,k + m_ik,j − m_jk,i). 편미분은 수치로 구한다."""
    dM = np.array([(mass_matrix(q + eps * e) - mass_matrix(q - eps * e)) / (2 * eps)
                   for e in np.eye(2)])               # dM[k, i, j] = m_ij,k
    return 0.5 * (np.einsum('kij->ijk', dM) + np.einsum('jik->ijk', dM) - dM)

def V_vec(q, qd):
    return np.einsum('ijk,j,k->i', christoffel(q), qd, qd)

def G_vec(q, mp=0.0):
    """벽에 세운 팔: G = −Σ J_viᵀ m_i g, g = (0, −980)."""
    Jv1, Jv2, _, _ = com_jacobians(q)
    gv = np.array([0, -g])
    return -(Jv1.T @ (m1 * gv) + Jv2.T @ (m2 * gv) + tip_jacobian(q).T @ (mp * gv))

def U(q):
    t1, t2 = q
    return m1 * g * lc1 * np.sin(t1) + m2 * g * (l1 * np.sin(t1) + lc2 * np.sin(t1 + t2))

# 12.4: 자코비안으로 만든 M = 닫힌 꼴, θ1과 상관없다
print(mass_matrix(np.array([30, 60]) * D))       # [[3086.67  620.  ] [ 620.    320.  ]]
print(all(np.allclose(mass_matrix(np.array([t1, t2]) * D), mass_closed(t2 * D))
          for t1 in (0, 40, -110) for t2 in (0, 60, 150)))       # True
# 12.5: det M = 693,333 − 360,000 cos²θ2
print([round(np.linalg.det(mass_closed(t * D))) for t in (0, 90, 180)])   # [333333, 693333, 333333]
# 문제 2: θ2 = 90°, θ̇ = (1, −1)
M90, w = mass_closed(90 * D), np.array([1, -1])
print(M90, round(0.5 * w @ M90 @ w, 1))          # [[2486.67  320.  ] [ 320.    320.  ]] 1083.3
# 문제 3: 손끝에 50 g
a, b = (mass_matrix(np.array([20, t]) * D, 50)[0, 0] for t in (0, 150))
print(round(a, 1), round(b, 1), round(b / a * 100, 1))           # 19886.7 2719.2 13.7
# 12.8, 문제 4: 수치로 구한 b. θ2 = 90°이면 h = −600
q = np.array([20, 90]) * D
print(christoffel(q).round(3) + 0.0)             # b[0] = [[0 -600] [-600 -600]], b[1] = [[600 0] [0 0]]
print(V_vec(q, np.array([4.0, 0])) * TO_mNm)     # [0.   0.96]
print(V_vec(q, np.array([4.0, 4])) * TO_mNm)     # [-2.88  0.96]
# V = Ṁq̇ − ½(q̇ᵀ ∂M/∂q_i q̇) 와도 같다 (아무 자세·속도에서)
q, qd, eps = np.array([0.3, 1.1]), np.array([2.0, -1.5]), 1e-6
Mdot = (mass_matrix(q + eps * qd) - mass_matrix(q - eps * qd)) / (2 * eps)
dM = [(mass_matrix(q + eps * e) - mass_matrix(q - eps * e)) / (2 * eps) for e in np.eye(2)]
print(np.allclose(V_vec(q, qd), Mdot @ qd - 0.5 * np.array([qd @ d @ qd for d in dM])))   # True
# 12.9, 문제 5: 중력 (mN·m)
for deg, mp in (((0, 0), 0), ((90, 0), 0), ((0, 90), 0), ((0, 0), 50)):
    print(G_vec(np.array(deg) * D, mp) * TO_mNm)  # [30.38  5.88] / [0. 0.] / [24.5  0. ] / [118.58  45.08]
q = np.array([0.4, -0.9])
grad = [(U(q + eps * e) - U(q - eps * e)) / (2 * eps) for e in np.eye(2)]
print(np.allclose(G_vec(q), grad))               # True  (위치 에너지의 기울기와 같다)
# 12.10, 문제 7: τ = M q̈ + V + G (mN·m)
def tau(q, qd, qdd):
    return (mass_matrix(q) @ qdd + V_vec(q, qd) + G_vec(q)) * TO_mNm
print(tau(np.array([0, 90]) * D, np.array([3.0, 0]), np.array([10.0, 0])))   # [26.99  0.86]
print(tau(np.array([30, 60]) * D, np.zeros(2), np.array([0, 20.0])))         # [22.46  0.64]
# 에너지 확인: 책상 위(중력 없음), 토크 0으로 2초 굴리기 (룽게-쿠타 4단)
def f(x):
    q, qd = x[:2], x[2:]
    return np.r_[qd, np.linalg.solve(mass_matrix(q), -V_vec(q, qd))]
x, h = np.array([0, 0.5, 3.0, -2.0]), 1e-3
K = lambda x: 0.5 * x[2:] @ mass_matrix(x[:2]) @ x[2:]
K0 = K(x)
for _ in range(2000):
    k1 = f(x); k2 = f(x + h / 2 * k1); k3 = f(x + h / 2 * k2); k4 = f(x + h * k3)
    x = x + h / 6 * (k1 + 2 * k2 + 2 * k3 + k4)
print(round(K0, 3), round(K(x), 3))              # 11489.649 11489.649  에너지가 그대로다

스탠퍼드 숙제

스탠퍼드 강의 페이지의 Homework 5에서 2번 (a)~(i)가 이 장 전체를 따라가는 문제다. 공간에서 움직이는 RP 팔의 질량 중심 자코비안, 질량 행렬, C와 B, 중력 벡터를 차례로 구한다.

1번(관성 텐서 옮기기)과 2번 (d)의 막대 관성은 11장의 내용이다. 풀이는 같은 페이지의 Solution 5에 있다.

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

← 11장. 힘이 움직임을 만든다: 동역학 첫걸음13장. 제어의 첫걸음: 용수철, 댐퍼, 그리고 에너지 →