제7부 실전: ROS2 Humble 프로젝트
7.6 실전 ⑤ (선택) MPC 궤적 추종
제7부 실전: ROS2 Humble 프로젝트 · 마무리(선택 심화). 6.1의 MPC를 궤적 추종에 적용한다. PID·Pure Pursuit(7.2·7.3)가 반응적이라면, MPC는 미래를 예측하며 제약(가속도·속도 한계)을 명시적으로 지키며 최적 추종한다. 제약을 정확히 존중함을 실측으로 확인.
✅ 검증됨: 선형 MPC(cvxpy QP) 궤적 추종을
ros:humble컨테이너에서 실행해 검증(verify/ce35_mpc.py) — 사인 궤적 추종 RMS 0.048 m, 가속도 제약 $\vert a\vert\le2.0$을 위반 없이·활성으로 지킴. 실로봇/NMPC 통합은 독자 환경 몫.
이 장을 마치면 MPC를 궤적 추종에 정식화하고, 제약을 명시적으로 다루는 것이 PID·Pure Pursuit와 어떻게 다른지, 실시간 비용이 왜 관건인지 이해해야 한다.
7.6.1 왜 MPC로 추종 — 미래와 제약
7.3의 Pure Pursuit는 지금 전방주시점만 보는 반응적 조향이었다. MPC는 다르다(6.1):
- 미래를 예측한다: 앞으로 $N$스텝의 궤적을 예측해 지금 최적으로 대응 — 곡선이 올 것을 미리 알고 감속.
- 제약을 명시적으로: 가속도·속도·조향 한계를 최적화에 직접 넣어 반드시 지킨다. PID/Pure Pursuit는 포화를 사후에 겪지만(2.5.6.3), MPC는 미리 존중한다.
- 최적: 추종 오차와 제어 노력을 비용으로 절충(6.1.3).
대가는 매 스텝 최적화(6.1.8) — 실시간 비용.
7.6.2 궤적 추종 MPC 정식화
점-로봇을 이중적분기(각 축 [위치, 속도], 입력=가속도)로 모델링하고, 움직이는 기준 궤적 r_k를 추종(6.1.3을 추종용으로):
min Σ_{i=0}^{N−1} ( (xᵢ−r_{k+i})ᵀ Q (xᵢ−r_{k+i}) + uᵢᵀ R uᵢ ) + 종단비용
u₀…u_{N−1}
s.t. x₀ = 현재 상태
x_{i+1} = A xᵢ + B uᵢ (모델)
|uᵢ| ≤ a_max (가속도 제약 ★)
선형 모델 + 2차 비용 + 선형 제약 → QP(6.1.3). 매 스텝 풀어 첫 입력만 적용(후퇴 수평선, 6.1.2).
import cvxpy as cp, numpy as np
def mpc(x0, k, A, B, Q, R, Pf, N, dt, a_max, ref):
x = cp.Variable((2, N+1)); u = cp.Variable((1, N))
cost = 0; con = [x[:,0] == x0]
for i in range(N):
r = ref((k+i)*dt)
cost += cp.quad_form(x[:,i]-r, Q) + cp.quad_form(u[:,i], R)
con += [x[:,i+1] == A@x[:,i] + B@u[:,i], cp.abs(u[:,i]) <= a_max] # 제약
cost += cp.quad_form(x[:,N]-ref((k+N)*dt), Pf)
cp.Problem(cp.Minimize(cost), con).solve(solver=cp.OSQP)
return float(u[:,0].value[0]) # 첫 입력만
7.6.3 실행 결과 — 제약을 지키며 추종 (실측)
사인 위치 궤적($1.5\cdot\sin(0.5t)$)을 $N=15$, 가속도 제약 a_max=2.0으로 추종한 실제 결과:
위치 추종 RMS 오차 = 0.048 m
사용된 최대 |가속도| = 2.000 (= a_max)
제약 위반? 아니오 (제약 준수)
제약 활성(포화 도달)? 예
→ CE35_MPC_PASS
읽기:
- 궤적을 RMS 0.048 m로 정밀 추종 — 미래를 예측한 덕에 곡선에서 지연되지 않는다.
- 가속도가 정확히 2.000까지만 쓰였다 — 제약을 위반 없이 지키면서, 활성(한계에 닿음)이다. MPC가 "이 이상 못 가속한다"를 알고 그 안에서 최적으로 움직인 것.
- 대조: LQR/PID라면 곡선의 급격한 구간에서 2.0을 넘는 가속을 요구해 포화·오버슈트를 겪는다. MPC는 제약을 설계에 넣어 미리 존중한다(6.1.1) — 이것이 핵심 차이.
7.6.4 이동로봇으로 — 비선형과 NMPC
위 예제는 선형 점-로봇이다. 실제 차동구동(7.3)은 비선형($\cos\theta, \sin\theta$)이라 둘 중 하나:
- 연속 선형화(successive linearization): 매 스텝 기준 궤적 주변에서 오차 동역학을 선형화(1.1.9)해 QP로 — 계산 부하가 작고 흔한 실전 절충.
- 비선형 MPC(NMPC, 6.1.8): 비선형 모델·제약을 NLP로 직접 — 더 정확하나 계산 비용이 크다.
acados·do-mpc같은 도구로.
이동로봇 MPC는 조향·속도를 동시에, 장애물·속도·가속 제약을 함께 다룰 수 있어 Pure Pursuit보다 강력하다 — 대신 모델·계산 부담을 진다.
7.6.5 ROS2로 — MPC 노드 (독자 환경)
# (예시 — 실시간 솔버 필요, 독자 환경)
ros2 run ce_examples mpc_tracker # /odom 구독 → QP 풀이 → /cmd_vel 발행
- 구조는 7.2과 같다(측정 구독·명령 발행). 차이는
pid.update자리에 QP 풀이가 들어간다는 것. - ⚠️ 실시간(6.1.8·7.1.4): QP를 제어 주기 안에 풀어야 한다.
OSQP·acados·코드 생성으로 ms 안에.cvxpy는 프로토타이핑에는 좋지만 실시간 루프에는 전용 솔버를 권장.
7.6.6 정직 — 모델·계산·실시간
- 모델 기반(6.1.10): MPC는 모델로 예측한다 — 모델이 틀리면 추종·제약 존중이 틀린다(1.1.11). 강인/적응 MPC가 있으나 복잡.
- 계산 비용: 매 스텝 QP/NLP는 PID·Pure Pursuit보다 계산 부하가 훨씬 크다. 실시간 마감을 못 지키면 위험(3.3.9).
- 안정성·실현가능성(6.1.7): 종단 재료 없이는 보장이 없다 — 단순한 MPC는 위험.
- 이 예제는 데모: 선형 점-로봇·
cvxpy다. 실전 이동로봇은 비선형·전용 솔버·예외 처리가 필요.
7.6.7 정리 — 제7부 마무리
- MPC는 미래를 예측해 제약을 명시적으로 지키며 궤적을 최적 추종한다(7.6.1·7.6.2). PID·Pure Pursuit의 반응적 한계를 넘는다.
- 실측: 사인 궤적 RMS 0.048 m 추종, 가속도 제약 $\vert a\vert\le2.0$을 위반 없이·활성으로 준수(7.6.3) — 6.1의 핵심(제약 존중)이 실제로 확인.
- 실제 이동로봇은 비선형이라 연속 선형화·NMPC로(7.6.4), 실시간 솔버가 관건(7.6.5). 모델·계산·안정성은 정직하게(7.6.6).
이로써 제7부의 실전 프로젝트 다섯 개를 마친다. 속도·위치 PID(7.2)·경로추종(7.3)·도립진자 LQR(7.4)·EKF 융합(7.5)·MPC 추종(7.6)으로, 제1~6부의 이론을 실제로 돌아가는 코드로 검증했다. 이어 제7부의 보강 장(7.7~7.10)이 제어 구조(피드포워드·종속)·궤적 생성·안전·로봇팔 관절공간 제어(실전⑥)로 제7부를 마무리하고, 그 뒤 부록(A.1~A.5)이 변환표·요약·치트시트·트러블슈팅·용어집으로 참조 자료를 모은다(목차 2).
7.6.8 연습·생각해 볼 것
- MPC vs Pure Pursuit. 같은 궤적 추종에서 MPC와 Pure Pursuit(7.3)의 차이를 "미래 예측·제약 처리·계산 비용" 관점에서 비교하라. (7.6.1)
- 제약 활성. 7.6.3에서 가속도가 정확히
a_max=2.0까지만 쓰인 것이 왜 "MPC가 제약을 존중한다"의 증거인가? LQR이라면 어땠을까? (7.6.3) - 수평선.
verify/ce35_mpc.py에서 $N$을 15→3(짧게)으로 줄이면 추종이 어떻게 변하나? 너무 짧으면 무엇을 못 보나? (6.1.5, 7.6.2) - 제약 조이기.
a_max를 2.0→0.5로 줄이면 추종 RMS는 어떻게 변하나? 왜 급격한 곡선을 못 따라가게 되나? 직접 확인하라. (7.6.3) - 비선형. 실제 차동구동에 이 선형 MPC를 그대로 쓰면 왜 부정확한가? 연속 선형화와 NMPC의 차이는? (7.6.4)
- (손으로)
verify/ce35_mpc.py로 추종을 재현하고,N·a_max·Q/R을 바꿔 추종 정밀도와 제약 활성을 관찰하라. (검증된 스크립트)
막히면 "MPC=미래 예측+제약 명시 존중, 매 스텝 QP·첫 입력만, 실시간 솔버가 관건, 비선형은 NMPC"로 돌아가라.