
오픈 루프(Open-loop)로 레이스에서 이길 수 있을까? — 테이블 모드를 한계까지 몰아붙여 '피드백은 수학적으로 필요하다'는 것을 증명한
요약
자율 주행 시뮬레이션 환경인 aira에서 오픈 루프 제어(Table Mode)의 한계를 실험한 개발 로그입니다. 센서 피드백 없이 CSV 명령열만 재생하는 방식이 비결정론적 요소와 오차 축적으로 인해 왜 실패할 수밖에 없는지 수학적·경험적으로 증명합니다.
핵심 포인트
- 오픈 루프 제어는 센서 피드백 없이 명령을 재생하는 방식임
- 비결정론적 지터와 기계적 지연으로 인해 동일 명령도 매번 결과가 달라짐
- 시간이 흐를수록 드리프트(Drift)가 축적되어 코스 이탈 및 추락 발생
- 피드백 제어(Closed-loop)의 필요성을 데이터로 입증
저는 **aira (Autonomous Intelligence Racing Arena)**라는, 가상 로봇으로 자율 주행 알고리즘을 겨루는 레이스 경기를 운영하고 있습니다. 이번에는 제가 만든 시뮬레이터에서 가장 단순한 제어 방식인 **테이블 모드 (Table Mode, 명령열을 CSV에 작성하여 재생하기만 하는 오픈 루프 제어 (Open-loop control))**가 어디까지 빠르게 달릴 수 있는지 검증했습니다.
"이상적인 라인을 따라가도록 CSV를 최적화하면 어느 정도 빠른 기록이 나오겠지" —— 그렇게 생각하며 시작했지만, 이것은 극도로 어려웠습니다. 그리고 그 어려움 자체가 답이었습니다. 본 기사는 오픈 루프 제어를 한계까지 몰아붙여, "왜 피드백 제어 (Closed-loop control)가 필요한가"를 데이터와 체감으로 이해하게 된 개발 로그입니다.
본 기사는 운영자(개발자)로서의 검증입니다. 게재된 기록은 거동을 조사하기 위한 참고치이며, 경기 리더보드에 참여한 기록이 아닙니다.
aira의 차량은 224×224 카메라 이미지와 **배터리 잔량 (SOC)**만을 입력으로 받아, **스로틀 (drive_torque)과 조향 (steer_angle)**을 출력하며, 50ms 주기로 2랩(Lap) 최단 기록을 겨룹니다. 속도계도 GPS도 타 차량 레이더도 없습니다. "시야"와 "잔량"만으로 달린다는 의도적인 제약입니다.
먼저, 테이블 모드로 2랩을 완주했을 때의 영상을 봐주세요. 로봇이 스스로 달리고 있다는 것을 알 수 있을 것입니다 —— 이것이 자동 주행입니다.
이번 주인공인 테이블 모드는 명령열을 작성한 CSV를 20fps로 위에서부터 보낼 뿐입니다. 여기에 이후의 논의를 전부 지배하는 3가지 제약이 있습니다.
순수한 오픈 루프 (Pure Open-loop): CSV의 행을 순서대로 보낼 뿐, 센서를 전혀 읽지 않는다.
주행 중에는 차량 위치를 파악할 수 없다: 실시간으로 얻을 수 있는 것은 SOC와 스텝 수뿐이다. pos_x, pos_z, yaw는 주행 종료 후에 로그로 기록될 뿐이다.
비결정론적 (Non-deterministic): localhost의 지터 (Jitter, 1~5ms)와 기계적 지연으로 인해, 같은 CSV라도 매번 조금씩 어긋난다.
첫 번째 아이디어는 이러했습니다. 몇 바퀴를 매뉴얼로 주행하여 데이터를 얻고, 그것을 기반으로 이상적인 라인으로 CSV를 다시 작성하여 주행시킨 뒤, 결과를 보고 다시 수정하는 —— 강화학습 (Reinforcement Learning)에 가까운 반복 개선입니다. aira에는 반복 실행을 위한 기반 (headless 루프와 최적화 스크립트)이 이미 갖춰져 있으므로 기계적으로 돌릴 수 있습니다.
발상은 옳습니다. 그렇다면, 공격적인 최속 라인을 그대로 재생하면 어떻게 될까요? 시도해 본 결과가 이것입니다.
그림 A: 검은색이 공격적인 최속 표본 (101659, 21.6s). 청색·주황색이 그 재생본이지만, 이상적인 라인에 올라타지 못하고 벽 충돌이나 추락으로 실패하고 있다 (102330→Fallen@326, 102400→Wall@303→Fallen@397). "이상적인 라인을 따라가기만 하면 된다"는 생각은 이렇게 만만하지 않았습니다.
먼저 "모델이 서툴러서"라는 변명을 부정해 두자면, 시스템 식별 (System Identification)에서는 조향 모델이 잘 맞아떨어졌습니다 (yaw_rate=(v/L)·tan(δ), R²=0.81, 축거 L=0.274m).
즉, 이 이후의 실패는 모델 오차가 아니라 구조적인 문제입니다. 그런데도 ——
기록의 단순 재생: 1랩째는 참조 라인으로부터 평균 8.7cm의 오차로 충실히 재현할 수 있다. 하지만 1랩을 넘어서면 드리프트 (Drift)가 축적되어 코스 이탈 = 추락. 완주는 확률적이며, 7회 중 완주 1회 · 추락 6회.
모델 기반 FF (Feedforward, flatsteer): 이상적인 라인을 평활화하여 δ=arctan(L·κ)로 조향을 생성. 0/3 완주. 게다가 매번 같은 코너에서 결정론적으로 탈선한다. 모델 조향에는 기록 주행이 가지고 있던 피드백 보정분이 결여되어 있기 때문이다.
ILC (반복 학습 제어, Iterative Learning Control): 시행 간의 오차를 조향에 반영한다. 오히려 악화. 실패가 벽 충돌을 포함할 경우, 충돌은 시행마다 재현되지 않으므로 ILC의 "거동이 재현된다"는 전제가 무너진다.
공격적인 라인의 추가 수정: 코너는 **이미 최대 조향각 (±0.524 rad ≒ 30°)에서 포화 (Saturation)**되어 있었다. 조향을 더한다 = 포화 상태라 불가능, 줄인다 = 과민 반응, 감속한다 = 조향 타이밍이 완전히 무너짐. 모든 방향에 마진(Margin)이 없다.
솔직히 말하면, 생각할 수 있는 모든 레버를 조절해 보았지만 상황은 악화되었습니다. 이것은 조정 부족이 아니라, 오픈 루프의 구조적인 한계입니다.
지금까지 수십 번을 주행시키며, 테이블 모드(Table mode)의 한계를 머리가 아닌 몸으로 실감했습니다. 오픈 루프(Open-loop)는 단순하고 매력적이지만, 현실에서는 —— 벽에 부딪힙니다. 시작 각도가 아주 조금만 어긋나도 코스를 이탈합니다. 그리고 후반부로 갈수록 오차가 누적됩니다. 주행 중에 스스로를 수정할 수단이 없는 이상, 이는 피할 수 없습니다.
결정적이었던 것은 이 숫자입니다. 조향(Steering)이 포화된 코너에서는 선회량이 스로틀(Throttle)의 탭(Tap)으로 결정됩니다. 탭량을 더하면 평균 선회각은 목표할 수 있습니다 (목표 178°에 대해, +0.12로 거의 도달). 그런데, 동일한 +0.12의 CSV × 3회 주행으로 선회각을 측정하면 ——
150° / 174° / 179° (±15°)
같은 명령인데도 이만큼이나 분산됩니다. 평균은 맞출 수 있어도, 분산은 없앨 수 없습니다. 이 분산을 상쇄하려면 주행 중에 측정하여 즉시 보정하는 것, 즉 피드백(Feedback)뿐이라는 것을 주행하며 뼈저리게 깨달았습니다.
…솔직히, 빨리 규칙 기반 제어(Rule-based control)에 시간을 쓰고 싶습니다. 하지만 그 전에 테이블 모드로 한 번은 제대로 완주해 두고 싶습니다 (웃음). 그래서 작전을 변경했습니다. 속도를 포기하고, 마진(Margin)을 확보하여, 우선 '완주'만을 목표로 합니다.
두 가지 고안을 결합했습니다.
- 마진이 있는 보수적인 모범 사례(저속·중앙 편향, 27.6s)를 기점으로 삼는다. 공격적인 라인(21.6s)이 아니라.
- CSV 끝에 전진 스로틀을 추가한다: 재생 시 골인 지점 불과 0.12m 앞에서 명령이 끊겨 정지하고 있었다. 끝에
(torque=1.0, steer=0)을 25행 추가하여 마지막 몇 cm를 끝까지 달리게 한다.
결과적으로, 연장된 CSV 총 8개 중 **2개가 진짜 2주 완주(28.1s / 28.3s, 낙하 없음)**에 성공했습니다. 완주율은 약 **25%**입니다. 서두의 영상이 바로 이 완주한 1개의 사례입니다.
그림 B: 검은색은 보수적인 모범 사례(115116, 27.6s). 파란색·주황색은 진짜 완주(123933, 124126). 그림 A보다 명확하게 라인을 타고 2주를 완주하고 있다. 6초 느린 '안심 라인'으로 설정하여 겨우 오픈 루프로 완주가 나왔다. 단, 안정적이지는 않다.
그림 A와 그림 B를 나란히 놓으면, 이 글의 주장이 두 장의 그림으로 설명됩니다. A = 빠르지만 완주 제로, B = 느리지만 완주 가능. 주행 중에 보정할 수 없는 오픈 루프에서는 속도와 확실성을 동시에 살 수 없습니다. 피드백이 없는 대가를 둘 중 하나에서 반드시 치르게 됩니다.
완주율을 정리하면, 오픈 루프의 한계는 명확합니다.
| 手法 | 완주율 |
|---|---|
| 수동 모범 사례 재생 | 0/3 |
| ... |
오픈 루프는 '조건을 갖추면 가끔 완주할 수 있지만', 안정적으로 빠르게 달릴 수는 없습니다. 안정화, 즉 분산을 흡수하기 위해서는 주행 중에 관측하고 보정하는 클로즈드 루프(Closed-loop, 피드백)가 필수적입니다.
그리고 공격적인 이상적 라인의 데이터는 낭비되지 않습니다. 그것은 다음 단계인 **클로즈드 루프 제어(규칙 기반의 Pure-pursuit이나 AI)의 목표 라인 및 학습 데이터(Training data)**로서 활용됩니다. 당초의 '이상적 라인 × 보상은 클로즈드 루프에 두어야 한다'는 가설이 실험적으로 입증되었습니다.
——실패도, 수식도, 모두 이유를 설명할 수 있는 형태로 남긴다. 이것이 aira가 내세우는 **'설명 가능한 지능(Explainable Intelligence)'**이 의미하는 바입니다. 다음 회차에서는 드디어 규칙 기반 제어로 46초의 벽에 도전합니다.
aira는 가상 로봇으로 자율 주행 알고리즘을 겨루는, 누구나 참여할 수 있는 물리 AI 레이스 경기입니다 (Race Your Algorithm). PC 1대만 있으면 되며 참가비는 무료입니다. 현재 **Race_260601 (타임 어택)**과 Race_260615를 개최 중입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기