13장. 제어의 첫걸음: 용수철, 댐퍼, 그리고 에너지
제어기는 매 순간 목표와 지금 상태를 견주어 모터에 낼 힘을 정한다. 이 장은 가장 단순한 기계인 질량–용수철–댐퍼로 흔들림의 빠르기(고유 진동수)와 잦아드는 정도(감쇠비)를 익히고, 에너지가 줄기만 하면 결국 멈춘다는 안정성의 생각을 얻는다. 그 끝에서 모터로 가상의 용수철과 댐퍼를 만드는 PD 제어가 나온다. 강의 13강(70분)에 해당한다.
13.1 제어는 무엇을 하나
10장에서 관절마다 시간표 qd(t)를 짰다. 11~12장에서는 토크와 움직임을 잇는 식 M q̈ + V + G = τ를 얻었다.
이제 남은 질문은 하나다. 매 순간 모터에 토크를 얼마나 내라고 할까? 이것을 정하는 일이 제어(control)다.
열린 루프와 닫힌 루프
방법은 크게 둘이다.
- 열린 루프(open loop) 제어: 식으로 토크를 계산해 보내기만 한다. 팔이 실제로 어디 있는지는 보지 않는다. 질량을 조금 틀리게 알았거나 누가 팔을 밀면, 그 오차가 그대로 남는다.
- 닫힌 루프(closed loop) 제어: 관절의 각도 센서(엔코더)로 지금 자세를 재고, 목표와 견주어 토크를 고친다. 잰 값을 다시 계산에 넣는 것을 피드백(feedback)이라 한다.
닫힌 루프 제어기는 정해진 제어 주기(control period) Δt마다 같은 일을 되풀이한다. 1 ms(1초에 1000번)가 흔하다.
- 센서로 관절 각도 q를 읽는다. 필요하면 각속도 q̇도 구한다.
- 목표 qd와의 차이, 곧 오차(error)를 구한다.
- 오차를 줄이는 쪽으로 토크 τ를 계산한다.
- τ를 모터에 보내고, Δt 뒤에 1로 돌아간다.
이 장과 다음 두 장이 묻는 것은 3단계다. "오차를 보고 토크를 어떻게 정해야, 팔이 목표로 부드럽게 가서 멈출까?"
잠깐, 생각해 보기. 눈을 감고 책상 위의 컵을 잡아 보자. 눈을 뜨고 잡을 때와 무엇이 다른가?
눈을 감으면 기억해 둔 위치로 손을 보내기만 한다. 열린 루프다. 몇 cm쯤 빗나가고, 손이 컵에 닿고 나서야 고친다.
눈을 뜨면 손과 컵을 계속 보며 고친다. 닫힌 루프다.
사람은 역기구학을 풀지 않는다
강의는 공을 저글링하는 로봇 영상(미시간 대학, 1993)으로 시작한다. 이 로봇은 떨어지는 공을 카메라 두 대로 계속 보며 팔을 움직인다. 미리 짠 계획 없이, 보이는 대로 고치기만 하며 공을 친다.
교수는 묻는다. 의자를 잡으려고 손을 뻗을 때, 우리는 관절 각도를 먼저 계산할까? 그렇지 않다.
손과 의자를 보며, 손이 목표에 끌려가듯 움직인다. 팔의 마지막 자세는 계산하지 않아도 움직임 끝에 저절로 정해진다.
교수는 이것을 위치 에너지로 설명한다. 목표 자리가 가장 낮은 그릇을 만들면, 그릇의 기울기가 손을 바닥 쪽으로 미는 힘이 된다. 1.5절의 "자석" 제어가 이 생각이고, 13.9절에서 식으로 만든다.
제어 강의의 순서
강의는 제어를 네 강에 걸쳐 다룬다.
| 강의 | 내용 |
|---|---|
| 13강 (이 장) | 자연계(질량–용수철–댐퍼), 에너지와 안정성, PD 제어의 시작 |
| 14강 | PD 제어 깊이 보기: 이득 고르기, 제어 분할, 외란과 정상 상태 오차, PID |
| 15강 | 여러 관절 팔의 PD 안정성, 작업 공간 제어 |
| 16강 | 힘 제어 |
영상에서 보기: 00:10 저글링 로봇 영상 · 04:56 사람은 어떻게 손을 뻗나 · 05:26 손이 목표에 끌려간다 · 08:07 오늘은 자연계부터
13.2 관절 공간 제어와 resolved-rate 제어
손끝을 목표 xd로 보내는 방법을 강의는 셋으로 나누어 보여 준다. 오늘날 로봇 대부분이 쓰는 두 가지를 먼저 보고, 세 번째는 15장으로 넘긴다.
관절 공간 제어: 관절마다 제 목표를 따라간다
관절 공간 제어(joint space control)는 이렇게 한다.
- 역기구학으로 xd를 관절 목표 qd로 바꾼다. 궤적이면 10장처럼 시간마다 qd(t)를 만든다.
- 관절마다 제어기를 하나씩 둔다. 관절 i의 제어기는 자기 엔코더 값 qi와 자기 목표 qdi만 본다.
- 각 제어기가 자기 오차를 0으로 줄인다.
관절끼리 서로 모르고 따로 움직인다. 단순해서 공장 로봇 대부분이 이렇게 한다. 같은 동작을 되풀이하는 일이면 한 번 기록한 qd(t)를 따라가기만 하면 된다.
약점은 역기구학이다. 관절이 수십 개인 휴머노이드는 역기구학을 풀기도, 좋은 자세를 고르기도 어렵다. 교수는 오늘날의 휴머노이드가 이 문제로 고생한다고 말한다.
resolved-rate 제어: 역기구학 대신 J⁻¹
8.5절의 resolved-rate 제어(resolved motion rate control)는 역기구학을 통째로 풀지 않는다. 제어 주기마다 작은 걸음 하나만 푼다. Whitney가 1972년 논문에서 내놓은 방법이다.
f는 순기구학이다. 나온 q + δq를 관절마다 나눠 주면, 관절마다의 제어기가 따라간다. 순기구학과 J⁻¹이 제어 루프 안에 들어간 셈이다.
강의는 이 방법의 약점도 짚는다.
- 특이점 근처에서는 J⁻¹이 없거나 너무 크다(8.6절). 관절이 남는 팔은 J가 정사각이 아니라 의사역행렬이 필요하다.
- δx에는 cm로 재는 이동과 rad로 재는 회전이 섞여 있다. 단위가 다른 숫자를 한 벡터에 묶으니 걸음의 크기를 공정하게 잴 수 없다.
- 동역학을 생각하지 않는다. 빠르게 움직이면 오차가 커진다.
- 같은 손끝 길을 되풀이해도 관절 자세가 매번 같은 곳으로 돌아온다는 보장이 없다. 그래서 컴퓨터로 미리 돌려 관절 궤적을 만들고, 그 궤적을 실행하는 데 쓰기 좋다.
용수철로 그려 보기
교수는 두 가지 생각을 용수철로 그려 보인다. 모터 대신 진짜 용수철을 단다고 상상하자.
- (가) 관절마다 용수철: 용수철이 쉬는 각도를 관절 목표에 맞춘다. 팔을 건드리면 관절마다 제자리로 돌아온다. 쉬는 각도를 조금씩 옮기면 팔이 따라오는데, 이것이 관절 공간 제어다.
- (나) 손끝에 용수철 하나: 손끝과 목표 사이에 용수철을 건다. 손끝이 끌려가면 팔 전체가 따라오고, 역기구학은 필요 없다. 이것이 작업 공간 제어(operational space control)이고 15장에서 배운다.
잠깐, 생각해 보기. (가)처럼 관절에 용수철만 달고 팔을 툭 치면 어떻게 될까? 무엇을 더 달아야 할까?
용수철만 있으면 팔이 제자리를 중심으로 계속 흔들린다. 흔들림을 잦아들게 하려면 댐퍼(damper)를 함께 단다. 문이 쾅 닫히지 않게 하는 도어 클로저 같은 부품이다.
13.3~13.7절이 이 두 부품의 성질을 차례로 본다.
용수철과 댐퍼만으로 다 되지는 않는다. 벽에 세운 팔은 중력 때문에 쉬는 자세보다 조금 처지고, 빨리 움직이면 관절끼리 미는 힘(12장의 M과 V)도 생긴다. 이것들을 메우는 법은 14~15장에서 다룬다.
영상에서 보기: 10:12 관절마다 용수철 · 13:52 손끝에 용수철 하나 · 17:32 Whitney의 resolved-rate · 21:44 J에 섞인 단위
13.3 자연계 1: 질량과 용수철
강의는 "제어 수업을 들은 적이 없다고 치고" 가장 단순한 기계에서 시작한다. 모터도 컴퓨터도 없이 물리 법칙만으로 움직이는 시스템을 자연계(natural system)라 한다.
마찰 없는 책상 위에 질량 m인 덩어리가 있고, 용수철이 덩어리를 벽에 이어 준다. 용수철이 늘지도 줄지도 않은 자리를 x = 0으로 잡는다. 덩어리를 x₀만큼 당겼다가 놓으면 어떻게 될까?
모두 아는 대로 왔다 갔다 한다. 마찰이 없으니 영원히 멈추지 않는다.
에너지가 오간다
수학 더하기: 운동 에너지와 용수철의 에너지. 질량 m이 속도 v로 움직이면 운동 에너지(kinetic energy)는 K = ½ m v²다. 용수철 상수 k인 용수철을 x만큼 늘리면 위치 에너지(potential energy) U = ½ k x²가 쌓인다. 당기는 힘 kx가 0에서부터 고르게 커지니, 한 일은 밑변 x, 높이 kx인 삼각형의 넓이 ½ k x²다.
예: k = 8 N/m인 용수철을 0.1 m 늘리면 U = ½ × 8 × 0.1² = 0.04 J다. 2 kg이 0.2 m/s로 가면 K = ½ × 2 × 0.2² = 0.04 J다. 강의는 위치 에너지를 V로 쓰지만, 이 교재는 12장처럼 U로 쓴다.
이 두 에너지로 움직임을 따라가 보자.
- 당겨서 잡고 있을 때: 멈춰 있으니 K = 0이고, U = ½ k x₀²로 가장 크다.
- 놓으면 용수철이 당긴다. U가 줄어든 만큼 K가 늘어 빨라진다.
- x = 0을 지날 때: U = 0이고 K가 가장 크다. 가장 빠르다.
- 반대쪽으로 넘어가며 용수철이 눌린다. 이번에는 K가 U로 바뀌며 느려지고, −x₀에서 멈춘다.
진동은 K와 U가 서로 주고받는 것이다. 마찰이 없으면 합 E = K + U는 언제나 처음의 ½ k x₀²다.
해 볼 것:
- 시간 t를 조금씩 밀어 본다. 덩어리가 가운데를 지날 때 막대가 모두 주황이 되고, 양 끝에서는 모두 파랑이 된다.
- m을 키우면 느리게, k를 키우면 빠르게 흔들린다. 13.4절에서 얼마나 빨라지는지 셈한다.
운동 방정식: m ẍ + k x = 0
12장의 라그랑주 방정식에 K = ½ m ẋ², U = ½ k x²를 넣는다. 바깥에서 미는 힘은 없다.
∂K/∂ẋ = m ẋ를 시간으로 미분하면 m ẍ다. K에는 x가 없어서 둘째 항은 0이다. 셋째 항은 ∂U/∂x = kx다.
뉴턴 식으로 보아도 같다. 용수철의 힘 −kx가 m ẍ를 만든다.
이 힘은 위치 에너지의 기울기에 빼기를 붙인 것(−dU/dx)이다. 이렇게 위치 에너지에서 나오는 힘을 보존력(conservative force)이라 하고, 보존력만 있는 시스템을 보존계(conservative system)라 한다.
수학 더하기: 미분방정식. 이 장 내내 쓰는 식은 m ẍ + b ẋ + k x = 0이다. b ẋ는 13.5절의 댐퍼이고, 지금은 b = 0이다.
이 식은 숫자 하나를 구하는 식이 아니다. 매 순간 덩어리에 걸린 힘의 균형을 적은 규칙이다. 관성 m ẍ, 댐퍼 b ẋ, 용수철 kx를 더하면 어느 순간에나 0이다.
이런 식을 미분방정식(differential equation)이라 하고, 답은 시간에 따른 함수 x(t)다. 컴퓨터는 작은 시간 Δt씩 걸으며 푼다.
지금의 x와 ẋ로 ẍ = −(b ẋ + k x)/m을 구하고, 그 가속도로 Δt 뒤의 속도와 위치를 고친다. 이 장의 슬라이더 그림도 1초를 수백 걸음으로 나눠 이렇게 계산한다.
영상에서 보기: 23:51 가장 단순한 시스템 · 25:56 위치 에너지가 운동 에너지로 · 27:01 라그랑주 식으로 m ẍ + kx = 0
13.4 고유 진동수: ω = √(k/m)
그림 13-3에서 본 대로, 무거우면 천천히 흔들리고 용수철이 단단하면 빨리 흔들린다. k = 0이면 아예 흔들리지 않는다. 얼마나 빨리 흔들리는지 식으로 구해 보자.
cos 꼴의 답
m ẍ + k x = 0을 m으로 나누고, k/m을 ωn²으로 쓴다.
"두 번 미분하면 자기 자신에 −ωn²을 곱한 것"이 되는 함수를 찾으면 된다. cos가 그런 함수다.
수학 더하기: cos의 미분. cos(ωt)를 t로 미분하면 −ω sin(ωt)이고, sin(ωt)를 미분하면 ω cos(ωt)다. 괄호 안의 ω가 미분할 때마다 한 번씩 앞으로 나온다. 그래서 cos(ωt)를 두 번 미분하면 −ω² cos(ωt)가 되어 ẍ = −ω²x를 맞춘다.
c(진폭)와 φ(출발 위상)는 처음 위치와 처음 속도로 정해진다. x₀에서 멈춘 채로 놓으면 c = x₀, φ = 0이라 x(t) = x₀ cos(ωnt)다.
ωn을 고유 진동수(natural frequency)라 한다. 단위는 rad/s다. 한 번 왔다 갔다 하는 시간, 곧 주기(period)는 T = 2π/ωn이다.
숫자로 보기
m = 2 kg, k = 8 N/m이면 ωn = √(8/2) = 2 rad/s이고, 주기는 2π/2 ≈ 3.14초다. 10 cm 당겨 놓으면 가운데를 지날 때 가장 빠르고, 그 빠르기는 x₀ωn = 0.2 m/s다. 13.3절 상자의 0.04 J과 맞아떨어진다.
| 바꾼 것 | ωn | 주기 |
|---|---|---|
| m = 2 kg, k = 8 N/m | 2 rad/s | 3.14 s |
| k를 4배 (32 N/m) | 4 rad/s (2배) | 1.57 s |
| m을 4배 (8 kg) | 1 rad/s (½배) | 6.28 s |
k/m에 제곱근이 씌워져 있어서, 4배를 바꿔야 빠르기가 2배 바뀐다.
잠깐, 생각해 보기. 같은 용수철에 질량만 2배로 달면 주기는 몇 배가 될까?
ωn이 1/√2배가 되니 주기는 √2 ≈ 1.41배다. 3.14초가 4.44초가 된다.
교수는 여기서 다음을 미리 일러 둔다. 이 k가 제어에서는 위치 이득(position gain)이 된다. 13.9절에서 모터로 용수철을 만들면, 그 용수철이 얼마나 단단한지를 우리가 고른다.
알아 두기. ωn은 rad/s로 재는 "각진동수"다. 1초에 몇 번 흔들리는지(Hz)를 물으면 f = ωn/(2π)로 바꾼다. ωn = 2 rad/s는 약 0.32 Hz다. 제어 책은 대부분 rad/s로 쓴다.
영상에서 보기: 29:04 놓으면 영원히 흔들린다 · 30:10 무거우면? 단단하면? · 31:15 고유 진동수 √(k/m) · 32:52 x = c cos(ωt + φ)
13.5 자연계 2: 댐퍼를 달면
진짜 책상에는 마찰이 있다. 덩어리 밑에 마찰을 조금 넣으면 흔들림이 점점 잦아들다가 멈춘다. 이번에는 이것을 식에 넣는다.
속도에 맞서는 힘
가장 단순한 마찰은 속도에 비례하고 방향은 반대인 힘이다. 이것을 점성 마찰(viscous friction)이라 한다.
b는 감쇠 계수(damping coefficient)다. 일부러 이런 힘을 내도록 만든 부품이 댐퍼다.
기름 속에서 피스톤이 움직이는 꼴이라 빨리 밀수록 세게 버틴다. 자동차의 쇼크 업소버가 그것이다.
이 힘은 위치 에너지에서 나오지 않는다. 그래서 라그랑주 방정식의 왼쪽(K와 U)에 넣지 못하고, 바깥에서 걸린 힘으로 오른쪽에 둔다.
이것이 2차 선형 시스템(second-order linear system)의 일반 꼴이다. 13.3절 상자에서 본 대로 매 순간의 힘의 균형으로 읽는다. 관성 + 댐퍼 + 용수철 = 0이다.
알아 두기. 실제 마찰은 이렇게 깔끔하지 않다. 속도와 상관없이 크기가 일정한 쿨롱 마찰(Coulomb friction)도 있고, 멈췄다가 움직이기 시작할 때 더 큰 정지 마찰(stiction)도 있다. 그러면 식이 선형이 아니게 된다. 이 장은 가장 단순한 b ẋ만 쓴다.
에너지는 줄기만 한다
E = ½ m ẋ² + ½ k x²를 시간으로 미분해 보자. 연쇄 법칙으로 dE/dt = m ẋ ẍ + k x ẋ = ẋ(m ẍ + k x)다. 운동 방정식에서 m ẍ + k x = −b ẋ이니 아래가 나온다.
b > 0이면 움직이는 동안 에너지가 늘 줄어든다. 줄어드는 빠르기는 속도의 제곱에 비례한다. 가장 빠른 가운데에서 가장 많이 잃고, 속도가 0인 양 끝에서는 잃지 않는다.
잃은 에너지는 댐퍼에서 열이 된다. 이렇게 에너지가 빠져나가는 시스템을 소산계(dissipative system)라 한다.
해 볼 것:
- 처음 값(강의 예제 k = 8, b = 4.8)에서 시간 t를 밀어 본다. 한 번 넘어갔다가 거의 제자리에 선다.
- b = 0으로 둔다. 에너지 선이 100%에 평평하게 머문다. 영원히 흔들린다.
- b를 0.8쯤으로 작게 둔다. 에너지가 계단처럼 줄어든다. 주황(속도)이 클 때 가파르고, 양 끝에서는 평평하다.
- b를 8로 둔다. 넘어가지 않으면서 가장 빨리 0에 다가간다. b를 20으로 키우면 오히려 느려진다.
영상에서 보기: 34:27 마찰을 조금 넣으면 · 34:57 마찰은 식의 오른쪽에 · 35:59 마찰은 비선형일 수 있다 · 36:31 2차 선형 시스템
13.6 감쇠비: 흔들릴까, 그냥 설까
그림 13-4에서 b를 바꾸면 움직임이 세 종류로 갈린다. b가 작으면 흔들리며 잦아들고, 아주 크면 한 번도 넘어가지 않고 천천히 다가간다. 그 사이에 딱 경계가 되는 b가 있다.
경계: 임계 감쇠
식을 m으로 나눈다.
이 식을 풀면, 넘어가느냐 마느냐의 경계는 b/m = 2ωn일 때다. 이때를 임계 감쇠(critically damped)라 한다. ωn = √(k/m)을 넣으면 경계의 b는 이렇다.
b가 이보다 작으면 부족 감쇠(underdamped), 크면 과감쇠(overdamped)다.
감쇠비 ζ
지금의 b가 경계의 b의 몇 배인지를 감쇠비(damping ratio) ζ(제타)로 적는다.
ζ < 1이면 흔들리고, ζ = 1이면 경계, ζ > 1이면 넘어가지 않는다. b/m = 2ζωn이므로 식을 ωn과 ζ 두 숫자만으로 쓸 수 있다.
m, b, k 세 숫자가 ωn(얼마나 빠른가)과 ζ(얼마나 잦아드는가) 두 숫자로 줄었다. 질량이 달라도 이 둘과 처음 조건이 같으면 x(t)는 똑같다.
흔들리며 잦아드는 답
ζ < 1일 때의 답은 이런 모양이다.
수학 더하기: 지수함수 e−at. e는 약 2.718인 수다. e−at는 t = 0에서 1이고, 같은 시간이 지날 때마다 같은 비율로 줄어든다. a = 1.2이면 1초 뒤 e−1.2 ≈ 0.30, 2초 뒤 0.30² ≈ 0.09다. 미분하면 −a e−at라서, 줄어드는 빠르기가 지금 값에 비례한다.
- 앞의 e−ζωnt가 진폭을 줄인다. 같은 시간이 지날 때마다 같은 비율로 줄어든다.
- 흔들리는 빠르기는 ωn이 아니라 조금 느린 ωd다. 이것을 감쇠 고유 진동수(damped natural frequency)라 한다. 주기는 2π/ωd다.
- ζ = 1이면 √(1 − ζ²) = 0이라 흔들림이 사라진다. ζ > 1이면 cos 없이 지수함수 두 개의 합이 된다.
잠깐, 생각해 보기. 컵을 든 로봇 팔이 책상 위 한 점에 내려앉는다. ζ = 0.2와 ζ = 1 가운데 어느 쪽이 좋을까?
ζ = 1이다. ζ = 0.2는 목표를 지나쳐 책상에 부딪히고 몇 번 출렁인다. 그림 13-5에서 ζ = 0.2인 선은 처음 넘어갈 때 반대쪽으로 처음 거리의 절반이 넘게(0.53) 간다.
그래서 제어에서는 대부분 임계 감쇠를 노린다. 교수도 "이것을 기억하라, 계속 쓴다"고 한다.
영상에서 보기: 37:35 b가 크면 넘어가지 않는다 · 38:37 임계 감쇠 · 41:17 감쇠비 ζ · 45:09 감쇠 고유 진동수
13.7 강의 예제: m = 2, b = 4.8, k = 8
강의는 노트를 보지 말고 직접 계산해 보라며 이 예제를 낸다. 그림 13-4의 처음 값이 바로 이것이다. 감쇠 고유 진동수 ωd를 구하자.
- 고유 진동수: ωn = √(k/m) = √(8/2) = 2 rad/s
- 감쇠비: ζ = b/(2√(km)) = 4.8/(2√16) = 4.8/8 = 0.6
- 감쇠 고유 진동수: ωd = 2√(1 − 0.6²) = 2√0.64 = 2 × 0.8 = 1.6 rad/s
댐퍼 때문에 흔들림이 2 rad/s에서 1.6 rad/s로 느려졌다. 주기로는 3.14초가 3.93초가 된다. ζ > 0이면 ωd는 언제나 ωn보다 작다.
얼마나 넘어가나
10 cm 당겼다가 놓았다고 하자. 덩어리가 처음으로 반대쪽 끝에 서는 때는 반 주기 뒤, t = π/ωd ≈ 1.96초다. 그 자리는 x = −10 × e−1.2 × 1.96 ≈ −0.95 cm다(ζωn = 1.2).
에너지로 보면 더 놀랍다. 처음 에너지는 ½ × 8 × 0.1² = 0.04 J인데, 그 자리에 남은 것은 ½ × 8 × 0.0095² ≈ 0.00036 J로 1%가 안 된다. 반대쪽으로 한 번 넘어가는 동안 에너지의 99%를 댐퍼가 열로 바꿨다.
같은 덩어리와 용수철에서 넘어가지 않게 하려면 ζ ≥ 1, 곧 b ≥ 2√(km) = 2√16 = 8 N·s/m여야 한다. 그림 13-4에서 b = 8로 맞춰 보자.
영상에서 보기: 54:13 ω는 ωn보다 큰가 작은가 · 54:46 직접 계산해 보라 · 55:17 ωn = 2, ζ = b/(2√(km)) · 56:25 2에서 1.6으로
13.8 에너지로 보는 안정성
이제 이 장에서 가장 중요한 생각에 닿았다. 에너지가 늘지 않으면 시스템은 멀리 가지 못하고, 에너지가 줄기만 하면 결국 멈춘다. 용수철과 댐퍼처럼 바깥에서 에너지를 넣지 않는 시스템을 수동 시스템(passive system)이라 한다. 그 안정성을 이렇게 따질 수 있다.
그릇 속의 공
공을 그릇 가장자리 가까이에서 놓는다.
- (가) 마찰이 없으면: 반대쪽 같은 높이까지 올라갔다 돌아온다. 에너지가 그대로라 그 높이를 넘지 못한다. 멀리 달아나지 않으니 안정(stable)하지만, 바닥에 서지는 않는다.
- (나) 마찰이 있으면: 갈 때마다 조금씩 낮게 올라가다 바닥에 선다. 이렇게 목표에 다가가 멈추는 것을 점근 안정(asymptotically stable)이라 한다. 제어에서 원하는 것이 이것이다.
- (다) 에너지를 넣으면: 누가 공이 움직이는 쪽으로 계속 밀어 준다고 하자. 공은 점점 높이 올라가다 그릇 밖으로 튀어 나간다. 불안정(unstable)이다.
식으로 쓰면
질량–용수철–댐퍼의 전체 에너지는 E = ½ m ẋ² + ½ k x²다. 두 항 모두 0 이상이라 E ≥ 0이다. E = 0은 x = 0에서 멈춰 있을 때, 곧 그릇 바닥뿐이다.
- 안정: E가 늘지 않으면 ½ k x²는 처음 에너지 E(0)를 넘지 못한다. 그래서 덩어리는 처음 거리보다 멀리 가지 못한다.
- 점근 안정: 움직이는 동안 E가 꼭 줄어들면(dE/dt = −b ẋ² < 0), E는 줄고 줄어 결국 더 줄 수 없는 곳에서 선다. 덩어리가 x ≠ 0에서 잠깐 멈춰도 용수철이 다시 밀어 움직인다. 그러니 계속 멈춰 있을 수 있는 곳은 x = 0뿐이다.
조건을 일반적으로 쓰면 이렇다. 위치 에너지에서 나오지 않는 덧붙인 힘을 Fs라 하자. Fs가 언제나 속도에 맞서는 쪽이면 된다.
Fsᵀẋ는 덧붙인 힘이 1초에 하는 일(일률)이고, 바로 dE/dt다. 관절이 여럿이면 Fs와 ẋ가 벡터이고, 두 벡터의 내적이 음수라는 뜻이다. 가장 간단한 것이 Fs = −b ẋ(b > 0)다.
에너지를 닮은 양이 늘지 않음을 보여 안정성을 따지는 이 방법을 리아푸노프 방법(Lyapunov method)이라 한다. 러시아 수학자 리아푸노프가 1892년에 내놓았다. 여기서는 물리 에너지를 그대로 썼고, 15장에서 같은 생각으로 여러 관절 팔의 PD 제어가 안정한 까닭을 보인다.
잠깐, 생각해 보기. 13.4절의 마찰 없는 질량–용수철은 안정한가, 점근 안정한가?
안정하지만 점근 안정하지는 않다. 에너지가 그대로라 처음 거리 x₀를 넘지는 않는다. 하지만 바닥(x = 0)에 서지 않고 영원히 오간다.
강의 시연: 마찰을 지우면 위험하다
한 학생이 "b가 자세에 따라 바뀌면 어떻게 하나?" 하고 묻는다. 교수는 그런 마찰은 모델로 만들어 빼 주면 된다고 답한다. 그러면서 마찰을 빼는 일은 아주 위험하다며 PUMA 팔 시뮬레이션으로 보여 준다.
관절마다 용수철 k = 400과 댐퍼 b = 40이 달려 있다. b를 4로, 다시 0으로 줄이자 팔이 점점 쉽게 움직인다. 타고난 마찰까지 지우려고 b를 음수(−9)로 넣자 팔이 흔들리며 불안정해진다.
b < 0이면 dE/dt = −b ẋ² > 0이다. 그림 13-6 (다)처럼 움직일 때마다 에너지를 넣는 셈이다. 교수의 결론은 짧다. "음의 감쇠는 하지 마라."
알아 두기. 진짜 용수철과 댐퍼는 에너지를 만들지 못하니 스스로 불안정해지지 않는다. 모터는 다르다. 에너지를 넣을 수 있어서, 제어기의 부호 하나만 틀려도 팔을 마구 흔들 수 있다. 제어기를 처음 돌릴 때는 이득을 작게 두고, 언제든 바로 끌 수 있게 준비한다.
영상에서 보기: 49:53 마찰을 빼는 것은 위험하다 · 53:02 음의 감쇠는 불안정 · 1:04:50 점근 안정이란 · 1:06:22 힘과 속도의 내적이 음수면
13.9 모터로 용수철을 만든다: PD 제어의 시작
자연계에서 배운 것을 이제 로봇에 옮긴다. 강의의 마지막 부분이다.
가장 단순한 로봇: 레일 위의 질량
직동 관절 하나뿐인 로봇을 생각한다. 질량 m인 링크가 레일 위를 미끄러지고, 모터가 힘 f로 민다. 마찰과 중력은 없다고 둔다.
운동 방정식은 m ẍ = f다. 이 링크를 지금 자리에서 목표 xd로 보내고 싶다.
목표에 바닥이 있는 위치 에너지
13.1절의 그릇을 직접 만든다. xd에서 0이고 다른 곳에서는 모두 양수인 위치 에너지를 고른다. 가장 쉬운 것이 2차식이다.
모터가 이 위치 에너지의 기울기에 빼기를 붙인 힘을 내게 한다. 진짜 용수철과 똑같은 힘이다.
넣으면 m ẍ + kp(x − xd) = 0이다. 13.3절의 질량–용수철에서 용수철이 쉬는 자리가 0에서 xd로 옮겨졌을 뿐이다.
kp가 13.4절에서 예고한 위치 이득이다. 우리가 만든 용수철의 단단함이다. 진짜 용수철은 없고 모터가 그 힘을 흉내 내므로 가상 용수철(virtual spring)이라 부른다.
안정하지만 멈추지 않는다
라그랑주 식으로 보면 더 분명하다. 모터 힘이 위치 에너지의 기울기라서, 오른쪽에 있던 f를 Ugoal로 바꿔 왼쪽으로 옮길 수 있다.
남은 것은 운동 에너지와 위치 에너지뿐이고, 바깥 힘은 0이다. 13.8절대로 안정하다.
강의는 이것이 관절이 몇 개든 성립한다고 강조한다. 모터 힘을 목표에 바닥이 있는 위치 에너지의 기울기로 만들면 안정성이 보장된다.
하지만 13.4절대로 영원히 흔들린다. 그래서 댐퍼를 더한다.
댐퍼를 더하면 PD 제어
13.8절의 조건은 "덧붙인 힘이 속도에 맞선다"였다. 가장 간단한 −kvẋ(kv > 0)를 더한다.
이것이 PD 제어(proportional-derivative control)다. P(비례)는 위치 오차에 비례하는 몫, D(미분)는 오차의 미분에 비례하는 몫이다.
목표가 멈춰 있으니 오차 x − xd의 미분은 ẋ다. kv를 속도 이득(velocity gain)이라 한다.
넣으면 닫힌 루프의 식이 13.5절과 같은 모양이 된다.
kp가 용수철, kv가 댐퍼 자리에 들어갔다. 그러니 13.4~13.6절의 결과를 그대로 쓴다.
자연계의 ωn과 ζ는 주어진 값이었다. 이제는 kp와 kv를 골라 우리가 정한다.
관절 하나: 종이 팔의 팔꿈치
회전 관절도 똑같다. 질량 대신 관성, 힘 대신 토크다.
종이 팔의 팔뚝(링크 1)을 잡아 두고 팔꿈치만 돌리면, 팔꿈치가 느끼는 관성은 12장의 M₂₂ = 320 g·cm²(3.2 × 10⁻⁵ kg·m²)다. 책상 위라 중력은 없다.
τ = −kp(θ − θd) − kvθ̇로 제어하면, 팔꿈치는 목표 각도 θd 쪽에 비틀림 용수철과 댐퍼가 달린 것처럼 움직인다. kp = 3.2 mN·m/rad이면 ω = √(0.0032/0.000032) = √100 = 10 rad/s다.
해 볼 것:
- 처음 값(kp = 3.2, kv = 0.32)은 ζ = 0.5다. 목표를 16% 지나쳤다가 돌아온다.
- kv를 0.64로 올린다. ζ = 1이라 넘어가지 않는다.
- kv = 0이면 0°와 2θd 사이를 영원히 오간다. 13.4절의 질량–용수철 그대로다.
- kp를 4배(12.8)로 올리면 빨라진다(ω = 20 rad/s). kv가 그대로면 ζ가 절반(0.25)이 되어 더 출렁인다.
잠깐, 생각해 보기. kp를 크게 할수록 빠르고 단단해진다. 그러면 kp를 끝없이 키우면 되지 않을까?
안 된다. 모터가 낼 수 있는 토크에는 한계가 있고, 센서 잡음, 제어 주기의 지연, 링크가 조금 휘는 것도 이득이 클수록 크게 드러난다. 얼마나 크게 잡을지는 14장의 주제다.
다음 장으로
강의는 "ω를 크게 할까, 작게 할까?"를 묻고 끝난다. ω가 작으면 느리고 무르다. 빠르고 단단하게 하려면 kp를 키워야 하는데 한계가 있다.
14장에서 원하는 ω와 ζ로 kp, kv를 고르는 법, 외란과 정상 상태 오차, PID를 배운다. 15장에서는 관절이 여럿이고 M(q)가 자세마다 바뀌는 팔 전체로 넓힌다.
영상에서 보기: 56:56 1자유도 로봇 · 58:31 목표에 바닥이 있는 위치 에너지 · 1:01:07 자유도가 몇이든 안정 · 1:06:54 이것이 PD 제어
13.10 연습문제
계산기를 옆에 두고 푼다. 답은 문제 7개 아래에 있다.
- 질량 m = 0.5 kg, 용수철 k = 50 N/m인 질량–용수철이 있다(마찰 없음).
- ωn과 주기 T를 구하라.
- 4 cm 당겼다가 놓았다. 가장 빠른 속도와 그때의 운동 에너지를 구하라.
- 2의 운동 에너지를 처음 위치 에너지와 견주어라.
- 아래 세 시스템의 ωn, ζ와 종류를 말하라. ζ < 1이면 ωd도 구하라.
- ẍ + 4ẋ + 4x = 0
- ẍ + ẋ + 4x = 0
- 2ẍ + 10ẋ + 2x = 0
- 강의 예제(m = 2 kg, k = 8 N/m)에서 댐퍼를 b = 2.4 N·s/m로 바꾸었다. ζ와 ωd를 구하라. 13.7절(b = 4.8)과 비교하면 무엇이 달라지나?
- 강의 예제(m = 2, b = 4.8, k = 8)의 덩어리가 0.15 m/s로 지나는 순간, 에너지는 1초에 얼마씩 줄어드는가? 끝에서 멈춘 순간에는?
- 팔꿈치(I = 3.2 × 10⁻⁵ kg·m²)에 타고난 점성 마찰 b = 0.2 mN·m·s/rad가 있다. 제어기는 kp = 3.2 mN·m/rad의 가상 용수철을 만들고, 마찰을 지운다며 속도와 같은 쪽으로 0.5 θ̇ mN·m를 더 민다.
- 전체 감쇠 계수는 얼마인가?
- 팔꿈치를 살짝 건드리면 어떻게 되나? 에너지로 설명하라.
- 속도 이득 kv를 더해 점근 안정하게 하려면 kv는 얼마보다 커야 하나?
- 종이 팔 팔꿈치(I = 3.2 × 10⁻⁵ kg·m²)를 kp = 12.8 mN·m/rad, kv = 0.64 mN·m·s/rad로 PD 제어한다.
- ω와 ζ를 구하라.
- 손에 물건을 쥐어 팔꿈치의 관성이 2배가 되었다. ω와 ζ는 어떻게 되나?
- 2에서 다시 ζ = 0.5로 하려면 kv를 얼마로 바꿔야 하나?
- 컴퓨터처럼 걸음으로 풀어 보자. m ẍ + k x = 0(m = 2 kg, k = 8 N/m)을 x₀ = 0.1 m, 처음 속도 0에서 Δt = 0.1초로 두 걸음 간다. 걸음은 xk+1 = xk + vkΔt, vk+1 = vk + akΔt이고, ak = −k xk/m이다.
- t = 0.2초의 x와 v를 정확한 답 x₀ cos(ωnt), −x₀ωn sin(ωnt)와 비교하라.
- 걸음마다 에너지가 1 + ωn²Δt²배가 됨을 보여라. 마찰이 없는데 왜 에너지가 늘까?
답
답 1.
- ωn = √(50/0.5) = √100 = 10 rad/s, T = 2π/10 ≈ 0.63 s다.
- 가장 빠른 때는 가운데를 지날 때이고, 빠르기는 x₀ωn = 0.04 × 10 = 0.4 m/s다. K = ½ × 0.5 × 0.4² = 0.04 J다.
- 처음 위치 에너지도 ½ × 50 × 0.04² = 0.04 J다. 같다. 위치 에너지가 모두 운동 에너지로 바뀌었다.
답 2.
- ωn = √4 = 2 rad/s, ζ = 4/(2 × 2) = 1, 임계 감쇠다. 넘어가지 않는다.
- ωn = 2 rad/s, ζ = 1/(2 × 2) = 0.25, 부족 감쇠다. ωd = 2√(1 − 0.0625) ≈ 1.94 rad/s다.
- ωn = √(2/2) = 1 rad/s, ζ = 10/(2√(2 × 2)) = 2.5, 과감쇠다. 천천히 다가간다.
답 3. ζ = 2.4/(2√16) = 2.4/8 = 0.3이다. ωd = 2√(1 − 0.09) = 2√0.91 ≈ 1.91 rad/s다.
b가 절반이 되니 ζ도 절반이다. 흔들림은 ωn = 2에 더 가깝게 빨라지고, 잦아드는 빠르기 ζωn은 1.2에서 0.6으로 느려진다. 더 오래, 더 크게 출렁인다.
답 4. dE/dt = −b ẋ² = −4.8 × 0.15² = −0.108 W다. 1초에 0.108 J씩 줄어드는 빠르기다.
끝에서 멈춘 순간에는 ẋ = 0이라 0이다. 그 순간에는 에너지가 줄지 않는다.
답 5.
- 0.2 − 0.5 = −0.3 mN·m·s/rad다. 감쇠가 음수가 되었다.
- dE/dt = −b θ̇² = +0.3 × 10⁻³ θ̇² > 0이다. 움직일 때마다 에너지가 늘어 흔들림이 점점 커지니 불안정하다. 파이썬으로 0.1 rad에서 놓아 보면 1초 만에 에너지가 약 2만 배가 된다.
- 전체 감쇠 0.2 − 0.5 + kv가 0보다 커야 하니 kv > 0.3 mN·m·s/rad다. 차라리 마찰을 지우지 않는 편이 안전하다.
답 6.
- ω = √(0.0128/0.000032) = √400 = 20 rad/s다. ζ = 0.00064/(2√(0.0128 × 0.000032)) = 0.00064/(2 × 0.00064) = 0.5다.
- 관성이 2배면 ω는 1/√2배로 14.1 rad/s, ζ도 1/√2배로 0.35다. 같은 이득인데 느려지고 더 출렁인다. 쥔 물건에 따라 관성이 바뀌는 문제는 14장에서 다룬다.
- ζ = kv/(2√(kpI))에서 kv = 2 × 0.5 × √(0.0128 × 0.000064) ≈ 0.000905다. kv ≈ 0.905 mN·m·s/rad, 원래의 √2배다.
답 7.
-
ωn² = k/m = 4라 a = −4x다.
- 첫 걸음: a₀ = −0.4, x₁ = 0.1 + 0 × 0.1 = 0.1, v₁ = 0 − 0.4 × 0.1 = −0.04다.
- 둘째 걸음: a₁ = −0.4, x₂ = 0.1 − 0.04 × 0.1 = 0.096, v₂ = −0.04 − 0.04 = −0.08이다.
- 정확한 답은 x = 0.1 cos 0.4 ≈ 0.0921, v = −0.2 sin 0.4 ≈ −0.0779다. 걸음으로 푼 답이 조금씩 바깥으로 벗어났다.
-
k = mωn²이라 에너지는 E = ½ m(v² + ωn²x²)로 쓸 수 있다. 한 걸음 뒤의 에너지를 펼치면 가운데 항 −2ωn²x v Δt와 +2ωn²x v Δt가 지워진다.
Δt = 0.1초면 걸음마다 1.04배다. 실제로 0.04 J → 0.0416 J → 0.0433 J로 는다.
이 걸음은 지금의 속도와 위치로 곧게 나아가서, 원을 그려야 할 움직임에서 매번 조금씩 바깥으로 벗어난다. 계산 방법이 음의 감쇠처럼 에너지를 넣는 셈이다. 걸음을 줄이거나, 속도를 먼저 고치고 새 속도로 위치를 고치면 훨씬 낫다(아래 코드).
파이썬으로 확인
파이썬(numpy)이 있으면 아래를 붙여 넣어 돌려 본다. 주석의 값이 그대로 나온다.
질량–용수철–댐퍼를 세 가지 걸음으로 풀어 정확한 답과 견준다. 옛 값으로만 걷는 오일러, 속도를 먼저 고치는 오일러, 그림이 쓰는 룽게-쿠타 4단이다. 마찰이 없을 때 첫 번째는 10초 만에 에너지가 0.04 J에서 0.06 J로 는다.
import numpy as np
def params(m, b, k):
"""고유 진동수 ω_n, 감쇠비 ζ, 감쇠 고유 진동수 ω_d (ζ ≥ 1이면 0)."""
wn = np.sqrt(k / m)
z = b / (2 * np.sqrt(k * m))
wd = wn * np.sqrt(max(0.0, 1 - z * z))
return round(float(wn), 3), round(float(z), 3), round(float(wd), 3)
def exact(t, m, b, k, x0):
"""x0에서 멈춘 채로 놓았을 때의 정확한 답 x(t)."""
wn = np.sqrt(k / m)
z = b / (2 * np.sqrt(k * m))
s = z * wn
if z < 1:
wd = wn * np.sqrt(1 - z * z)
return x0 * np.exp(-s * t) * (np.cos(wd * t) + s / wd * np.sin(wd * t))
if z == 1:
return x0 * (1 + wn * t) * np.exp(-wn * t)
r1, r2 = -wn * (z - np.sqrt(z * z - 1)), -wn * (z + np.sqrt(z * z - 1))
return x0 * (r2 * np.exp(r1 * t) - r1 * np.exp(r2 * t)) / (r2 - r1)
def simulate(m, b, k, x0, dt, T, how):
"""m ẍ + b ẋ + k x = 0을 x0, 속도 0에서 Δt 걸음으로 T초 푼다.
돌려주는 것: 끝의 x, v, 댐퍼가 열로 바꾼 에너지, 가는 동안 가장 큰 x."""
acc = lambda x, v: -(b * v + k * x) / m
x, v, lost, top = x0, 0.0, 0.0, x0
for _ in range(round(T / dt)):
lost += b * v * v * dt
if how == 'euler': # 옛 속도로 위치, 옛 위치로 속도
x, v = x + v * dt, v + acc(x, v) * dt
elif how == 'semi': # 속도를 먼저 고치고, 새 속도로 위치
v = v + acc(x, v) * dt
x = x + v * dt
else: # 룽게-쿠타 4단
a1 = acc(x, v); x2, v2 = x + dt / 2 * v, v + dt / 2 * a1
a2 = acc(x2, v2); x3, v3 = x + dt / 2 * v2, v + dt / 2 * a2
a3 = acc(x3, v3); x4, v4 = x + dt * v3, v + dt * a3
a4 = acc(x4, v4)
x, v = x + dt / 6 * (v + 2 * v2 + 2 * v3 + v4), v + dt / 6 * (a1 + 2 * a2 + 2 * a3 + a4)
top = max(top, x)
return x, v, lost, top
E = lambda m, k, x, v: 0.5 * m * v**2 + 0.5 * k * x**2
# 13.4 m = 2 kg, k = 8 N/m: ω_n, 주기, 10 cm에서 놓을 때 가장 빠른 속도
wn = params(2, 0, 8)[0]
print(wn, round(2 * np.pi / wn, 2), 0.1 * wn) # 2.0 3.14 0.2
# 13.7 강의 예제 m = 2, b = 4.8, k = 8
print(params(2, 4.8, 8), round(2 * np.pi / 1.6, 2)) # (2.0, 0.6, 1.6) 3.93
t1 = np.pi / 1.6 # 처음 반대쪽 끝에 서는 때
x1 = exact(t1, 2, 4.8, 8, 0.1)
print(round(t1, 2), round(100 * x1, 2), round(100 * E(2, 8, x1, 0) / E(2, 8, 0.1, 0), 2)) # 1.96 -0.95 0.9
print(2 * np.sqrt(8 * 2)) # 8.0 임계 감쇠의 b
# 13.5 첫 1초 동안 줄어든 에너지 = 댐퍼가 열로 바꾼 ∫ b ẋ² dt
x, v, lost, _ = simulate(2, 4.8, 8, 0.1, 1e-4, 1.0, 'rk4')
print(round(E(2, 8, 0.1, 0) - E(2, 8, x, v), 5), round(lost, 5)) # 0.03245 0.03245
# 13.6 ζ = 0.2이면 처음 넘어갈 때 반대쪽으로 0.53
print(round(exact(np.pi / (2 * np.sqrt(1 - 0.04)), 1, 0.8, 4, 1.0), 3)) # -0.527
# 걸음 세 가지와 정확한 답 (Δt = 0.01 s): 끝의 x와 에너지
for b, T in ((0.0, 10.0), (4.8, 1.0)):
print('b =', b, 't =', T, '정확한 답', round(exact(T, 2, b, 8, 0.1), 5))
for how in ('euler', 'semi', 'rk4'):
x, v, _, _ = simulate(2, b, 8, 0.1, 0.01, T, how)
print(' ', how, round(x, 5), round(E(2, 8, x, v), 5))
# b = 0.0 t = 10.0 정확한 답 0.04081
# euler 0.05014 0.05967 ← 마찰이 없는데 에너지가 0.04 → 0.06 J
# semi 0.03986 0.03971
# rk4 0.04081 0.04
# b = 4.8 t = 1.0 정확한 답 0.0217
# euler 0.02123 0.00753
# semi 0.0211 0.00739
# rk4 0.0217 0.00755
# 문제 2, 3: (ω_n, ζ, ω_d)
for mbk in ((1, 4, 4), (1, 1, 4), (2, 10, 2), (2, 2.4, 8)):
print(mbk, params(*mbk))
# (1, 4, 4) (2.0, 1.0, 0.0) / (1, 1, 4) (2.0, 0.25, 1.936) / (2, 10, 2) (1.0, 2.5, 0.0) / (2, 2.4, 8) (2.0, 0.3, 1.908)
# 문제 4: 에너지가 줄어드는 빠르기 dE/dt = −b v² (W)
print(round(-4.8 * 0.15**2, 3)) # -0.108
# 문제 5: 감쇠 합 0.2 − 0.5 = −0.3 mN·m·s/rad, k_p = 3.2 mN·m/rad, I = 3.2e-5 kg·m²
x, v, _, _ = simulate(3.2e-5, -0.3e-3, 3.2e-3, 0.1, 1e-4, 1.0, 'rk4')
print(round(E(3.2e-5, 3.2e-3, x, v) / E(3.2e-5, 3.2e-3, 0.1, 0))) # 19646 (1초 만에 약 2만 배)
# 13.9 그림 13-8 처음 값: 오차 −1에서 출발, 0을 지나친 만큼이 넘어간 비율
I = 3.2e-5
_, _, _, top = simulate(I, 0.32e-3, 3.2e-3, -1.0, 1e-4, 2.0, 'rk4')
print(params(I, 0.32e-3, 3.2e-3)[:2], round(100 * top, 1)) # (10.0, 0.5) 16.3
# 문제 6: 팔꿈치 PD, k_p = 12.8 mN·m/rad, k_v = 0.64 mN·m·s/rad
print(params(I, 0.64e-3, 12.8e-3)[:2], params(2 * I, 0.64e-3, 12.8e-3)[:2]) # (20.0, 0.5) (14.142, 0.354)
print(round(2 * 0.5 * np.sqrt(12.8e-3 * 2 * I) * 1e3, 3)) # 0.905 (mN·m·s/rad)
# 문제 7: Δt = 0.1 s 오일러 두 걸음과 정확한 답
x, v = 0.1, 0.0
for _ in range(2):
x, v = x + v * 0.1, v - 4 * x * 0.1
print(round(x, 4), round(v, 4), round(E(2, 8, x, v), 6)) # 0.1 -0.04 0.0416 / 0.096 -0.08 0.043264
print(round(0.1 * np.cos(0.4), 4), round(-0.2 * np.sin(0.4), 4)) # 0.0921 -0.0779
스탠퍼드 숙제
스탠퍼드 강의 페이지의 Homework 6에서 1번 (a)는 이 장으로 풀 수 있다. 수동 시스템의 고유 진동수와 감쇠비를 구하고 종류를 말하는 문제다. 1번 (b)는 13.9절의 PD 식으로 시작할 수 있지만, 이득을 고르는 법은 14장에서 배운다.
1번 (c), (d)와 2번(제어 분할, 외란과 정상 상태 오차, 자세마다 바뀌는 관성)은 14장을 배운 뒤에 푼다. 풀이는 같은 페이지의 Solution 6에 있다.
다 풀었으면 13강 영상을 한 번 본다.