TCP (Trajectory‑Guided Control Prediction): End‑to‑End 자율주행, 쉽게 풀어쓴 딥다이브
차가 스스로 달린다는 이야기는 종종 차갑고 딱딱하게 들립니다. 하지만 매 순간의 steer, brake, throttle 뒤에는 ‘지금 무엇을 보고, 다음엔 무엇을 할까?’라는 인간적인 고민이 숨어 있죠. 이 글은 Trajectory‑Guided Control Prediction(TCP)을 중심으로 End‑to‑End 자율주행을 차분한 한국어로 재구성한 긴 글입니다. 원 논문·발표의 핵심을 하나도 빼지 않되, 읽는 맛을 살리고, 검색에서도 잘 보이도록 긴 꼬리 키워드까지 챙겼습니다.
‘trajectory vs control End‑to‑End autonomous driving’, ‘Rainbow DQN & Distributional RL 쉬운 설명’, ‘monocular camera + GRU + PID 조합’ 같은 키워드를 찾으셨다면, 지금이 바로 목적지입니다.

왜 Reinforcement Learning 이야기를 먼저 꺼낼까
Bootstrapping과 Dynamic Programming. 통계에서 bootstrapping은 샘플로부터 모수의 분포를 추정하는 방식입니다. 알고리즘 세계의 dynamic programming도 같은 정서가 있어요. 작은 해를 차곡차곡 쌓아 큰 해를 만든다는 점에서요. Value Iteration은 Bellman equation과 기대값 기반 업데이트를 사용해 이 원리를 실천합니다.
Monte Carlo vs 추정 기반 업데이트. 흔히 두 줄기가 교차합니다.
- Monte Carlo: 한 에피소드를 끝까지 보고 실제 return으로 값을 업데이트.
- 추정 기반(bootstrapped): 이미 학습된 값과 Bellman 관계를 이용해 값을 조정.
둘을 섞은 것이 Temporal‑Difference(TD) learning입니다. 아래쪽은 Monte Carlo처럼, 위쪽은 dynamic programming처럼 보이는 그 유명한 TD target을 향해 V(s)를 조금씩 밀어 올립니다.
On‑policy / Off‑policy, Q‑learning, Q‑table. 정책이 주어지면(on‑policy) 값 평가가 쉬워집니다. 하지만 정책을 알아내야(off‑policy) 한다면 Q‑learning으로 갑니다. 상태‑행동 값 Q(s,a)를 Bellman target으로 업데이트하고, 작은 세계에선 Q‑table로 충분하죠. 다만 상태 공간이 커지거나 연속이면 곧 한계에 부딪힙니다.
DQN: table 대신 network. DQN은 table을 신경망으로 바꿉니다. TD target 기반 loss를 줄이며 파라미터를 gradient로 업데이트하죠. 이렇게 연속 state 문제는 풀리지만, action이 연속이면 또 막힙니다.
DDPG: 연속 action의 문을 여는 열쇠. 모든 action에서 argmax를 찾기 어려우니 DDPG는 actor μ와 critic을 둡니다. actor가 연속 action을 제안하고, critic이 Q(s,a)를 평가합니다. 이 듀오가 deterministic policy gradients로 학습을 밀어줍니다.
Rainbow DQN: 안정화와 탐험의 도구함. DQN 계열은 다음 재료들로 더 견고해졌습니다.
- Double DQN: 선택과 평가를 분리해 overestimation을 완화.
- Prioritized Experience Replay(PER): TD error가 큰 transition을 더 자주 샘플.
- Dueling Networks: Q(s,a)를 state value와 action advantage로 분해해 안정성 향상.
- Multi‑step learning: N‑step return으로 신용 할당을 빠르게.
- NoisyNets: 학습되는 parametric noise로 exploration 개선.
- Distributional RL: 반환을 한 점이 아니라 분포로 예측, KL divergence와 projection을 활용해 학습.
이 도구들은 직접 쓰이기도, 설계 감각으로 녹아들기도 합니다.
End‑to‑End 자율주행의 두 결과물: Trajectory vs Control
Trajectory 기반 예측. 시스템이 trajectory/waypoints를 냅니다.
- 장점: 시간 지평이 길고, 다중 에이전트 예측이나 도로/신호/보행자 같은 의미 정보와의 통합이 쉽습니다.
- 단점: 예쁜 trajectory를 정교한 control action으로 바꾸는 일이 어렵고, 그 경로를 흔들림 없이 tracking하는 것도 만만치 않습니다.
Control 기반 예측. 매 타임스텝마다 steer, throttle, brake를 직접 냅니다.
- 장점: 지금 순간을 단단히 붙잡습니다.
- 단점: 충돌 회피가 늦을 수 있고, 미래 맥락이 부족해 주행이 요동치거나 불안정해질 수 있습니다.
짧은 사례. 급커브에서는 trajectory 방식이 궤도를 벗어나기 쉽고, 복잡한 교차로에서는 control 전용 모델이 차선을 잘 잡아도 보행자 대응이 빈틈일 수 있습니다.
그래서 질문은 단순합니다. 두 출력을 한 모델 안에서 똑똑하게 섞으면 더 좋아지지 않을까?
TCP: Trajectory‑Guided Control Prediction 한눈에 보기
목표. 하나의 모델이 미래 waypoints와 미래 control 시퀀스를 함께 예측한 뒤, 상황에 맞게 fusion해 최종 action으로 내보내는 것.
입력과 리더보드 맥락. monocular camera 하나만으로도 충분하다는 점을 강조합니다. 이 단출한 설정으로도 public color leaderboard 상위권을 찍었다는 보고가 있죠.
핵심 포인트 4가지.
- Shared backbone으로 공통 시각·문맥 특성을 함께 학습해 계산량을 낮추고 일반화를 돕습니다.
- Multi‑step control prediction을 위해 GRU 기반 temporal module을 사용, 단일 스텝 imitation을 넘어서 시퀀스성을 존중합니다.
- Trajectory‑guided attention으로 trajectory branch가 control branch의 시선을 화면의 알짜 영역으로 유도합니다.
- Situation‑based fusion으로 상황에 따라 trajectory에서 온 action과 control branch의 action 비중을 조절합니다.
아키텍처: 입력에서 fusion까지
Inputs. 세 가지가 핵심입니다: camera image, vehicle speed, navigation command(직진/좌회전/우회전/차선 변경/차선 추종 등). 이미지는 CNN encoder, 속도·커맨드는 MLP measurement encoder로 들어가고, 둘의 feature를 concat해 공유합니다.
Trajectory branch.
- GRU가 K steps를 rollout하며 wp1…wpK를 출력.
- 두 개의 PID controller가 waypoint 시퀀스를 low‑level control로 변환.
Multi‑step control branch.
- 또 하나의 GRU가 미래 control 시퀀스를 직접 예측.
Trajectory‑Guided Attention.
- trajectory GRU와 control GRU의 hidden state를 합쳐 MLP를 통과시키면 guidance 벡터 wt를 얻습니다.
- wt에 softmax를 적용해 image encoder의 2D feature map F 위에 attention 가중치를 뿌립니다.
- 가중 합으로 만든 global visual feature를 control 쪽 hidden과 다시 concat해 action을 산출합니다.
- 직관: trajectory는 모델의 의도 지도입니다. 그 지도로 control의 시선을 맞춥니다.
Situation‑based fusion.
- 최종 action은 두 후보로부터 옵니다: (1) trajectory+PID에서 변환된 action, (2) control branch의 action.
- 하이퍼파라미터 alpha로 정의된 규칙이 가중을 정합니다.
- 실험에서는 단순 규칙을 썼습니다. 회전 중이면 control branch를 더 신뢰, 그 외에는 trajectory branch 비중을 높입니다.
학습 신호와 loss 디자인
ROACH를 통한 privileged supervision. 차선·도로·신호 등을 BEV 2D로 렌더한 풍부한 정답을 사용합니다. 이 덕분에 메인 목적 외에 auxiliary head를 붙여 추가 신호를 줄 수 있죠.
Feature loss. 중간 시각 feature를 privileged feature와 L2 distance로 가깝게 만듭니다.
Trajectory loss. 예측 trajectory가 정답 waypoint/trajectory와 얼마나 떨어졌는지 거리 기반으로 평가합니다.
Control loss(분포 관점).
- control 출력을 Beta distribution으로 모델링합니다.
- 현재 스텝과 미래 스텝 모두에서 KL divergence로 정답 분포와 일치시키고,
- 현재/미래 feature loss도 함께 더해 temporal 성질을 반영합니다.
Auxiliary tasks. speed와 일종의 value‑like 신호는 각각 L1, L2 loss로 학습해 backbone을 안정화합니다.
관련 연구 한 바퀴
두 단계 학습으로 안정성 높이기. 먼저 backbone을 행동 정답으로 imitation‑pretrain하고, 이후 DDPG로 actor‑critic fine‑tuning을 합니다. 유사한 아이디어가 Learning to Drive in a Day에도 보이는데, actor/critic 업데이트 초점에서 약간 차이가 있습니다.
Rainbow IQN Ape‑X: 지각과 학습의 분리. Rainbow, IQN, Ape‑X를 조합해 policy update와 transition sampling을 분리합니다.
- actors는 runner로부터 파라미터를 받아 경험을 만들고 replay buffer를 채웁니다.
- runner는 PER로 업데이트를 수행하고 새 파라미터를 다시 보냅니다.
- pre‑trained custom ResNet으로 perception을 따로 키워두는 식의 decoupling이 쓰였습니다.
End‑to‑End neural motion planning + cost volume. trajectory branch가 motion context를 제공하고, 이를 cost volume head가 참고해 planning을 돕습니다. trajectory는 geometric sampler로 뽑고, planner가 low‑cost path를 고릅니다. perception head와 cost‑volume head를 함께 학습해 inductive bias를 심습니다.
GRU in multimodal E2E: TransFuser 계열. TransFuser류는 GRU 기반 temporal fusion을 대중화했고, LAV 스타일은 3D perception backbone에서 map/detection을 만들고, 전문가 motion planner가 모든 차량의 trajectory를 예측합니다. 학습은 feature/출력 양쪽 distillation을 사용합니다.
PASNet 스타일 멀티태스크 control. 하나는 single‑image branch로 perception+control을, 다른 하나는 sequential‑image branch로 future‑aware representation을 만듭니다. localization(position, heading)과 control(throttle, brake, steering)로 과제를 나누고, navigation command로 전체를 condition합니다.
Ensembling baselines.
- Test‑Time Augmentation(TTA): 추론 때 trajectory를 여러 번 샘플·실행해 평균/투표. 성능은 오르지만 latency가 늘어납니다.
- Fusion of Experts: straight/left/right/U‑turn 같은 전문가를 여럿 두고, fusion model이 뽑아 씁니다. 훈련·추론 모두 비용이 늘죠.
TCP는 두 형태(trajectory, control)를 한 네트워크 안에서 섞고, trajectory‑guided attention으로 control의 시선을 안내한다는 점이 다릅니다.
실험 설정과 지표
Closed‑loop driving, sparse navigation points, high‑level commands가 기본입니다. 도로 한복판 장애물, 신호 없는 교차로 같은 장면이 포함됩니다. 에이전트의 목표는 destination에 안전하게 도달하는 것.
Metrics는 셋.
- Route Completion – 코스 완료 비율.
- Infraction Score – 충돌/위반 패널티.
- Driving Score – 위 둘을 결합한 핵심 점수(보통 곱 형태).
결과와 ablation: 숫자에 담긴 이야기
종합 비교. TCP가 전반적으로 더 좋았습니다. SB(branch별 encoder 분리) 변형과 ENS(앙상블)도 실험했는데, TCP+SB ensemble이 최고 점수를 냈습니다.
Control‑only vs Trajectory‑only.
- vehicle collision/km은 trajectory‑only가 더 낮았습니다.
- layout collision/km은 control‑only가 더 낮았습니다.
- control‑only는 주행이 다소 불안정해지는 경향이 있어 차량 간 충돌이 늘 수 있고, trajectory‑only는 미세 제어에서 약점을 보일 수 있습니다.
Ablation 루트(기본: control‑only).
- trajectory branch를 auxiliary로 추가 → +2.5.
- multi‑step prediction(temporal module) 추가 → +7.9.
- trajectory‑guided attention 추가 → +3.2.
- 마지막 situation‑based fusion이 또 한 번 큰 점프를 만듭니다. 결론은 간단합니다. 둘 중 하나만으론 부족하고, 잘 섞어야 진짜 좋아진다.
Multi‑task vs Ensemble. multitask는 shared backbone을 쓰고, ensemble은 control‑only와 trajectory‑only 출력을 situation‑based fusion으로 합칩니다. 최종적으로 TCP+SB ensemble이 가장 높았습니다.
왜 이 조합이 통할까: 팀에 가져갈 다섯 문장
- Sequence를 존중하라. 운전은 시퀀스다. GRU로 future control sequence를 모델링하면 오늘의 선택이 내일의 상태를 바꾼다는 사실을 반영할 수 있습니다.
- 가능한 privileged signal을 쓰라. ROACH에서 뽑은 BEV는 규칙 기반 expert보다 훨씬 풍부합니다. feature loss가 backbone에 올바른 불변성을 심어 줍니다.
- Trajectory로 attention을 안내하라. trajectory는 ‘의도’를 담은 지문입니다. 그 지문으로 control branch의 시야를 좁혀 줍니다.
- 상황이 왕, 규칙은 가볍게. 직선 구간은 trajectory의 일관성이, 급커브는 control의 민첩성이 빛납니다. alpha는 단순부터 시작해 현장에서 조정하세요.
- 공유하고, 필요하면 갈라라. 처음엔 shared backbone으로 효율을 얻고, 더 필요하면 SB로 분리하고, 마지막에 ensemble로 마무리해도 좋습니다.
한계와 다음 단계
- Rule‑based fusion의 천장. 지금은 회전/직진 같은 단순 규칙입니다. uncertainty‑aware한 학습형 gating이 더 복잡한 장면에서 유리할 수 있습니다.
- PID 변환 민감도. waypoint→control 변환은 PID gains와 차량 동역학에 민감합니다.
- Monocular 한계. 카메라 하나는 우아하지만 취약합니다. LiDAR·Radar를 보강하면 악천후/야간에도 튼튼해집니다.
- Beta distribution 그 너머. 경계가 있는 action에는 적합하지만, 꼬리 거동을 더 잘 잡으려면 quantile류나 다른 분포 모델이 유리할 수 있습니다.
장면 예시: 수식이 감정으로 바뀌는 순간
- 비 오는 밤 합류. trajectory는 부드러운 호를 제안하고, attention은 젖은 차선과 헤드라이트를 강조합니다. control 시퀀스는 급한 수정 없이 차분합니다.
- 갑작스런 보행자. control branch가 강한 제동과 미세 조향으로 즉각 반응. fusion은 곧바로 control 쪽으로 가중을 옮깁니다.
- 도심 좌회전. 곡률이 커지면 fusion이 control을 밀어 줍니다. trajectory의 prior는 완만함을, control은 떨림 없는 라인을 만듭니다.
자주 묻는 질문 (짧고 정확하게)
Q1. trajectory만 예측하고 기존 controller 쓰면 안 되나요?
실전 tracking은 생각보다 험합니다. control‑only는 즉각 반응이 강점이죠. 둘을 합치면 긴 지평과 단기 반사가 공존합니다.
Q2. GRU 말고 transformer는 어떤가요?
실시간 제약에서는 가볍고 안정적인 GRU가 유리합니다. transformer도 가능하지만 latency와 데이터 효율을 따져야 합니다.
Q3. ROACH 같은 privileged BEV가 꼭 필요합니까?
큰 도움이 됩니다. feature/auxiliary loss로 학습이 안정되고 일반화가 좋아집니다. 없으면 더 오래, 더 어렵게 배웁니다.
Q4. fusion의 alpha는 고정인가요?
실험에선 단순 규칙을 썼습니다(회전은 control, 그 외는 trajectory). 이후엔 학습형 게이트로 확장 가능합니다.
Q5. Rainbow, PER, Dueling, Distributional RL은 여기서 어떤 역할인가요?
설계 감각과 관련 연구의 바탕입니다. 예컨대 Rainbow IQN Ape‑X는 perception/학습의 디커플링에, TCP는 control 쪽에서 distributional loss를 씁니다.
맺음말
자율주행은 멀리 보는 마음과 눈앞을 지키는 손놀림이 함께 만드는 합주입니다. TCP는 한쪽을 택하지 않습니다. trajectory가 ‘어디를 볼지’를 속삭이면, control은 ‘지금 바로 해야 할 일’을 또렷하게 외칩니다. 점수 몇 점을 올리는 기술을 넘어, 빗길에서도 덜 흔들리고, 교차로에서 한 템포 더 차분해지는—그런 주행 감각을 선물합니다.
'SW > 인공지능' 카테고리의 다른 글
| OpenAI Atlas AI 브라우저란? Chrome이랑 뭐가 다른지, 실제 써본 사용 후기와 정리 (0) | 2025.12.27 |
|---|---|
| Tiger Data Agentic Postgres 완전 사용법: Cursor MCP로 Postgres DB를 안전하게 포크하는 방법 (0) | 2025.12.20 |
| 10분 만에 Base44로 Airbnb 클론 만들기: no-code AI 튜토리얼 (0) | 2025.12.16 |
| OpenAI Agent Builder 튜토리얼: AgentKit·ChatKit·MCP로 실무형 AI Agent 구축하기 (0) | 2025.12.15 |
| AI 코딩 에이전트 비교 2025: Blitz vs Devin vs Factory로 본 메인프레임 Modernization 실전 사례 (0) | 2025.12.14 |