처음← 이전 장

16장. 닿으면서 움직이기: 힘 제어, 사람 곁의 로봇, 온몸 제어

손끝이 무언가에 닿으면 위치만 지키는 제어는 위험하다. 이 장은 손끝을 용수철처럼 부드럽게 만들고, 접촉 힘을 재서 되먹임하고, 방향마다 움직임과 힘을 나눠 맡기는 법을 배운 뒤 사람 곁의 안전한 팔과 온몸 제어로 마무리한다. 강의 16강(70분)에 해당한다.

16.1 15장에서 이어서: 닿으면 무엇이 달라지나

15장에서는 손끝에서 바로 제어했다. 손끝이 낼 가속도 F′를 정하고, 작업 공간 질량 행렬 Λ와 속도 몫 μ, 중력 몫 p를 채워 손끝 힘 F를 만들었다. 이 F를 τ = JᵀF로 관절 토크로 바꾸면, 모델 추정값(모자 ^)이 맞을 때 손끝은 질량 1인 물체처럼 ẍ = F′로 움직인다.

F′는 13장의 PD 제어와 같은 모양이다. 손끝이 목표 xd에서 벗어난 만큼 되돌리고, 빠른 만큼 브레이크를 건다.

위치 제어는 손끝에 용수철을 단 것이다

멈춰 있는 손끝을 손가락으로 Δx만큼 밀어 보자. 추정이 맞으면 속도 몫과 중력 몫은 서로 지워진다. 남는 것은 F = −Λ kp Δx, 곧 밀린 만큼 되미는 용수철이다.

용수철이 얼마나 단단한지를 강성(stiffness)이라 한다. 위치 제어의 강성은 K = Λ kp다. 강의는 이것을 "닫힌 고리 강성"이라 부른다.

예를 들어 손끝이 느끼는 질량이 Λ = 0.5 kg이고 kp = 400 /s²이면 K = 200 N/m = 2 N/cm다. 손끝을 1 cm 밀면 2 N으로 되민다.

목표가 벽 속에 있으면

위치 제어는 "어디에 있어야 하는지"만 안다. 목표를 정할 때 벽의 자리를 조금만 틀려도, 제어기는 벽 속의 목표를 향해 계속 민다. 손끝이 벽에 막히면 힘은 F = K × (막힌 거리)가 된다.

목표가 장애물 속에 있으면 강성 × 거리만큼 민다
계획한 길(회색 점선)의 끝이 장애물 속 2.5 cm에 있다. 손끝(파란 점)은 장애물 앞에서 막히고, 제어가 만든 용수철이 목표(빈 원)까지 늘어난다. 장애물이 단단하면 누르는 힘은 F = kΔx다.
그림 16-1 · 딱딱한 제어와 부드러운 제어

정확히 따라가려고 강성을 키운 팔일수록 위험하다. K = 20 N/cm인 팔은 2.5 cm 오차로 50 N을 낸다. 컵은 깨지고, 강의 첫 영상의 유리창도 깨진다.

잠깐, 생각해 보기. 14장에서 본 적분 항(I)이 있는 위치 제어기로 벽 속의 목표를 누르면 어떻게 될까?

손끝이 벽에 막혀 오차가 사라지지 않는다. 적분 값이 계속 쌓이니 누르는 힘도 시간이 갈수록 커진다. 결국 벽이든 팔이든 무언가가 부서진다.

영상에서 보기: 00:43 닿으며 움직이는 영상 · 01:47 불확실성은 컴플라이언스로

16.2 용수철처럼 굴기: 강성과 컴플라이언스

닿을 일이 있으면 일부러 무르게 만든다. 밀면 잘 밀리는 정도를 컴플라이언스(compliance)라 하고, 강성의 거꾸로(1/k)다.

방향마다 강성을 따로 고른다

작업 공간 제어는 x, y, z 방향마다 kp를 따로 둘 수 있다. 강의는 z 방향의 kpz만 바꿔 보인다.

x, y는 단단하게 두고 z만 무르게 하면, 손끝은 옆으로 정확히 가면서 위아래로는 밀리는 대로 따라간다. 표면을 따라가는 일의 첫걸음이다.

벽 누르기: 용수철 두 개

종이 팔로 벽을 눌러 보자. 목표를 벽 속 d에 두면 용수철이 두 개 생긴다. 제어가 만든 용수철(kp)과 벽 자체의 용수철(kw)이다.

손끝이 벽을 δ만큼 누른 곳에서 두 용수철의 힘이 같아진다. 제어 용수철은 d − δ만큼, 벽은 δ만큼 늘어난다.

두 용수철이 목표 깊이를 나눠 가지고, 무른 쪽이 힘을 정한다
위는 책상을 위에서 본 모습이다. 아래 막대는 목표 깊이 d를 제어 용수철이 늘어난 길이(파랑)와 벽이 눌린 깊이(회색)로 나눈 것이다(1 cm = 120칸).
그림 16-2 · 직접 눌러 보기: 종이 팔로 벽 누르기

해 볼 것 세 가지:

  1. 처음 값(kp = 2 N/cm, 벽 50 N/cm, d = 1 cm): F = 1.92 N, δ = 0.038 cm다. 벽이 훨씬 단단해서 d의 거의 다를 제어 용수철이 맡는다.
  2. kp를 50으로 올린다: F = 25 N, δ = 0.5 cm다. 두 강성이 같으면 d를 반씩 나눈다.
  3. kp = 50에서 벽 강성을 1(스펀지)로 내린다: F = 0.98 N이다. 이번에는 벽이 거의 다 들어간다.

무른 쪽이 힘을 정한다. 벽이 단단해도 제어를 무르게 하면 힘이 작다. 단단한 것끼리 만나면 작은 오차도 큰 힘이 된다.

수학 더하기: 이어 붙인 용수철. 용수철 두 개를 이어 붙이면 같은 힘 F가 둘 다에 걸린다. 늘어난 길이는 각각 F/k₁, F/k₂이고 합이 전체 길이 d다. 그래서 d = F(1/k₁ + 1/k₂)이고, 합친 강성은 1/(1/k₁ + 1/k₂)라서 컴플라이언스(1/k)끼리 더해진다.

관절에서 본 강성: JᵀKJ

손끝의 강성 K를 관절에서 느끼면 얼마일까? 관절을 δθ만큼 돌리면 손끝은 δx = J δθ만큼 움직인다. 용수철은 −Kδx로 되밀고, 이 힘은 Jᵀ를 거쳐 관절 토크가 된다.

종이 팔 θ = (30°, 60°)에서 J = [[−13, −8], [8.66, 0]] cm다(6장). 손끝 강성이 두 방향 모두 2 N/cm라면 이렇다.

어깨만 0.01 rad 돌리면 어깨는 4.88 N·cm, 팔꿈치는 2.08 N·cm의 되돌리는 토크를 느낀다. 비대각 칸은 "한 관절을 돌리면 다른 관절도 버틴다"는 뜻이다. 강의는 이 식으로 관절 공간의 강성을 미리 따져 볼 수 있다고 말한다.

영상에서 보기: 04:53 1자유도로 보는 컴플라이언스 · 05:56 강성을 줄이면 · 08:33 닫힌 고리 강성과 관절 강성

16.3 힘 제어: 재고, 되먹임하고, 감쇠한다

컴플라이언스는 힘을 "작게" 할 뿐, "원하는 크기"로 맞추지는 못한다. 유리창을 닦으려면 정해진 힘으로 눌러야 한다. 접촉 힘을 목표 Fd에 맞추는 것이 힘 제어(force control)다.

그냥 명령하면 안 되는 이유: 마찰

손끝 힘을 F = Fd로 명령하면 그대로 누를까? 모터와 기어에는 마찰이 있다.

강의 예처럼 1 N·m를 명령해도 마찰이 그보다 크면 바깥에 나오는 힘은 0이다. 마찰은 정확히 모르고 때마다 바뀌어서, 계산으로 미리 빼 주기도 어렵다. 그래서 나온 힘을 재야 한다.

힘 센서는 아주 단단한 용수철

손목에 다는 힘 센서 속에는 아주 단단한 탄성체가 있다. 힘이 걸리면 아주 조금 휘고, 그 휜 양 δs를 재서 Fs = ksδs로 힘을 낸다. 강성이 10⁷ N/m라면 10 N에 1 µm만 휜다.

16.2절의 F = kΔx가 다시 나왔다. 힘을 잰다는 것은 아주 작은 길이를 재는 것이다.

되먹임 제어

잰 힘 Fs로 되먹임하는 가장 단순한 제어는 이렇다.

마찰 Ffr가 있어도 오차가 줄어든다. 손끝이 멈추면 모터 힘 F와 접촉 힘 Fs의 차이를 마찰이 받는다. 그 차이는 (1 + kf)(Fd − Fs)이고 Ffr를 넘지 못하니, 남는 오차는 이만큼이다.

마찰이 0.5 N이면 kf = 0일 때 0.5 N, kf = 4일 때 0.1 N까지 틀릴 수 있다. 14장의 적분 항을 더하면 오차가 0으로 간다. 14강에서 교수가 "적분은 힘 제어에서 아주 좋다"고 한 것이 이것이다.

닿은 뒤의 동역학

손끝을 질량 m인 물체 하나로, 벽을 강성 ke인 용수철로 본다. 벽 속으로 들어간 깊이를 x라 하면 Fs = kex다. 마찰은 잠시 빼고, 운동 방정식에 제어를 넣어 보자.

13장의 질량-용수철-감쇠기와 같은 식이다. 용수철 자리에 (1 + kf)ke가 들어갔을 뿐이다. 그래서 고유 진동수와 감쇠비가 이렇다.

x = Fs/ke를 넣으면 같은 식을 힘으로 쓸 수 있다. 강의가 말한 "힘으로 다시 쓰기"다. 접촉 힘 자체가 질량-용수철처럼 흔들린다.

읽을 것 두 가지:

  1. 벽이 단단할수록(ke가 클수록), 힘 이득 kf가 클수록 빨리 흔들린다.
  2. 같은 감쇠 kv라도 그만큼 ζ가 작아진다. 단단한 것을 세게 되먹임할수록 감쇠가 더 필요하다.

예를 들어 m = 0.5 kg, ke = 50 N/cm(5000 N/m), kf = 1이면 ω = 141 rad/s(22.5 Hz)다. ζ = 0.7을 원하면 kv = 99 N·s/m가 필요하다.

감쇠가 없으면 접촉 힘이 끝없이 출렁인다
질량 0.5 kg인 손끝이 강성 50 N/cm인 벽에 막 닿은 채 멈춰 있다가, 0초에 목표 2 N을 받는다. 주황 띠는 마찰 때문에 남을 수 있는 오차의 폭이다. 0.1 ms 간격으로 계산했다.
그림 16-3 · 직접 바꿔 보기: 1자유도 힘 제어 시뮬레이션

해 볼 것 네 가지:

  1. 마찰 0, 감쇠 0: 힘이 0과 4 N 사이를 끝없이 오간다. ζ = 0이다.
  2. 그대로 감쇠만 100으로 올린다: 0.05초 안에 2 N에 자리 잡는다(ζ = 0.71).
  3. 힘 이득 0, 마찰 0.5 N, 감쇠 100: 1.5 N에서 멈춘다. 마찰만큼 모자란다. 힘 이득을 4로 올리면 오차 폭이 ±0.1 N으로 준다.
  4. 힘 이득 0, 마찰 2.5 N: 아예 움직이지 않아 0 N이다. 명령 2 N이 마찰을 못 넘는다. 강의의 "1 N·m를 줘도 0"이다.

알아 두기. 이 그림의 손끝은 센서 값을 늦음 없이 받는다. 실제로는 계산 주기와 걸러 내기 때문에 값이 조금 늦게 오고, 팔도 휜다. 그래서 단단한 벽에서 힘 이득을 크게 올리면 흔들림이 자라 불안정해진다.

닿기 전도 조심해야 한다. 빈 공간에서는 Fs = 0이라 손끝이 (1 + kf)Fd로 가속하며 달려든다. 다가가는 동안 감쇠로 속도를 묶어 두어야 세게 부딪히지 않는다.

영상에서 보기: 07:31 힘을 조절하려면 센서가 있어야 한다 · 09:35 마찰 · 11:06 센서는 단단한 용수철 · 11:38 힘으로 다시 쓰기

16.4 방향 나누기: 움직일 방향과 누를 방향

유리창 닦기는 두 가지를 한꺼번에 한다. 창을 따라 걸레를 옮기고(움직임), 창에 수직으로 눌러 준다(힘). 그런데 한 방향에서 위치와 힘을 둘 다 마음대로 고를 수는 없다. 벽 속으로는 움직일 수 없고, 빈 공중으로는 힘을 낼 수 없다.

닿으면 자유도가 힘 쪽으로 간다

손에 쥔 물체가 탁자에 닿는 모양에 따라 잃는 자유도가 다르다. 강의의 세 예를 보자. 탁자 면이 x·y, 위쪽이 z다.

잃은 움직임 자유도는 힘 자유도가 된다
파란 양쪽 화살표는 탁자 면을 따라 미끄러지는 두 방향이다. 주황은 닿은 곳에서 힘으로 고를 수 있는 것이다. 곧은 화살표는 누르는 힘, 굽은 화살표는 비트는 모멘트다.
그림 16-4 · 닿는 모양과 자유도 (강의 예제)

잃은 자유도는 사라진 것이 아니다. 그 방향으로는 10 N이든 20 N이든 누르는 힘을, 그 축으로는 모멘트를 고를 수 있다. 언제나 움직임 자유도 + 힘 자유도 = 6이다.

잠깐, 생각해 보기. 펜으로 칠판에 글씨를 쓴다. 펜 끝은 판에 점으로 닿는다. 움직임과 힘의 자유도는 각각 몇인가?

공과 같다. 판을 따라 두 방향으로 미끄러지고 펜을 세 축으로 돌릴 수 있어 움직임 5다. 힘은 판에 수직으로 누르는 1이다.

선택 행렬 Ω

방향을 나누려면 판에 좌표계 {B}를 붙인다. 평면에서 보면 xB는 판을 따라, yB는 판에 수직으로 벽 속을 향한다.

{B}에서는 고르기가 쉽다. 움직일 방향은 1, 누를 방향은 0으로 적은 대각 행렬 Σ다.

받침 좌표계 {0}에서 쓰려면 2장의 회전행렬로 감싼다. 받침의 숫자를 {B}로 바꾸고(Rᵀ), 고르고(Σ), 다시 받침으로 돌린다(R). 이것이 선택 행렬(selection matrix) Ω다.

판이 x₀에서 α만큼 기울었다면 c = cos α, s = sin α로 이렇다.

Ω는 판을 따르는 몫만 남기고, Ω̃는 판에 수직인 몫만 남긴다. 둘을 더하면 단위행렬이라 빠지는 방향이 없다. 3차원에서는 6 × 6이 되고, 힘뿐 아니라 모멘트의 방향도 나눈다.

수학 더하기: 투영 행렬. t = (c, s)를 판 방향의 단위 벡터라 하면 Ω = t tᵀ다. 벡터 v에 곱하면 Ω v = t (t·v), 곧 v가 판 위에 드리우는 그림자다(2장의 내적). 그림자의 그림자는 그대로라 ΩΩ = Ω이고, 판 위의 그림자를 수직 방향으로 다시 비추면 0이라 ΩΩ̃ = 0이다.

판을 따라서는 움직임, 판에 수직으로는 힘
회색 점선 F′는 움직임 제어기가 내놓은 힘 (1, 0.6) N이다. 파랑은 그중 판을 따르는 몫 ΩF′, 주황은 판을 누르는 힘 Fdn, 검정은 둘을 더한 F다. 화살표 1 N = 50칸.
그림 16-5 · 직접 기울여 보기: 종이 팔이 비스듬한 판에 펜을 댄다 (θ₁ = 30°, θ₂ = 60°)

해 볼 것 세 가지:

  1. α = 0°: Ω = [[1, 0], [0, 0]]이다. F′의 y 몫 0.6 N이 지워져 ΩF′ = (1, 0) N이다.
  2. α = 30°: Ω = [[0.75, 0.43], [0.43, 0.25]]이다. F′가 거의 판 방향이라 대부분 남아 ΩF′ = (1.01, 0.58) N이다.
  3. 누르는 힘을 0으로: 펜은 판을 따라 움직이기만 하고 누르지 않는다. 글씨가 써지지 않는다.

영상에서 보기: 13:12 닿는 모양과 잃는 자유도 · 14:48 자유도는 힘 쪽으로 간다 · 15:49 Ω로 나누기

16.5 움직임과 힘을 한 식으로

이제 두 제어를 합친다. 움직임 제어는 Ω 방향에서만, 힘 제어는 Ω̃ 방향에서만 일한다. 둘 다 손끝에서 쓴 힘이라 더하기만 하면 된다.

Fmotion은 15장의 움직임 제어를 Ω로 거른 것이고, Fforce는 16.3절의 힘 제어를 Ω̃로 거른 것이다. 강의는 이것을 움직임과 힘의 통합 제어(unified motion and force control)라 부른다. 강의의 식은 힘 쪽 되먹임에도 Λ̂를 곱해 두 쪽이 서로 끌려가지 않게 하는데, 여기서는 뜻만 보려고 뺐다.

숫자로 해 보기

종이 팔(θ = (30°, 60°))의 손끝은 (8.66, 13) cm다. 그 바로 위의 가로 벽 y = 13 cm에 펜을 댄다. α = 0°라 Ω = [[1, 0], [0, 0]], Ω̃ = [[0, 0], [0, 1]]이다.

방향 나누기만 보려고 Λ̂를 단위행렬로 두고 μ̂, p̂는 뺀다. 움직임 제어가 F′ = (0.5, 0.3) N을 내놓았고, 1 N으로 누르고 있다(Fs = Fd라 되먹임 몫은 0).

F′의 y 몫 0.3 N은 Ω가 지웠다. y 방향은 오직 힘 제어가 맡는다.

알아 두기. 방향을 잘못 나누면 두 제어가 서로 다툰다. 판의 기울기를 5° 틀리면 2 N으로 누르는 힘 가운데 2 × sin 5° = 0.17 N이 판을 따라 펜을 민다. 그래서 실제로는 잰 접촉 힘의 방향으로 판의 기울기를 바로잡기도 한다.

모멘트도 고른다: 끼워 맞추기

힘에는 모멘트도 들어간다. 컵을 탁자에 내려놓을 때 한쪽 모서리가 먼저 닿으면, 누르는 힘이 모멘트를 만든다.

손끝의 작업 점(15장에서 정한 기준점)을 닿는 점 쪽에 두고, 그 점의 모멘트를 0으로 조절해 보자. 물체는 그 점을 중심으로 돌아 저절로 면이 맞는다.

강의 영상의 면 맞추기와 구멍에 막대 끼우기가 이렇게 한다. 길을 미리 계획하지 않아도 닿는 힘이 물체를 이끈다.

여러 팔이 함께 들면: 내력

두 팔이 파이프 하나를 함께 들면, 두 손이 파이프를 쥐어짜거나 잡아당기는 힘이 생긴다. 이것을 내력(internal force)이라 한다. 내력을 조절하지 않으면 물체가 부서지거나 빠진다.

강의는 내력을 다루는 "가상 링크 모델"로 네 팔이 물체 하나를 함께 다루는 영상을 보여 준다. 자세한 것은 고급 로봇공학에서 배운다.

영상에서 보기: 16:51 두 힘을 더하고 Jᵀ로 · 17:53 모멘트 조절 · 02:18 면 맞추기와 끼우기 · 03:21 여러 팔의 협동

16.6 로봇이 걸어온 길, 그리고 사람 곁의 로봇

강의 후반은 Khatib 교수가 최근에 한 강연의 내용이다. 아주 오래된 로봇에서 출발해, 사람 곁의 로봇이 왜 어려운지로 간다.

짧은 연표

때 일 이 교재와 이어지는 곳
1770년대 Jaquet-Droz의 자동인형이 글을 쓰고 그림을 그린다. 태엽과 캠(모양을 깎은 바퀴)이 "프로그램"이다. 10장의 궤적을 기계에 새긴 셈
1960년대부터 공장 로봇. 울타리 안에서 같은 일을 정밀하게 되풀이한다. 2~8장의 위치와 속도
1980년대 후반 힘 제어로 닿으며 움직이기, 여러 팔로 한 물체 다루기 (이 강의 첫 영상) 16.2~16.5절
1990년대 스탠퍼드의 바퀴 달린 팔 로봇 Romeo와 Juliet. 움직이면서 다루기 16.8절
1990년대 후반 Honda의 두 발로 걷는 휴머노이드 16.9절
2000년대 수술 로봇이 몸 안까지 들어가고, 사람 곁에서 안전한 가벼운 팔이 나온다 16.6~16.7절

강의는 Jaquet-Droz의 인형을 1773년의 것으로 소개한다. 이런 기계를 만들고 싶은 마음은 오래전부터 있었고, 기술이 늦게 왔을 뿐이라고 말한다.

공장 밖이 어려운 까닭

공장에서는 정밀도, 반복성, 빠르기, 튼튼함만 맞추면 된다. 사람 곁에서는 미리 모르는 일이 끝없이 생긴다. 주변을 보고(9장), 바로 반응하고, 자유도가 많은 몸을 실시간으로 다뤄야 한다.

무엇보다 안전해야 한다. 강의는 "쓸모 있으면서 안전한" 로봇을 이 분야의 큰 주제로 꼽는다.

작아 보여도 위험하다

작은 팔은 안전해 보이지만 위험이 속에 숨어 있다. 14장에서 본 대로 모터 회전자의 관성 Im은 감속비 N의 제곱만큼 커져 관절에 보인다. 감속비가 100이면 10,000배다.

부딪히는 순간에는 제어가 손쓸 틈이 없다. 그때 상대가 느끼는 것은 부딪힌 방향에서 본 팔의 질량, 곧 실효 질량(effective mass)이다. 15장의 Λ를 그 방향으로 본 값이다.

부딪힐 때의 힘

실효 질량 m이 속도 v로 와서 강성 k인 쿠션에 부딪힌다고 하자. 운동 에너지가 모두 쿠션에 들어간 순간 가장 깊이 눌리고, 힘도 가장 크다.

두 식을 곱하면 Fmaxδ = mv²이다. 최대 힘을 한계 F 아래로 묶으려면 쿠션이 적어도 mv²/F만큼 눌려야 한다. 무거운 팔은 두꺼운 쿠션이 있어야 한다는 뜻이다.

강의는 자동차 업계의 머리 부상 기준(HIC, head injury criterion)으로 이를 따진다. 실효 질량과 강성의 판에서 PUMA는 심한 부상 확률이 90%에 가까운 자리에 있다. 안전하려면 20 cm 가까운 쿠션을 둘러야 한다고 한다.

무거운 팔일수록 두꺼운 쿠션이 있어야 안전하다
주황 선은 지금 속도에서 최대 힘을 150 N 아래로 묶는 데 필요한 쿠션 깊이 mv²/150이다. 150 N은 계산을 보이려고 정한 예다. 가로축의 표시는 강의에 나온 실효 질량이다.
그림 16-6 · 직접 바꿔 보기: 실효 질량과 필요한 쿠션

처음 값(35 kg, 1 m/s)에서는 23 cm다. 강의의 "20 cm"와 비슷하다.

실효 질량을 3.5 kg으로 줄이면 2.3 cm, 1.5 kg이면 1 cm다. 속도를 반으로 줄여도 4분의 1이 된다.

잠깐, 생각해 보기. 로봇에 피부 센서를 붙여, 닿자마자 멈추게 하면 충분하지 않을까?

강의의 답은 "그것만으로는 보장할 수 없다"다. 센서도 컴퓨터도 제어기도 고장 날 수 있다.

무엇이 고장 나도 부딪힘 힘이 한계 아래인 안전, 곧 설계 자체의 안전이 있어야 한다. 센서는 그 위에 더하는 보탬이다.

가벼운 팔과 관절 토크 센서

독일 항공우주센터(DLR)의 가벼운 팔은 관절마다 토크 센서를 달아 모든 관절을 부드럽게 제어한다. 그래도 부딪힘은 제어보다 빠르다. 되먹임이 반응하기 전에는 팔 자체의 질량과 탄성이 힘을 정한다.

가장 확실한 방법은 모터와 링크 사이에 탄성(용수철)을 넣는 것이다. 부딪힐 때 용수철이 에너지를 받아 준다. 대신 팔이 출렁여서 빠르고 정확하게 움직이기 어렵다.

영상에서 보기: 19:28 아주 오래된 로봇 · 25:15 숨은 위험: 모터 관성 · 27:21 부딪힘과 HIC · 28:59 고장 나도 안전하게

16.7 큰 모터와 작은 모터: 매크로-미니 구동

팔을 가볍게 하기 어려운 까닭은 모터가 모터를 업고 다니기 때문이다. 링크를 돌리려면 모터가 있어야 하고, 그 모터를 앞 관절의 모터가 들어야 한다. 그래서 무게가 받침 쪽으로 쌓인다.

모터를 고를 때는 두 가지를 본다. 중력을 오래 버틸 연속 토크(continuous torque)와, 빨리 가속할 때 잠깐 내는 큰 토크다. 큰 토크를 계속 내면 모터가 탄다.

큰 토크는 느릴 때만 필요하다

강의의 핵심 관찰은 이것이다. 큰 토크는 중력 버티기나 느린 움직임처럼 낮은 주파수에서 필요하다. 빠르게 바로잡는 높은 주파수 쪽은 작은 토크면 된다.

그러니 관절 하나에 모터 하나일 필요가 없다. 사람도 관절마다 크고 작은 여러 근육을 쓴다.

느리고 큰 토크는 받침의 큰 모터, 빠르고 작은 토크는 관절의 작은 모터
(가) 큰 모터는 받침에 두고 탄성을 거쳐 관절을 돌린다. 작은 모터는 관절에 바로 붙는다. (나) 두 모터의 토크를 더하면 관절에 걸리는 토크가 된다.
그림 16-7 · 매크로-미니 구동의 생각

스탠퍼드는 이것을 분산 매크로-미니 구동(DM², distributed macro-mini actuation)이라 부른다. 강의에 따르면 PUMA만 한 팔의 실효 관성을 10분의 1(35 → 3.5 kg)로 줄일 수 있다. 16.6절의 계산으로는 필요한 쿠션이 10분의 1, 최대 힘이 약 3분의 1(1/√10)이 된다.

용수철은 선물을 하나 더 준다. 용수철이 늘어난 길이를 재면 F = kΔx로 전해지는 토크를 안다. 16.3절의 힘 센서와 같은 생각이다.

잠깐, 생각해 보기. 큰 모터를 관절에 그대로 두고 용수철만 넣으면 안 될까?

부딪힘에는 도움이 되지만 팔이 큰 모터의 무게를 계속 들어야 한다. 앞 관절의 모터도 커져야 하니 무게가 다시 쌓인다. 받침에 두어야 무게와 관성이 함께 빠진다.

공기 근육으로

다음 단계는 큰 모터 대신 공기 근육(pneumatic artificial muscle)을 쓰는 것이다. 공기 압력으로 수축하는 근육은 본래 말랑해서 탄성을 따로 넣지 않아도 된다. 큰 토크는 근육이, 빠른 바로잡기는 관절의 작은 전기 모터가 맡는다.

문제는 관절마다 근육 두 개, 그 수만큼 공기관이 필요하다는 것이다. 강의에 따르면 압력 조절기를 작게 만들어 링크마다 나눠 실었다. 공기관 하나가 팔 전체를 지나고, 관절마다 필요한 압력으로 조절한다.

강의에 나온 성능은 이렇다. 이 팔의 실효 관성은 1.5 kg까지 내려갔다.

방식 되먹임으로 따라갈 수 있는 빠르기
공기 근육만 약 0.5 Hz
공기 근육 + 장력 센서 약 7 Hz
공기 근육 + 작은 모터 (매크로-미니) 약 35 Hz

장력 센서 하나로 0.5 Hz가 7 Hz가 된 것도 눈여겨볼 만하다. 강의 말대로 센서는 쓸 수 있는 곳에 늘 쓴다. 다음 시제품은 공기관을 뼈대 속에 넣고, 겉에 촉각 센서가 든 피부를 씌워 첫 부딪힘을 누그러뜨리고 닿은 곳도 알아낸다.

영상에서 보기: 29:30 무게는 구동에서 온다 · 32:05 큰 토크는 낮은 주파수에만 · 33:09 DM² · 38:56 0.5 Hz와 35 Hz

16.8 과제와 자세: 남는 자유도 쓰기

1990년대 스탠퍼드의 Romeo와 Juliet은 바퀴 달린 받침에 팔을 얹은 로봇이다. "옮기고, 멈추고, 집고, 다시 옮기기"가 아니라 움직이면서 다룬다. 물건을 든 채 받침이 장애물을 비켜 가도 손은 흔들리지 않는다.

강의는 손이 할 일을 과제(task), 나머지 몸의 모양을 자세(posture)라 부른다. 둘을 서로 간섭하지 않게 나눠 제어한다. 영상에서 이 로봇은 카펫을 청소하고, 냉장고를 열고, 셔츠를 다린다.

3관절 팔로 보기

2장 2.3절의 3관절 팔(8 cm, 7 cm, 5 cm)이 손끝 위치만 지킨다고 하자. 관절 3개에 과제 2개라 여유가 1이다. 손끝을 고정한 채 팔 모양만 바꿀 수 있다.

손끝은 그대로 두고 자세만 바꾼다
손끝 (12, 4) cm를 지키며 어깨 각 θ₁을 바꾼다. 주황 화살표는 θ̇₁ = 1 rad/s인 영공간 속도로 0.5초 동안 팔꿈치와 손목이 갈 거리다(길면 줄여 그렸다). 손끝에서는 0이다.
그림 16-8 · 직접 바꿔 보기: 3관절 팔의 영공간 움직임

주황 화살표를 따라 움직여도 손끝 속도는 J θ̇ = 0이다. 손끝을 움직이지 않는 관절 속도들의 모임을 J의 영공간(null space)이라 한다.

8장 그림 8-3의 자세 θ = (0°, 90°, −90°)로 숫자를 확인해 보자. 손끝 위치만의 J는 2 × 3이고, θ̇ = (1, −1, −1.6) rad/s를 곱하면 0이 나온다.

수학 더하기: 영공간 찾기. 행렬 J에 곱해서 0이 나오는 벡터들을 J의 영공간이라 한다. J가 2 × 3이면 보통 한 방향이다. 그 벡터는 J의 두 행에 모두 수직이라, 두 행을 3차원 벡터로 보고 외적하면 바로 나온다(6장). (−7, −7, 0) × (13, 5, 5) = (−35, 35, 56)이고, −35로 나누면 (1, −1, −1.6)이다.

토크로 쓰면: 영공간 거르개

토크로 제어할 때도 같은 생각을 쓴다. 과제 힘은 JᵀFtask로 넣고, 자세를 바꾸려는 토크 τposture는 거르개 Nᵀ를 거쳐 더한다.

Nᵀ는 τposture에서 손끝을 가속하는 몫을 빼고 영공간 쪽 몫만 남긴다. 그래서 자세가 움직여도 자세 토크 때문에 생기는 손끝 가속도는 0이다. N을 만드는 법은 다음 학기 여유자유도 수업에서 다룬다고 강의는 말한다.

자세는 무엇을 기준으로 고르나

사람은 남는 자유도를 어떻게 쓸까? 강의는 사람이 근육의 수고를 가장 적게 하는 자세를 고른다고 본다. 근육마다 낼 수 있는 힘이 다르니, 장력의 제곱을 근육의 능력에 따라 달리 쳐서 더한 에너지가 가장 작은 자세다.

로봇은 τ = JᵀF로 토크를 내고, 사람은 근육 장력 m을 근육 부착 자코비안 L로 옮겨 τ = Lᵀm으로 낸다. 강의실에서 커피 잔을 입 가까이 대 보면 모두 비슷한 팔꿈치 각도가 나온다. 그 각도가 이 에너지의 최솟값과 맞고, 잔이 무거워지면 각도도 따라 바뀐다.

잠깐, 생각해 보기. 추운 아침 시동이 안 걸린 차를 밀어야 한다. 팔을 굽혀 미는가, 쭉 펴고 미는가?

팔을 펴고 몸을 기울여 민다. 8장에서 본 대로 팔을 펴면 작은 토크로 큰 힘을 낸다. 강의는 아기 때는 몰랐던 이런 기계적 이점을 사람이 자라며 스스로 찾아낸다고 말한다.

영상에서 보기: 42:44 과제와 자세 · 50:05 영공간의 자세 제어 · 54:15 차를 미는 자세 · 56:21 사람은 Lᵀ로

16.9 여러 곳이 닿는 몸: 전신 제어

휴머노이드는 팔 하나보다 훨씬 어렵다. 관절이 수십 개이고, 몸이 가지처럼 갈라지며, 두 발과 손이 동시에 닿는다. 한쪽을 당기면 다른 모든 곳이 영향을 받는다.

2장 2.1절에서 본 대로 몸통은 바닥에 붙어 있지 않아 자유도 6이 더 있고, 그 6개에는 모터가 없다. 강의 말대로 휴머노이드는 늘 균형을 잡느라 바쁘다. 밀면 넘어지고, 움직이려면 닿은 곳의 힘을 잘 나눠야 한다.

역기구학 대신 끌어당기기

관절이 이렇게 많으면 끝 자세를 미리 역기구학으로 정하는 것은 무모하다. 관절 한계, 장애물, 균형이 움직이는 동안 계속 바뀌기 때문이다.

그래서 1장 1.5절의 길을 간다. 손을 목표로 끌어당기면 자세는 저절로 나온다.

여러 점을 하나로 묶는다

오른손, 왼손, 머리처럼 제어할 점이 여럿이면 어떻게 하나? 강의의 답은 "한 걸음 물러서라"다. 점들의 좌표를 모두 이어 붙여 큰 과제 벡터 하나로 보면, 높은 차원에서 그것은 다시 점 하나다.

그러면 자코비안도 Λ도 하나씩 나온다. Λ의 대각 블록은 점마다의 질량 성질이고, 비대각 블록은 점끼리 끌려가는 정도다. 15장의 식을 그대로 쓴다.

지켜야 할 것부터: 제약과 우선순위

관절 한계, 자기 몸과 부딪히지 않기, 장애물 같은 제약(constraint)은 가장 먼저 지켜야 한다. 제약의 자코비안을 알면 그 영공간도 안다. 과제와 자세를 모두 그 영공간 안에 넣으면, 무엇을 하든 제약을 깨지 않는다.

여러 곳이 닿을 때

닿는 곳은 힘으로, 손은 과제로, 나머지는 자세로
주황 화살표는 바닥과 벽이 몸을 미는 힘이다. 질량 중심(검은 점)에서 내린 점선이 두 발 사이(주황 띠)에 떨어져야 넘어지지 않는다.
그림 16-9 · 두 발과 한 손으로 버티며 다른 손을 뻗는 휴머노이드

닿는 곳의 수직 방향이 제약이다. 그 자코비안과 영공간을 구해, 움직임은 영공간 안에서 하고 닿는 곳의 힘은 따로 조절한다. 강의는 이것이 16.4절의 Ω와 Ω̃를 "여러 곳이 닿는 공간"으로 넓힌 것이라 말한다.

그러면 몸무게를 여러 닿는 곳에 나눠 싣고, 균형을 지키며, 손으로 일을 할 수 있다. 강의 당시 이 구조가 ASIMO 같은 휴머노이드에 들어가고 있었다.

그 위에 쌓는 것

이 수업에서 배운 것은 가장 아래층, 곧 움직임을 실제로 해내는 제어다. 그 위에 장애물을 보고 비키기, 사람에게서 배운 솜씨 같은 행동을 쌓는다. 바탕이 튼튼해야 위로 올라갈 수 있다.

강의는 다른 연구도 짧게 보여 준다. 미리 짠 길을 실시간으로 휘어 장애물을 피하는 탄성 계획, 닿는 점의 실효 질량만으로 계산하는 빠른 충돌 시뮬레이션이다. 강의 내용은 "언젠가 ASIMO도 졸업시키고 싶다"는 말로 끝난다.

영상에서 보기: 45:58 여러 곳이 닿는 몸 · 49:04 한 걸음 물러서기 · 1:03:14 제약이 먼저 · 1:06:52 균형과 여러 곳의 닿음

16.10 16장까지 온 다음

1장은 다섯 질문으로 시작했다. 이 장의 힘 제어를 한 번 계산하는 데 그 다섯 질문의 답이 모두 쓰인다.

1장의 질문 배운 곳 이 장에서 쓴 곳
① 순기구학 (각도 → 손끝) 2~5장 손끝 위치 x, 판의 회전행렬 R
② 역기구학 (손끝 → 각도) 5장 보충 풀지 않는다. 끌어당기면 자세가 나온다
③ 자코비안 (속도와 힘) 6~8장 τ = JᵀF, JᵀKJ, 영공간
④ 동역학 (힘 → 움직임) 11~12장 Λ, μ, p, 접촉 흔들림, 실효 질량
⑤ 제어 (모터에 시킬 일) 13~15장 F′, 힘 되먹임, 감쇠, Ω와 Ω̃

제어기가 한 번 도는 순서로 다시 적으면 이렇다.

  1. 엔코더가 θ와 θ̇를 준다. 순기구학으로 손끝 x를, 자코비안으로 ẋ = Jθ̇를 구한다.
  2. 동역학 모델로 Λ, μ, p를 계산한다.
  3. 힘 센서가 Fs를 준다.
  4. Ω와 Ω̃로 방향을 나눠 움직임 제어와 힘 제어를 정하고 F를 만든다.
  5. τ = JᵀF를 모터에 보낸다. 이것을 1초에 수백에서 수천 번 되풀이한다.

1장 1.6절의 그림 1-7을 다시 보자. ①에서 ⑦까지 한 계단씩 올라왔다. 9장의 눈과 10장의 궤적은 이 계단 옆에서 목표를 찾고 길을 그려 준다.

1장 1.3절에서 "사람은 컵에 손을 뻗을 때 어깨 각도를 계산하지 않는다"고 했다. 이제 그 말을 식으로 쓸 수 있다. 손끝에 힘을 걸고, Jᵀ로 관절에 나누고, 남는 자유도는 영공간에서 자세가 쓴다.

16.11 연습문제

답은 문제 8개 아래에 있다. 계산기 하나면 된다.

  1. 종이 팔이 벽을 누른다. 제어 강성 kp = 4 N/cm, 벽 강성 kw = 20 N/cm, 목표는 벽 속 d = 0.6 cm다.
    1. 접촉 힘 F와 벽이 눌린 깊이 δ를 구하라.
    2. 벽이 아주 단단하다면(kw → ∞) F는 얼마가 되나?
    3. 같은 벽과 목표에서 힘을 1 N 아래로 하려면 kp를 얼마 아래로 해야 하나?
  2. 강성.
    1. 손끝 질량 Λ = 0.5 kg인 방향에서 kp = 400 /s²이다. 닫힌 고리 강성 K를 N/cm로 구하라. 손으로 0.5 cm 밀면 몇 N으로 되미나?
    2. 종이 팔 θ = (30°, 60°)에서 손끝 강성이 K = diag(0, 2) N/cm다(x는 무르고 y만 단단). 관절 강성 Kθ를 구하라. 팔꿈치만 돌리면 왜 되돌리는 토크가 없나?
  3. 마찰이 Ffr = 0.6 N인 손끝으로 벽을 누른다.
    1. Fd = 3 N이다. kf = 0과 kf = 5일 때 남을 수 있는 가장 큰 힘 오차는?
    2. Fd = 0.5 N, kf = 0이다. 벽에 막 닿은 채 멈춘 손끝은 어떻게 되나? kf = 2라면?
  4. 손끝 질량 m = 0.5 kg, 벽 강성 ke = 5000 N/m, 힘 이득 kf = 4다.
    1. 고유 진동수 ω를 rad/s와 Hz로 구하라.
    2. 임계 감쇠(ζ = 1)가 되는 kv는?
    3. 감쇠도 마찰도 없을 때, 막 닿은 채 Fd = 2 N을 받으면 접촉 힘은 어디서 어디까지 오가나?
  5. 판이 x₀에서 α = 60° 기울었다.
    1. Ω와 Ω̃를 구하라.
    2. ΩΩ의 왼쪽 위 칸을 계산해 Ω의 왼쪽 위 칸과 같은지 확인하라.
    3. 움직임 제어가 F′ = (1, 1) N을 내놓았고, 판을 2 N으로 누른다. Λ̂를 단위행렬로 두고 F를 구하라. 판에 수직인 단위 벡터는 n = (−sin α, cos α)다.
  6. 종이 팔 θ = (30°, 60°)가 가로 벽(α = 0°)에 펜을 댄다. 움직임 제어가 F′ = (0.8, −0.4) N을 내놓았고, 1.5 N으로 위쪽 벽을 누른다(Fs = Fd). F와 τ = JᵀF를 구하라.
  7. 부딪힘.
    1. 실효 질량 35 kg과 3.5 kg인 팔이 0.5 m/s로 강성 20 kN/m인 덮개에 부딪힌다. 각각의 최대 힘은?
    2. 35 kg 팔의 최대 힘을 150 N 아래로 묶으려면 쿠션이 얼마나 눌려야 하나?
    3. 실효 질량을 10분의 1로 줄이면 최대 힘은 몇 배가 되나?
  8. 3관절 팔(8, 7, 5 cm)이 θ = (0°, 90°, −90°)에 있다. 관절은 (0, 0), (8, 0), (8, 7)에, 손끝 E는 (13, 7) cm에 있다.
    1. 손끝 위치만의 자코비안 J(2 × 3)를 구하라. 회전 관절 i의 열은 (−(yE − yi), xE − xi)다.
    2. 영공간 벡터를 θ̇₁ = 1로 맞춰 구하라.
    3. 이 속도로 돌리면 링크 2와 링크 3의 방향은 각각 어떻게 바뀌나?

답

답 1.

답 2.

답 3.

답 4.

답 5.

답 6. ΩF′ = (0.8, 0)이고 누르는 몫은 (0, 1.5)라 F = (0.8, 1.5) N이다. 첫 줄은 −13 × 0.8 + 8.66 × 1.5 = −10.4 + 12.99다.

답 7.

답 8.

파이썬으로 확인

파이썬(numpy)이 있으면 아래를 붙여 넣어 돌려 본다. 주석의 값이 그대로 나온다. 힘 제어 시뮬레이션은 그림 16-3과 같은 계산이다.

import numpy as np

np.set_printoptions(precision=3, suppress=True)
D = np.pi / 180

def jac(t1, t2):
    """종이 팔(10 cm, 8 cm)의 자코비안 (cm/rad)."""
    s1, c1, s12, c12 = np.sin(t1), np.cos(t1), np.sin(t1 + t2), np.cos(t1 + t2)
    return np.array([[-10 * s1 - 8 * s12, -8 * s12], [10 * c1 + 8 * c12, 8 * c12]])

def wall_press(kp, kw, d):
    """제어 용수철 kp와 벽 kw가 목표 깊이 d를 나눠 가질 때: (힘, 벽 눌림)."""
    F = kp * kw / (kp + kw) * d
    return round(F, 3), round(F / kw, 3)

def omega(alpha_deg):
    """판이 alpha만큼 기울었을 때의 선택 행렬 Ω와 Ω̃."""
    c, s = np.cos(alpha_deg * D), np.sin(alpha_deg * D)
    O = np.array([[c * c, c * s], [c * s, s * s]])
    return O, np.eye(2) - O

def force_sim(kf, kv, fr, Fd=2.0, m=0.5, ke=5000.0, T=0.3, dt=1e-4):
    """1자유도 힘 제어: 벽에 막 닿은 손끝이 0초에 목표 Fd를 받는다. (최대 힘, 끝 힘)."""
    x = v = 0.0
    hist = []
    for _ in range(round(T / dt) + 1):
        Fs = ke * x if x > 0 else 0.0
        hist.append(Fs)
        Fn = Fd + kf * (Fd - Fs) - kv * v - Fs        # 모터 힘 - 접촉 힘
        if v == 0.0:
            a = 0.0 if abs(Fn) <= fr else (Fn - fr * np.sign(Fn)) / m
        else:
            a = (Fn - fr * np.sign(v)) / m
        vn = v + a * dt
        if v != 0.0 and np.sign(vn) != np.sign(v):    # 마찰은 방향을 뒤집지 못한다
            vn = 0.0
        v = vn
        x += v * dt
    return round(float(max(hist)), 3), round(float(hist[-1]), 3)

J = jac(30 * D, 60 * D)
print(J)                                   # [[-13.    -8.  ] [  8.66   0.  ]]
# 16.2 벽 누르기와 관절 강성
print(wall_press(2, 50, 1))                # (1.923, 0.038)
print(J.T @ np.diag([2, 2]) @ J)           # [[488. 208.] [208. 128.]]
# 16.3 힘 제어 (힘 이득, 감쇠, 마찰)
print(force_sim(0, 0, 0))                  # (4.0, 1.832)  끝없이 0~4 N을 오간다
print(force_sim(1, 100, 0))                # (2.084, 2.0)
print(force_sim(0, 100, 0.5))              # (1.5, 1.5)  마찰만큼 모자란다
print(force_sim(4, 100, 0.5))              # (2.291, 2.061)  오차 0.1 N 안
print(force_sim(0, 100, 2.5))              # (0.0, 0.0)  꿈쩍 않는다
# 16.5 통합 제어 예
O, Ot = omega(0)
print(J.T @ (O @ [0.5, 0.3] + Ot @ [0, 1]))  # [ 2.16 -4.  ]
# 문제 1
print(wall_press(4, 20, 0.6))              # (2.0, 0.1)
print(20 / (12 - 1))                       # 1.8181818181818181  k_p 한계: 12 k_p ≤ k_p + 20
# 문제 2
print(0.5 * 400 / 100)                     # 2.0  N/cm
print(J.T @ np.diag([0, 2]) @ J)           # [[150.   0.] [  0.   0.]]
# 문제 3
print(0.6 / (1 + 0), 0.6 / (1 + 5))        # 0.6 0.09999999999999999
print(force_sim(0, 100, 0.6, Fd=0.5))      # (0.0, 0.0)
# 문제 4
w = np.sqrt(5 * 5000 / 0.5)
print(round(w, 1), round(w / (2 * np.pi), 1), round(2 * np.sqrt(5 * 5000 * 0.5), 1))  # 223.6 35.6 223.6
print(force_sim(4, 0, 0))                  # (4.003, 3.271)  감쇠가 없으니 아직 흔들리는 중
# 문제 5
O, Ot = omega(60)
print(O, Ot)                               # [[0.25  0.433] [0.433 0.75 ]] [[ 0.75  -0.433] [-0.433  0.25 ]]
print(np.allclose(O @ O, O), np.allclose(O @ Ot, 0))  # True True
n = np.array([-np.sin(60 * D), np.cos(60 * D)])
print(O @ [1, 1] + 2 * n)                  # [-1.049  2.183]
# 문제 6
O, Ot = omega(0)
F = O @ [0.8, -0.4] + Ot @ [0, 1.5]
print(F, J.T @ F)                          # [0.8 1.5] [ 2.59 -6.4 ]
# 문제 7
for m in (35, 3.5):
    print(round(0.5 * np.sqrt(m * 20000)))  # 418 / 132
print(round(100 * 35 * 0.5**2 / 150, 1))   # 5.8  cm
# 문제 8
J3 = np.array([[-7, -7, 0], [13, 5, 5]])
nv = np.cross(J3[0], J3[1])
print(nv, nv / nv[0], J3 @ (nv / nv[0]))   # [-35  35  56] [ 1.  -1.  -1.6] [0. 0.]

더 공부하려면

이 강의는 입문이다. 1강에서 Khatib 교수는 다음 학기에 두 수업을 더 연다고 안내했다.

하나는 이 수업에서 배운 것을 실제 로봇에 적용하며 실험해 보는 실험 로봇공학(experimental robotics)이다. 다른 하나는 연구 주제를 다루는 고급 로봇공학(advanced robotics)이다.

이 장에서 "고급 로봇공학에서 다룬다"고 미룬 것들이 그 수업의 내용이다. 여유자유도와 영공간 거르개 N, 여러 팔이 함께 들 때의 내력, 촉각(haptics), 여러 곳이 닿는 전신 제어다. 안내는 1강 18:32에서 들을 수 있다.

다 풀었으면 16강 영상을 한 번 본다. 이것으로 이 교재가 끝난다.

← 15장. 팔 전체를 제어하기: 계산 토크 제어와 작업 공간 제어처음으로 →