본문으로 건너뛰기

© 2026 Molayo

Qiita헤드라인2026. 06. 07. 20:45

피드백 제어로 매뉴얼 최속 라인을 넘어서다 — 룰 베이스로 46초 → 21초(2.15배) 단축한 이야기

요약

aira 레이스에서 룰 베이스 피드백 제어를 통해 주행 시간을 46초에서 21초로 2.15배 단축한 사례를 다룹니다. 인지 방식을 백선 추종에서 색상 무게중심 추종으로 교체하고, 1차계 속도 모델을 적용하여 제어 성능을 극대화했습니다.

핵심 포인트

  • 인지 방식 변경: 백선 대신 코너에서도 안정적인 초록 레인 무게중심 추종 방식 채택
  • 제어 성능 향상: 1차계 속도 모델 기반의 P 제어를 통해 종단 속도 활용도 극대화
  • 결과: 충돌 0회, 주행 시간 21.4초 달성으로 수동 조종 기록 경신

지난번(테이블 모드 편)에 저는 자신의 레이스 경기인 aira에서 "오픈 루프 (Open-loop, 명령 재생)로는 레이스에서 이길 수 없으며, 피드백 (Feedback, Closed-loop)이 필요하다"는 점을 데이터로 확인했습니다.

그렇다면, 그 피드백으로 실제로 어디까지 갈 수 있을까. 이번에는 룰 베이스 (Rule-based) 제어를 한계까지 밀어붙여 보겠습니다. 출발점은 기존 룰 베이스의 최속 기록인 **46.1s (충돌 4회)**입니다. 목표는 지난번 사람이 직접 조종했던 오픈 루프의 공격적인 모범 사례인 21.6s에 도전하는 것입니다. 결론부터 말씀드리면, 클로즈드 루프 (Closed-loop) 자동 알고리즘이 재현성을 유지하면서도 그 21.6s를 경신했습니다 (21.4s, 충돌 0).

본 기사는 운영자(개발자)로서의 검증입니다. 게재된 타임은 거동을 조사하기 위한 참고치이며, 경기 리더보드에 참여한 기록이 아닙니다.

가장 먼저 손을 댄 것은 제어가 아니라 **인지 (Perception)**입니다. 기존에는 백선 (White line)의 슬라이딩 윈도우 (Sliding-window) 방식으로 횡 위치를 추정했으나, 백선은 코너에서 화면 밖으로 벗어나 버려 한쪽 추정에 의존해야 했기에 불안정했습니다 (테이블 편에서 확인 완료).

그래서 3색 레인(안쪽=파랑 / 중간=초록 / 바깥쪽=빨강)의 초록 레인 무게중심 추종으로 교체했습니다. 색상은 선명하여 코너에서도 화면에 남아 있으며, 횡 위치를 직접 취할 수 있습니다. DriverModel은 수정 없이 그대로 두고 인지만 교체하여, 공정한 어블레이션 (Ablation) 실험으로 비교했습니다.

인지완주충돌SOC 잔량궤적
백선 sliding-window6~80.23~0.31요동침 · 배터리 고갈
색상 (초록 무게중심)✅ 3/300.71높은 재현성

색상의 강건함(Robustness)이 데이터로 증명되었습니다. 다만 타임은 70.6s로 느렸습니다. 기존 드라이버 (Pulse + 커브 감속)가 색상의 큰 횡 오차에 대해 너무 신중했기 때문이며, "깔끔하지만 느린" 상태였습니다. 토대는 마련되었으니, 다음은 속도입니다.

perc_still_145929.png

[색상 기반 인지: 초록 레인을 검출하여 무게중심(주황색 점)을 매 프레임 추종. 왼쪽 하단에 Lateral / Theta / 곡률을 산출하고 있음. 코너에서도 초록색은 화면에 남음]

진단 결과, 기존 최속 46.1s조차 종단 속도의 33%밖에 사용하지 못하고 있음이 판명되었습니다. 속도가 한계에 부딪힌 것이 주원인이었습니다.

속도를 동정(Identification)하면 1차계 v̇ = a·torque − b·v − c가 됩니다.

(a=13.2, b=10.96, c=−0.58, 시정수 ≈ 0.09s). 적합도는 낮지만 (R²=0.30), 1차계라는 구조가 효과적입니다. 목표 속도 v*에 대한 정상 토크 torque_ff = (b·v* + c) / a를 명령하기만 하면, * 속도는 v에 수렴합니다. 즉,

**v를 관측할 수 없더라도 실질적으로 P 제어 (P-control)**가 됩니다.

기존의 Pulse 핵 (실효 스로틀 0.35 제한 + 서징 (Surging))은 폐기하고, 직선은 풀 스로틀, 코너는 제어 속도로 설정했습니다. 커브 정도를 severity = 0.7·|steer|/lim + 0.3·|θ|/35°로 측정하여 v_target을 결정하고, 토크를 역산합니다.

그 결과, 27.1s · 전 구간 완주 · 충돌 0 · SOC 0.73 잔량. 속도 이용률은 33% → 57%로 상승했습니다. 감속은 v_target이 낮아지면 토크가 떨어지며, 항력(Drag) 우세로 인해 자연스럽게 작동합니다 (명시적 제동은 보조 역할).
궤적은 아직 중앙 부근이며, 배터리도 크게 남았습니다. 즉, 성장 가능성(Margin)이 명확했습니다.

V_MAX를 1.0에서 1.1로 올려도 개선되지 않았습니다. 이 오벌(Oval) 트랙은 짧은 직선 + 긴 우측 스위퍼 (Sweeper) 구조로 되어 있어, 직선에서 1.0에 도달하기 전에 다음 코너의 감속이 시작되는, 즉 **코너가 속도를 제한 (Corner-limited)**하기 때문입니다.

그래서 V_MAX=1.0으로 고정한 채, 코너 최저 속도 v_corner_min을 래더(Ladder) 방식으로 높여 나갔습니다.

v_corner_mintime결과
0.4527.1s완주 · 충돌 0
...1.00— (첫 코너에서 낙하)

1.0에서는 코너 횡 가속도(Lateral G)가 마찰 한계(A_LAT_MAX)를 초과하여 낙하했습니다. 완주 가능한 상한선은 vc 0.9~1.0 사이임을 실측할 수 있었습니다. 그리고 21.8s를 기록하며, 오픈 루프 모범 사례인 21.6s에 거의 근접했습니다. 게다가 클로즈드 루프는 재현성이 높고, 충돌이 없으며, 배터리에 여유가 있다는 질적 우위까지 확보했습니다.

덧붙여서 "직선에서는 풀 스로틀(Full Throttle) 유지 + 미세 조향 중단"이라는 **직선 모드 (Straight Mode)**도 시도해 보았으나, 효과가 없었습니다. 진단 결과 직선 판정 발동률은 고작 1% —— 거의 전 구간이 코너였고, 구조적으로 직선에서 속도를 더 낼 여지(伸びしろ)가 없었습니다. 근거 있는 가설이었으나 트랙 형상에 의해 부정되었습니다 (유용한 부정적 지식).

참고로, 낙하는

status=Fallen

  • 終端 pos_y < −0.1

의 이중 조건으로 검출되었습니다. 테이블 편에서 발견했던 구형 status 버그에 대한 보험이 여기서 효과를 발휘했습니다.

속도 래더(Ladder)는 vc=1.0인 **낙하 절벽 (Falling Cliff)**에서 한계에 부딪혔습니다. 절벽 자체를 높이려면, 코너를 직선화하여 "경험하는 곡률"을 낮추는 것, 즉 아웃-인-아웃 (Out-in-out)이 필요합니다.

먼저 교과서대로 구간별로 목표 색상을 전환(녹색 → 외곽 적색 → 내측 청색 에이펙스(Apex) → 외곽 적색)해 보았습니다. 결과는 전원 낙하였습니다. 원인은 두 가지입니다.

좁은 3레인 경로에 "아웃"을 위한 여백이 없음: 외곽(적색) 및 내측(청색) 레인의 바깥쪽이 즉시 낙하 경계입니다. 끝 레인의 무게 중심을 노린다는 것은 트랙 끝을 달린다는 뜻이며, 이는 낙하 여유가 제로임을 의미합니다.

색상의 급격한 전환으로 인해 횡방향 목표값이 튐: 조향(steer)이 급격히 반전(예: −0.52 → +0.40)하며 경로를 이탈했습니다. vc를 0.6으로 낮추어도 낙하했습니다. 즉, 속도가 아닌 라인 자체의 문제입니다.

교과서적인 아웃-인-아웃은 외곽 여백을 전제로 하며, 이 좁은 길에서는 성립하지 않습니다 (부정적 지식: 코스 폭이 공략 라인을 제약함).

그래서 안전한 방향으로 선회하여, 색상 전환 없이 에이펙스(Apex)만 내측으로 부드럽게 소폭 오프셋 (Small Offset) 시켰습니다 (|θ| 의존, 저크(Jerk) 없음, 경계 여유 확보). 그 결과, bias40 / vc0.95 → 21.4s · 충돌 0 · SOC 0.7 잔여를 기록했습니다.

이로써 클로즈드 루프(Closed-loop)가 오픈 루프(Open-loop) 모범 사례인 21.6s를 밑돌았습니다 (21.4s).

내측으로 붙이는 것은 경로를 약간 단축시키지만, 동시에 회전 반경도 작아지기 때문에 절벽은 높아지지 않습니다 (vc=1.0은 bias 유무와 상관없이 낙하). 나아가 조향을 PD 제어화하여 절벽 근처의 안정적인 여유를 확보할 수 있는지 시도했으나, 높아지지 않았습니다. 낙하는 yaw > 100° 및 최대 조향각에서도 미끄러지는, 순수한 그립 한계(Grip Limit) 문제였습니다.

속도 계통의 모든 레버가 한계에 도달했다는 것은, 이 오벌(Oval) × 좁은 3레인 경로의 물리적 한계에 도달했다는 이해입니다.

Stage구성time충돌SOC 잔여
구형 룰 베이스백색선 · pulse46.1s40.65
...C apex 내측 붙이기 (bias40 / vc0.95)21.4s00.70
(참고) 오픈 루프 모범 사례수동 조작 CSV21.6s비재현 · ~25% 완주

구형 룰 베이스 46.1s (충돌 4) → 21.4s (충돌 0) = 2.15배 속도 · 클린 주행. 최속 구성(V_MAX=1.0 / v_corner_min=0.95 / inside_bias=40)으로 3회 연속 주행 시 21.46~21.57s · 전회 완주 · 충돌 0 · 편차 ±0.1s.

단순히 빠르기만 한 것이 아닙니다. 안정성 · 재사용 가능성 · 설명 가능성 —— 이 세 가지가 이전의 오픈 루프(비재현 · ~25% 완주)와의 본질적인 차이입니다. 지난번에 "피드백 제어는 필수"라고 제시했던 것에 대한 정답 확인이었습니다.

마지막으로, 솔로 개발로서 AI(구현)와 협력하며 문제를 해결할 때 효과적이었던 진행 방식을 공유합니다.

시각화 리포트를 "공유의 축"으로 삼음: 각 스테이지의 궤적, 3패널, 인지(Perception) mp4를 HTML화하여 전후 과정을 한눈에 비교하며 방침을 합의했습니다. 텍스트보다 훨씬 빠르게 인식을 일치시킬 수 있습니다.

레버를 하나씩 · 환경(env)에서 전환 · 기본값은 안전하게: 변경 사항을 작게 나누어 진행하며, 언제든 되돌릴 수 있는 상태를 유지했습니다.

부정적 지식을 버리지 않음: 아웃-인-아웃 전원 낙하, 직선 모드 효과 없음, PD 제어로도 절벽 극복 불가 —— 이러한 기록들이 다음 단계의 판단 재료가 되었습니다.

설계와 인수인계 기록을 남김: 방향성의 어긋남을 조기에 수정하며 쌓아 올렸습니다.

—— 속도도, 실패도, 물리적 한계도, 모두 이유를 설명할 수 있는 형태로 남깁니다. 이것이 aira가 내세우는 **"설명 가능한 지성 (Explainable Intelligence)"**이 의미하는 바입니다. 다음은 드디어 AI 모드(학습)로 이 21.4s에 도전합니다.

aira는 가상 로봇으로 자율 주행 알고리즘을 겨루는, 누구나 참여할 수 있는 물리 AI 레이스 경기입니다 (Race Your Algorithm). PC 한 대만 있으면 되며 참가비는 무료입니다. 현재 **Race_260601 (타임 어택)**과 Race_260615가 개최 중입니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0