주제 정보
- 유형: 자율주행 스택의 제어(control) 계층 참조 구현 — 플래닝이 넘겨준 경로를 차량의 마찰 한계까지 추종하는 레이싱 컨트롤러. 인식·예측·플래닝을 다룬 이 블로그의 앞선 글들 뒤에 놓이는 '마지막 칸'이다
- 프로젝트: MPCC — Model Predictive Contouring Controller for Autonomous Racing (alexliniger/MPCC)
- 개발: ETH Zurich 자동제어연구소(IfA, Automatic Control Laboratory) — Alexander Liniger · Alexander Domahidi · Manfred Morari. C++와 MATLAB 두 구현이 함께 들어 있다
- 논문: Optimization-based autonomous racing of 1:43 scale RC cars — Optimal Control Applications and Methods 36(5), 2015, pp.628–647 · arXiv 1711.07300(2017-11-20 제출) · DOI 10.1002/oca.2123
- 인용: Semantic Scholar 598회(영향력 있는 인용 56회) · OpenAlex 549회 — 제어·로보틱스 계열에서 10년 넘게 인용되는 '레이싱 제어의 기준 논문'
- GitHub 지표: ⭐1,875 · 🍴423 · 열린 이슈 9 · C++(+MATLAB) · Apache-2.0(LICENSE 파일 확인) · 2018-10-01 생성 — 오늘로 정확히 8년 · 기본 브랜치 master의 마지막 커밋 2021-11-11 · 릴리스·태그 0개 · 약 16MB
- C++ 구현의 추가 기능: README에 명시된 대로 AMZ Driverless(ETH Formula Student 팀) 스택에서 온 기능이 더해져 있다 — arXiv 1905.05150
- 원문/코드: https://github.com/alexliniger/MPCC
핵심 내용
트랙을 도는 문제에는 서로 충돌하는 두 요구가 있다 — 경로를 벗어나지 않을 것과 최대한 빠를 것. 고전적 2단 구조(경로 플래너 + 트래킹 NMPC)는 플래너의 예측 지평이 짧고 지평 전체의 속도를 상수로 고정하기 때문에, S자·시케인처럼 곡률이 연속으로 바뀌는 구간에서 최적 라인을 놓치고 브레이크를 더 밟는다. MPCC는 이 두 계층을 하나의 비선형 최적화 문제로 합친다.
- 진행도 θ를 상태로 증강: 경로를 따라 얼마나 진행했는지를 나타내는 상태 θ를 차량 동역학에 덧붙인다. '주어진 경로를 따라가라'는 추종 문제를 '경로 위 진행을 최대화하라'는 최적화 문제로 바꾸는 것이 출발점이다
- lag error + contouring error — 이름의 유래: θ와 실제 차량 상태를 묶는 lag error(el, 경로 진행 추정의 뒤처짐)와 경로에 대한 횡방향 contouring error를 모두 비용에 벌점으로 넣고, 진행 속도 자체는 최대화한다. 즉 '경로에 붙어 있으면서(등고선을 따라가면서) 가장 빨리' 가는 것을 수식 하나로 표현한다
- 비선형 차량 모델: bicycle model + magic formula 타이어 모델을 써서 슬립 포화·드리프트까지 표현한다. 논문은 횡방향 속도 0.5–3.5 m/s 구간의 정상 상태(equilibrium) 라이브러리를 미리 계산해 두는데, 95개 후보 중 26개가 드리프트 정상 상태다 — 실제로 옆으로 미끄러지는 영역을 제어 대상으로 삼는다
- 실시간화의 핵심: 매 샘플링마다 비선형 문제를 선형화·이산화해 시변 QP(time-varying QP)로 근사하고, 구조 활용 내부점 솔버 FORCES(코드 생성)로 푼다. 트랙 밖으로 나가지 않는다는 제약은 경계에 정렬된 두 개의 선형 반공간으로 근사한다
- 장애물 회피: 상위의 코리도 플래너(corridor planner)가 1차원 동적계획법으로 회피 경로를 찾고, 그 경로를 트랙 제약 자체에 반영해 회피를 '제약 수정' 문제로 만든다. README에 따르면 이 부분은 MATLAB 구현에만 있다
- 실험 규모: 1:43 스케일 Kyosho dnano RC 레이싱카 · 중앙선 길이 18.43 m 커스텀 트랙 · 100 fps 적외선 카메라(정확도 4 mm 이하) + EKF 상태추정 · 제어기는 스마트폰급 ARM(Exynos 4412/5410, Ubuntu)에서 동작 · 계산된 입력은 Bluetooth로 차량에 전송
- 랩타임 결과: 같은 트랙에서 2단 구조 HRHC(플래너+NMPC) 9.5–9.8초 vs MPCC 8.9–9.2초. 시케인에서 HRHC는 속도를 0.5 m/s까지 떨어뜨리고 더 먼 거리를 도는 반면, MPCC는 시케인 전 구간에서 1 m/s 이상을 유지하며 최소 곡률에 가까운 라인을 그린다
- 계산 시간(Table II·III, ms): MPCC의 QP는 평균 15.03(표준편차 1.61, 최대 21.16), 장애물 포함 시 14.43/1.40/21.46 — 경로 플래너가 필요한 HRHC의 QP는 5.10 ms다. 대신 20 ms 샘플링을 놓친 비율은 HRHC 0.07%(3랩 중 1회) vs MPCC 4.4%(3랩 중 60회)로, 두 방식 모두 50 Hz 소프트 실시간을 입증했다
- 속도 감각: 직선에서 3 m/s 이상. 1:43 스케일을 실차 크기로 환산하면 약 465 km/h에 해당한다 — '선형 영역'에서 노는 시스템이 아니라 마찰 한계에서 동작하는 제어 문제라는 뜻이다
왜 유명한가 / 활용 가치
- 인용 598회 + ⭐1,875 / 포크 423: 2015년 논문, 2018년 공개된 코드가 10년 넘게 '레이싱 제어의 기준 구현' 자리를 지키고 있다. 포크가 423개라는 사실 자체가 교육·대회에서의 재사용 규모를 보여준다
- F1TENTH · Formula Student 계보의 조상: ETH의 AMZ Driverless 논문(arXiv 1905.05150, 2019 — Formula Student Germany 2017·FSI 2018·FSG 2018 종합 1위, OpenAlex 인용 162회)이 이 C++ 구현을 확장했고, 그 코드가 이후 대회 스택으로 퍼졌다 — ForzaETH/race_stack(174⭐, 2026-09-30 푸시 = 지금도 살아있는 최신 스택) · CL2-UWaterloo/f1tenth_ws(508⭐, MIT) · urosolia/RacingLMPC(322⭐) · AMZ-Driverless/fssim(275⭐, MIT) · f1tenth/f1tenth_gym(251⭐, MIT, 2026-09-04 푸시) · learn-to-race/l2r(177⭐)
- 후속 연구의 출발점이자 읽기 목록: README가 저자들의 후속 논문을 정리해 둔다 — 확률적 트랙 제약을 쓰는 randomized MPC(ECC 2016)·stochastic MPC와 disturbance feedback(ACC 2017)·GP로 모델 오차를 학습하는 cautious NMPC(ECC 2018)·그리고 학습 기반 MPC(RA-L 2019, 실차 AMZ 차량에서 GP 사전이 수렴한 뒤 랩타임 10% 단축). 'MPC가 학습과 만나면 무엇이 되는가'의 실증 계보다
- 이 블로그의 계보와 맞물린다: PythonRobotics(Stanley·MPC 등 제어 계층 입문 코드집)와 모션 플래닝·제어 서베이가 개념을 깔고, HiVT(예측)·UniAD(플래닝 지향 end-to-end)가 만든 궤적을 MPCC가 차량이 실제로 낼 수 있는 조향·구동 입력으로 바꾼다. RSS(안전 보증)와는 정반대 극단이다 — 여유를 남기는 대신 마찰 한계까지 쓴다
- 활용 가치: ① F1TENTH·Formula Student 팀의 실차 베이스라인(Apache-2.0, C++/MATLAB 동시 제공), ② 실시간 MPC 구현 교재 — hpipm·Yalmip·CVX·QuadProg 인터페이스까지 README에 정리, ③ 시뮬레이터 위 레이싱 벤치마크(CARLA·SUMO·HighwayEnv·esmini), ④ 로보틱스 일반의 경로 추종·한계 주행 제어
- 한계(정직하게): 기본 브랜치 마지막 커밋이 2021-11이고 릴리스·태그가 0개 — 관리되는 제품이 아니라 완결된 참조 구현으로 읽어야 한다. 실험은 18.43 m 트랙·RC 스케일이고, 드리프트 구간에서는 MPCC가 4.4%의 데드라인 초과를 보였으며, 장애물 회피는 MATLAB 구현에만 있다
시사점 및 결론
인식이 좋고 예측이 정확하고 플래너가 최적이어도, 그 결과가 20 ms 안에 차량이 실제로 낼 수 있는 조향·구동 입력으로 바뀌지 않으면 자율주행은 일어나지 않는다. MPCC의 메시지는 두 가지다. 하나는 계층을 합치면 더 빠르다 — 경로 플래너와 추종 제어기를 분리해 두면 플래너의 시야가 전체 성능을 제한한다. 다른 하나는 그 대가는 계산 시간이며, ms 단위 QP 솔버로 지불한다는 것. '느린 트랙에서 최적 라인'과 '한계에서 미끄러지는 차량'을 동시에 다루는 문제를, 딥러닝 이전의 도구로 실차 속도로 해결한 사례다.
2026년의 관점에서 이 저장소는 낡은 코드가 아니라 실시간 제약 아래에서 최적성을 밀어붙이는 방법의 원형이다. end-to-end 학습이 스택을 삼키는 흐름에서도 차량 한계와 안전 제약을 명시적으로 다루는 MPC 계보는 사라지지 않고 오히려 학습과 결합하고 있다(learning-based MPC, GP 모델, RL 트랙 플래너). 그래서 이 글의 실용적 유산은 코드가 아니라 질문 습관이다 — 어떤 컨트롤러를 보더라도 "몇 ms에 풀리는가, 트랙을 몇 초에 도는가, 데드라인을 몇 % 놓치는가"를 함께 적어 확인하는 태도.
원문: 논문 arXiv 1711.07300 · DOI 10.1002/oca.2123 · 코드 https://github.com/alexliniger/MPCC · 확장 계보 AMZ Driverless (arXiv 1905.05150)
목록으로 돌아가기