대상: 자율주행 시스템의 “계획(Planning)” 단계가 어떤 구조로 동작하는지 이해하고 싶은 개발자
환경: ROS/ROS2 기반 자율주행 스택 (예: Autoware, Apollo, LGSVL 등)
1. 문제/주제 요약
자율주행의 Planning(계획) 단계는
Perception(인식)과 Prediction(예측) 결과를 바탕으로
“차량이 어디로, 어떤 속도로, 어떤 행동으로 갈지”를 결정하는 핵심 부분입니다.
이 단계는 크게 세 가지 하위 모듈로 나뉩니다:
1️⃣ 전역 경로 계획 (Global Path Planning)
2️⃣ 지역 경로 계획 (Local Path / Trajectory Planning)
3️⃣ 행동 계획 (Behavior Planning)
이 세 모듈이 유기적으로 결합되어
“지도 기반 목적지 이동 + 실시간 장애물 회피”를 동시에 수행합니다.
2. 전체 파이프라인 구조
자율주행의 전체 데이터 흐름을 간단히 요약하면 다음과 같습니다:
[Sensor → Perception → Prediction]
↓
[Planning]
↓
[Control]
그중 Planning 내부는 다음처럼 구성됩니다:
Global Planner
↓
Behavior Planner
↓
Local Trajectory Planner
각 단계의 역할은 “어디로 → 어떻게 → 실제로”에 대응됩니다.
| 단계 | 역할 | 입력 | 출력 |
|---|---|---|---|
| Global Path | 목적지까지의 대략적인 도로 경로 | HD Map, GPS | 도로 단위 경로 |
| Behavior Planning | 주행 행위 결정 (정지/차선 변경/회피 등) | 인식/예측 결과 | 의사결정 (maneuver) |
| Local Trajectory | 실제 주행 궤적 생성 | Behavior 결과, 장애물 정보 | 시계열 궤적 (x, y, v, a) |
3. 전역 경로 계획 (Global Path Planning)
목적: 시작점에서 목적지까지의 “도로 단위 경로”를 생성
- 입력:
- HD Map (차로 연결 관계, 도로 구조)
- 출발지·목적지 (GPS 좌표 or map frame)
- 출력:
- 도로/차선 ID 기반의 경로 리스트
- Waypoint 시퀀스 (
/planning/global_path)
주요 알고리즘
| 알고리즘 | 설명 |
|---|---|
| A* | 격자 기반 최단경로 탐색 |
| Dijkstra | 비용 기반 탐색, 안정적 |
| D*-Lite / Hybrid A* | 차량 동역학 제약 포함 |
| Graph-based (HD Map) | Lane graph를 따라 경로 탐색 |
예시:
waypoints:
- [x: 124.5, y: 52.1]
- [x: 126.0, y: 53.2]
- [x: 127.3, y: 54.5]
전역 경로는 “지도 상의 고정 루트”로서,
지역 경로(Local Planner)가 이 위를 따라가며 실시간 조정합니다.
4. 행동 계획 (Behavior Planning)
목적: 현재 주행 상황에 맞는 “행동(behavior)”을 결정
예:
- 직진 / 정지 / 차선 변경 / 장애물 회피 / 좌회전 등
이 단계는 Planning의 두뇌 역할로,
전역 경로를 따르면서도 상황별 판단을 수행합니다.
주요 입력
- 인식 결과 (주변 객체, 차선, 신호등, 보행자 등)
- 예측 결과 (TTC, 객체 궤적)
- 현재 차량 상태 (속도, 조향각 등)
예시 상태 전이(State Machine)
FOLLOW_LANE → STOP_AT_TRAFFIC_LIGHT → START_MOVING
↘
AVOID_OBSTACLE
↘
CHANGE_LANE
Autoware 예시 토픽:
/planning/behavior_path_planner
Behavior Planner는 “다음 동작 명령”을 지역 궤적 생성기로 넘겨줍니다.
예:
- “앞차 정지 예상 → 감속”
- “좌측 차선 비어 있음 → 차선 변경 시도”
5. 지역 경로 계획 (Local Path / Trajectory Planning)
목적: 실제 차량이 따라갈 세밀한 주행 궤적 생성
- 입력:
- 전역 경로 (Global Path)
- 행동 계획 결과 (Behavior Output)
- 장애물 위치 (Perception/Prediction 결과)
- 출력:
- 시간축 기반 궤적 (x, y, yaw, v, a)
/planning/trajectory
대표 알고리즘
| 알고리즘 | 설명 |
|---|---|
| Polynomial Trajectory (Cubic/Quintic) | 시작/끝 상태를 만족하는 매끄러운 곡선 |
| Frenet Frame Planner | 도로 중심선 기준 lateral/longitudinal 계획 |
| Sampling-based (Lattice) | 후보 궤적 여러 개를 생성 후 비용 최소 선택 |
| MPC (Model Predictive Control) | 차량 모델 + 제약조건 최적화 기반 실시간 궤적 |
| Spline/Bezier | 차선 변경 등 자연스러운 곡선 생성 |
예시 궤적:
trajectory:
- [x: 125.0, y: 53.1, v: 4.5]
- [x: 125.6, y: 53.6, v: 4.2]
- [x: 126.2, y: 54.0, v: 3.8]
6. 계획 결과의 활용 (Control 단계 연계)
Local Planner의 출력은 제어(Control) 단계에서 다음과 같이 사용됩니다:
| 제어기 | 입력 | 제어 대상 |
|---|---|---|
| Lateral Controller | 궤적의 yaw, curvature | 조향각(Steering) |
| Longitudinal Controller | 속도, 가속도 | 페달/브레이크 제어 |
즉, Planning이 “가야 할 궤적”을 정하면,
Control은 “그 궤적을 실제로 따르는 제어”를 수행합니다.
7. ROS2 실제 파이프라인 예시 (Autoware Universe 기준)
/planning/global_route_planner
↓
/planning/behavior_path_planner
↓
/planning/obstacle_avoidance_planner
↓
/planning/trajectory_optimizer
↓
/control/trajectory_follower
각 노드는 다음 역할을 담당합니다:
- global_route_planner : 목적지까지 차로 단위 경로 탐색
- behavior_path_planner : 행동(정지, 차선 변경 등) 결정
- obstacle_avoidance_planner : 주변 장애물 반영
- trajectory_optimizer : 부드러운 속도·곡률 최적화
8. 추가 팁 / 자주 하는 실수
- 전역 경로 불연속 → Local Planner가 “path not found” 에러 발생
- HD Map 좌표계 불일치 → Behavior Planner가 차로 인식 실패
- ROI 객체 미제거 → 불필요한 장애물로 회피 동작 반복
- 속도 제한 미적용 → 도심 환경에서 비현실적인 속도 계획
⚙️ Tip:
rviz2에서/planning/global_path와/planning/trajectory
를 함께 표시하면 전역 경로 대비 실제 궤적의 차이를 직관적으로 확인할 수 있습니다.
9. 정리
자율주행의 Planning은 “미래를 예측하고, 그에 맞는 안전한 경로를 만드는 과정” 입니다.
핵심 단계는 다음 세 가지입니다:
1️⃣ 전역 경로(Global Path) — 목적지까지의 큰 그림
2️⃣ 행동 계획(Behavior Planning) — 지금 어떤 동작을 취할지 결정
3️⃣ 지역 궤적(Local Trajectory) — 실제 차량이 따라갈 구체적인 곡선
이 세 단계가 유기적으로 연결되어야
자율주행 차량은 “예측 가능한·자연스러운 주행” 을 할 수 있습니다.