상태: 초안 (2026-10-18), 실측. 숫자는 노트북(Apple M1 Max, macOS 26.5)의 Python 3.9.6·numpy 2.0.2 로 계산한 수치 시뮬레이션 값입니다. 관절·팔·모터의 물리 상수는 가정값이고, 실제 모터와 제어기로 잰 값은 하나도 없습니다(하드웨어 미실측). 원자료와 코드: 작업 디렉터리
measure/robot-arm-basics/의m09_control.py,out/m09_control.json. 참고 자료는 2026-10-18 에 열람했습니다. 작성 규칙: 실측 데이터가 기본이고, 못 잰 것은 「미실측」, 확인하지 못한 것은 「미확인」으로 표시합니다.
목차
1. 직관: 따라가기의 두 가지 방법
앞 차를 따라가는 운전자를 생각합니다. 한 운전자는 앞 차와의 거리만 봅니다. 멀어지면 밟고 가까워지면 뗍니다. 늘 한 박자 늦습니다. 다른 운전자는 앞 차의 브레이크등과 도로 표지판을 보고 앞 차가 무엇을 할지 미리 압니다. 그래서 거리가 벌어지기 전에 밟습니다. 앞의 것이 되먹임(feedback), 뒤의 것이 앞먹임(feedforward)입니다.
탁구 로봇의 궤적은 8편에서 이미 다 계산되어 있습니다. 매 순간 원하는 위치·속도·가속도를 압니다. 그러니 앞먹임을 쓰지 않을 이유가 없습니다. 되먹임은 모델이 틀린 만큼만 고치면 됩니다. 이 글은 그 차이가 얼마나 큰지, 그리고 제어 주기와 모터 안쪽의 전류 루프가 왜 중요한지를 시뮬레이션으로 잽니다.
2. 그림: 제어의 층
- 궤적 생성기(8편)가 q_r, q̇_r, q̈_r 를 냅니다.
- 위치·속도 루프가 오차에 따라 토크를 정하고, 역동역학으로 계산한 토크를 더합니다. 이 시리즈의 시뮬레이션은 1 kHz 입니다.
- 전류 루프는 토크 명령을 모터 전류로 바꿉니다. 브러시리스 모터의 토크는 회전자 자석과 직교하는 방향의 전류 i_q 에 비례하므로, 3상 전류를 회전자 기준 좌표(d·q 축)로 바꿔 i_q 만 제어합니다. 이것이 FOC(field oriented control, 벡터 제어)입니다.
오픈소스 모터 제어기를 보면 층마다 주기가 다릅니다. moteus 는 위치 루프와 전류 루프를 모두 스위칭 주파수(기본 30 kHz)로 돌린다고 문서에 적혀 있습니다. ODrive 0.6.12 문서는 제어 루프 반복 횟수 카운터를 설명하며 8 kHz 제어 루프 주파수를 가정합니다. 그 위의 로봇 제어기는 대개 훨씬 느립니다. Koç 외 2018 의 탁구 로봇은 500 Hz 실시간 제어, Google 2023 의 학습 정책은 100 Hz, Google DeepMind 2024 의 저수준 기술은 50 Hz 로 명령을 냈습니다.
3. 계산
3.1 PID 와 피드포워드
PD: τ = K_p e + K_d ė e = q_r − q
PID: τ = K_p e + K_d ė + K_i ∫e dt
PD + 앞먹임: τ = J q̈_r + b q̇_r + τ_c sign(q̇_r) + K_p e + K_d ė
└ 역동역학(관성·점성·쿨롱 마찰) ┘ └ 되먹임 ┘
이득은 관성 J 에 맞춰 목표 대역폭 ω_n 으로 정했습니다: K_p = J ω_n², K_d = 2 J ω_n(임계 감쇠). 모든 비교는 같은 ω_n = 2π·20 Hz 를 씁니다.
3.2 계산 토크 제어
팔에 관절이 여럿이면 한 관절의 가속이 다른 관절에 힘을 줍니다(관성 결합). 원심력·코리올리 힘과 중력도 자세마다 다릅니다. 팔 전체의 운동 방정식은 다음과 같습니다.
M(q) q̈ + C(q, q̇) q̇ + g(q) = τ
계산 토크(computed torque) 제어는 이 식을 그대로 써서 결합을 지웁니다. Modern Robotics 식 (11.35)가 이 형태이고, 같은 책은 실무에서 K_i 를 흔히 0 으로 둔다고 적습니다.
τ = M̃(q) (q̈_r + K_p e + K_d ė) + C̃(q, q̇) q̇ + g̃(q) (~ 는 모델 값)
모델이 맞으면 각 관절의 오차는 ë + K_d ė + K_p e = 0 이라는 서로 독립인 2차 방정식을 따릅니다.
3.3 전류 루프
q축 전류는 상 저항 R 과 인덕턴스 L 의 1차 회로입니다. PI 이득을 K_p = L ω_c, K_i = R ω_c 로 두면 회로의 극을 지우고 대역폭 ω_c 의 1차 응답이 됩니다. 디지털 제어기는 측정한 전류로 계산한 전압을 다음 주기에 내므로, 루프 주기에 비해 ω_c 가 너무 크면 이 한 주기 지연 때문에 흔들립니다.
3.4 시뮬레이션 설정
- 관절 하나: 관성 J = 0.015 kg·m², 점성 b = 0.02 N·m·s, 쿨롱 마찰 0.1 N·m, 토크 한계 6 N·m. 시뮬레이션 적분은 20 µs 간격, 제어기는 주기마다 위치·속도를 읽고 계산한 토크를 다음 주기에 냅니다(한 주기 지연).
- 기준 궤적: 8편의 타격 궤적. 0.6 rad 를 0.12 s 에 지나며 10 rad/s(가속도 0)에 닿고, 0.1 s 동안 멈춘 뒤 0.1 s 정지.
- 2링크 수직 팔: 링크 0.40·0.35 m, 질량 1.2·0.7 kg, 중력 있음. 두 관절이 동시에 0.15 s 에 각각 6·8 rad/s 로 타격 자세를 지나고 0.1 s 에 멈춥니다. 이 궤적의 역동역학 최대 토크는 1번 관절 39.9 N·m, 2번 관절 17.4 N·m 였습니다.
4. 실측(시뮬레이션)
4.1 제어기와 제어 주기
| 주기 | 제어기 | 최대 오차 | RMS 오차 | 타격 순간 위치 오차 | 타격 순간 속도 오차 |
|---|---|---|---|---|---|
| 1 kHz | PD | 8.5 mrad | 5.1 mrad | 4.3 mrad | −0.20 rad/s |
| 1 kHz | PID | 10.3 | 5.1 | −1.0 | −0.22 |
| 1 kHz | PD + 앞먹임 | 0.42 | 0.28 | −0.29 | −0.007 |
| 2 kHz | PD + 앞먹임 | 0.21 | 0.14 | −0.15 | −0.003 |
| 500 Hz | PD + 앞먹임 | 0.86 | 0.46 | −0.58 | −0.014 |
| 200 Hz | PD | 39.9 | 17.5 | −2.6 | 2.25 |
| 200 Hz | PD + 앞먹임 | 34.8 | 14.4 | 1.1 | 3.37 |
- 앞먹임 하나로 오차가 20배 넘게 줄었습니다. PD 는 오차가 생겨야 토크를 내므로 가속 구간 내내 뒤처집니다. 앞먹임은 필요한 토크를 미리 냅니다.
- 적분 항(PID)은 오히려 나빴습니다. 0.2초짜리 빠른 운동에서 적분은 쌓였다가 늦게 풀리며 넘침(overshoot)을 만듭니다. 적분은 중력처럼 천천히 바뀌는 치우침을 지우는 도구이지, 빠른 궤적 추종의 도구가 아닙니다.
- 주기는 거의 선형으로 오차를 바꾸다가 어느 선에서 무너집니다. 앞먹임이 있을 때 2 kHz → 1 kHz → 500 Hz 에서 최대 오차가 0.21 → 0.42 → 0.86 mrad 로 두 배씩 늘었습니다. 한 주기 지연이 그대로 오차가 되기 때문입니다. 200 Hz(5 ms)에서는 0.12초 휘두르기에 제어 기회가 24번뿐이라 앞먹임도 계단처럼 나가고, 지연 5 ms 가 20 Hz 이득과 맞물려 크게 출렁였습니다. 타격 순간 속도 오차 3.4 rad/s 는 팔 길이 0.5 m 로 라켓 약 1.7 m/s 이고, 7편의 「0.1 m/s 에 10 cm」를 그대로 늘리면 착지점이 1 m 넘게 빗나가는 크기입니다.
이득을 올리면 어떨까요. ω_n 을 2π·40 Hz 로 두 배 올린 PD 는 1 kHz 에서 최대 오차가 8.5 → 2.2 mrad 로 줄었지만, 200 Hz 에서는 134 mrad 로 거의 발산했습니다. 느린 루프에서 이득을 올리는 것은 위험하고, 빠른 루프에서도 앞먹임보다 못합니다.
모델이 틀린 앞먹임도 쟀습니다. 관성을 20% 작게 또는 크게 잡은 앞먹임(1 kHz)의 최대 오차는 1.8·1.9 mrad 였습니다. 정확한 모델(0.42)보다는 4배 나쁘지만 PD(8.5)보다는 여전히 4배 좋습니다.
4.2 전류 루프의 지연이 위치 루프에 주는 영향
위 실험은 명령한 토크가 곧바로 나온다고 가정했습니다. 실제로는 전류 루프가 토크를 만드는 데 시간이 걸립니다. 토크가 대역폭 f_i 의 1차 지연으로 나온다고 두고 1 kHz PD + 앞먹임의 오차를 다시 쟀습니다.
| 전류(토크) 대역폭 | 최대 오차 | RMS 오차 | 타격 순간 속도 오차 |
|---|---|---|---|
| 지연 없음 | 0.42 mrad | 0.28 mrad | −0.007 rad/s |
| 1,000 Hz | 0.46 | 0.31 | −0.007 |
| 300 Hz | 0.58 | 0.35 | −0.009 |
| 100 Hz | 0.90 | 0.48 | −0.014 |
| 50 Hz | 1.42 | 0.68 | −0.021 |
전류 루프 대역폭이 위치 루프 주기(1 kHz)와 비슷하면 거의 차이가 없고, 100 Hz 아래로 내려가면 오차가 두세 배가 됩니다. 「안쪽 루프는 바깥 루프보다 충분히 빨라야 한다」는 계층 제어의 원칙이 이 숫자입니다.
4.3 전류 루프 자체: 30 kHz 에서 얼마나 빠르게 할 수 있나
상 저항 0.2 Ω, 인덕턴스 100 µH 의 q축 전류를 30 kHz PI 로 10 A 계단 응답시켰습니다(전압 한계 48 V, 한 주기 지연).
| 목표 대역폭 | 10→90% 상승 시간 | 이상적 1차 응답 | 오버슈트 |
|---|---|---|---|
| 500 Hz | 578 µs | 700 µs | 0% |
| 1 kHz | 212 µs | 350 µs | 0% |
| 2 kHz | 63 µs | 175 µs | 16.5% |
| 4 kHz | 30 µs | 88 µs | 84% |
| 8 kHz | 17 µs | 44 µs | 200% |
목표 대역폭이 루프 주파수의 15분의 1(2 kHz)을 넘자 오버슈트가 생겼고, 4분의 1(8 kHz)에서는 사실상 발진했습니다. 한 주기 지연(33 µs)이 위상을 깎기 때문입니다. 그래서 30 kHz 전류 루프로 얻을 수 있는 실용 대역폭은 1~2 kHz 이고, 그 위의 위치 루프는 수백 Hz~1 kHz, 그 위의 로봇 정책은 수십~수백 Hz 가 됩니다. 층마다 약 10배씩 느려지는 구조입니다.
4.4 2링크 팔: 결합과 중력
| 제어기(1 kHz, 토크 한계 60 N·m) | 최대 오차 | RMS | 타격 순간 위치 / 속도 오차 |
|---|---|---|---|
| PD | 41.0 mrad | 20.0 | 30.7 mrad / 0.95 rad/s |
| PD + 중력 보상 | 37.8 | 18.8 | 27.9 / 0.92 |
| 계산 토크(정확한 모델) | 1.7 | 0.83 | 1.0 / 0.11 |
| 계산 토크(질량 20% 작게) | 10.5 | 4.7 | 8.4 / 0.28 |
| 계산 토크(질량 20% 크게) | 7.0 | 3.1 | 7.0 / 0.03 |
- 중력만 보상해서는 거의 나아지지 않았습니다. 빠른 휘두르기에서 지배적인 것은 중력이 아니라 관성과 결합 항입니다.
- 계산 토크는 PD 의 24분의 1 오차를 냈고, 질량을 20% 틀려도 PD 보다 4~6배 좋았습니다.
토크 한계를 30 N·m 로 낮추면(궤적이 요구하는 40 N·m 보다 작음) 계산 토크의 최대 오차가 264 mrad, PD 가 218 mrad 로 둘 다 무너졌습니다. 제어기는 불가능한 궤적을 구해 주지 못합니다. 궤적을 만들 때(8편) 역동역학 토크가 한계 안인지 먼저 확인해야 합니다.
5. 한계
- 모두 시뮬레이션입니다. 감속기 백래시, 벨트 탄성, 엔코더 잡음과 양자화, 통신 지연의 흔들림, 모터의 토크-속도 곡선은 넣지 않았습니다(미실측).
- 제어 이득을 한 가지 규칙으로만 정했습니다. 주기마다 이득을 따로 맞추면 200 Hz 결과는 나아질 수 있습니다.
- 전류 루프는 q축 하나의 RL 회로로 단순화했습니다. 역기전력, d·q 축 결합, PWM 의 전압 양자화는 다루지 않았습니다.
6. 정리
- 궤적을 미리 아는 로봇에게 가장 큰 개선은 앞먹임입니다. 같은 PD 에 역동역학을 더하면 오차가 20배 넘게 줄었습니다.
- 여러 관절의 팔에서는 계산 토크가 결합을 지웁니다. 모델이 20% 틀려도 PD 보다 훨씬 낫습니다.
- 제어 주기는 1 kHz 안팎이면 충분하고, 200 Hz 에서는 0.1초짜리 휘두르기를 따라가지 못했습니다. 전류 루프는 그보다 10배 이상 빨라야 하고, 30 kHz 전류 루프의 실용 대역폭은 1~2 kHz 였습니다.
- 오픈하드웨어 부품을 고를 때 볼 숫자: 모터 제어기의 위치 루프 주기와 앞먹임 토크 입력 지원 여부(moteus 의 위치 모드 제어식에는 앞먹임 토크 항이 있습니다), 그리고 상위 제어기와 모터 제어기 사이의 통신 주기입니다.
티티 한마디. 라켓이 어디로 갈지 이미 아는데 오차가 생길 때까지 기다릴 필요 없잖아요? 필요한 힘을 먼저 내고, 되먹임은 틀린 만큼만 고치면 돼요!
참고
모든 자료는 2026-10-18 에 열람했습니다.
- Lynch, Park, Modern Robotics, 2017, 공개 프리프린트, 11장(11.4 토크 입력 제어, 식 11.35).
- mjbots, moteus docs/reference/theory.md(위치·전류 루프 구조, 기본 30 kHz).
- ODrive Robotics, ODrive API Reference 0.6.12(
n_evt_control_loop설명의 8 kHz 가정). - Koç, Maeda, Peters, RAS 105 (2018), 저자 공개본, 6.2 절(500 Hz 제어).
- D'Ambrosio 외, arXiv:2309.03315(정책 100 Hz, ABB EGM 248 Hz), arXiv:2408.03906(저수준 기술 50 Hz).