TT Lab
요금제

한국어

시작하기
블로그

블로그

제어: PID, 피드포워드, 계산 토크, FOC 전류 루프와 위치 루프의 층, 제어 주기

상태: 초안 (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. 그림: 제어의 층

제어의 층: 느린 바깥 루프, 빠른 안쪽 루프 궤적 생성 q_r, q̇_r, q̈_r 위치·속도 PD + 피드포워드 1 kHz 전류 PI(FOC) i_q 목표 → 전압 30 kHz τ 인버터·모터 토크 ≈ k_t · i_q 관절·링크 J q̈ = τ − 마찰 엔코더 각·속도(1 kHz 로 읽음) 상 전류 안쪽 루프의 대역폭은 바깥 루프보다 충분히 높아야 한다. 바깥에서 보면 안쪽 루프는 「명령한 토크가 곧바로 나오는 장치」처럼 보여야 하기 때문이다. 30 kHz 는 오픈 제어기 moteus 의 기본 스위칭 주파수(위치·전류 루프 모두).
그림: 궤적 생성, 1 kHz 위치·속도 루프, 30 kHz 전류 루프, 모터와 관절로 이어지는 제어 계층

오픈소스 모터 제어기를 보면 층마다 주기가 다릅니다. 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 시뮬레이션 설정

4. 실측(시뮬레이션)

4.1 제어기와 제어 주기

같은 이득, 다른 제어기와 주기: 최대 추종 오차 0.1 1 10 100 8.5 10 0.2 2 kHz 8.5 10 0.4 1 kHz 8.5 10 0.9 500 Hz 40 50 35 200 Hz PD PID PD + 피드포워드 최대 오차(mrad, 로그) 시뮬레이션: 관성 0.015 kg·m², 대역폭 20 Hz 이득, 한 주기 지연. 실기 미실측.
그림: 제어기와 제어 주기별 최대 추종 오차
주기 제어기 최대 오차 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

이득을 올리면 어떨까요. ω_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

토크 한계를 30 N·m 로 낮추면(궤적이 요구하는 40 N·m 보다 작음) 계산 토크의 최대 오차가 264 mrad, PD 가 218 mrad 로 둘 다 무너졌습니다. 제어기는 불가능한 궤적을 구해 주지 못합니다. 궤적을 만들 때(8편) 역동역학 토크가 한계 안인지 먼저 확인해야 합니다.

5. 한계

6. 정리

티티 한마디. 라켓이 어디로 갈지 이미 아는데 오차가 생길 때까지 기다릴 필요 없잖아요? 필요한 힘을 먼저 내고, 되먹임은 틀린 만큼만 고치면 돼요!

참고

모든 자료는 2026-10-18 에 열람했습니다.

로그인하면 좋아요를 누를 수 있습니다

댓글

아직 댓글이 없습니다.

로그인하면 댓글을 쓸 수 있습니다