대상: 자율주행이나 로봇 주행에서 “경로를 실제로 따라가기 위한 제어 원리”를 이해하고 싶은 개발자
환경: ROS/ROS2 기반 차량 제어 시스템 (Ackermann 차량 모델, Autoware/Navigation2 연동 환경)
1. 문제/주제 요약
자율주행 차량은 Planning(계획) 단계에서 “이렇게 가라” 라는 궤적(trajectory)을 받습니다.
하지만, 실제 차량은 관성, 마찰, 조향각 한계 등 물리적 제약을 가지고 있기 때문에
그 궤적을 그대로 따라가는 것은 불가능합니다.
이때 필요한 것이 제어(Control) 단계입니다.
즉,
“현재 위치와 목표 경로의 차이(error)”를 계산해,
이를 최소화하도록 조향(steering) 과 가속/감속(throttle, brake) 을 결정합니다.
2. 제어의 역할: Planning과 Control의 경계
자율주행 시스템의 주요 흐름은 다음과 같습니다:
Sensor → Perception → Prediction → Planning → Control
- Planning: 목표 경로 생성 (x, y, yaw, v, a)
- Control: 실제 차량이 이 목표를 따르도록 제어 신호 계산
즉,
Planning이 “어디로 갈지”를 정하면,
Control은 “어떻게 움직일지”를 결정합니다.
3. 차량 제어의 두 가지 핵심 축
자율주행 제어는 크게 두 가지로 나뉩니다:
| 제어 축 | 주요 제어기 | 제어 대상 |
|---|---|---|
| 종방향(Longitudinal) | PID, ACC, MPC | 속도(Throttle, Brake) |
| 횡방향(Lateral) | Pure Pursuit, Stanley, MPC | 조향각(Steering) |
4. 종방향 제어 (Longitudinal Control)
목적: 차량의 속도를 목표 속도(v_ref)에 맞추기
(1) 기본 개념
속도 오차:
e_v = v_ref - v_actual
(2) PID 제어기
PID는 가장 일반적인 속도 제어 방식입니다.
error = v_ref - v
integral += error * dt
derivative = (error - prev_error) / dt
output = Kp * error + Ki * integral + Kd * derivative
출력(output)은 throttle/brake로 변환됩니다.
- 양수 → 가속 페달
- 음수 → 브레이크
⚙️ ROS2에서는
/control/longitudinal_controller노드가 이 역할을 수행하며,/planning/trajectory의 목표 속도 값을 참조합니다.
(3) 고급 제어
- Adaptive Cruise Control (ACC): 앞차와의 거리 유지
- MPC 기반 속도 제어: 도로 경사·가속 제한 고려
5. 횡방향 제어 (Lateral Control)
목적: 차량이 경로(trajectory)를 벗어나지 않게 조향각을 조정
(1) Pure Pursuit 제어
원리:
- 차량 전방
lookahead distance만큼 떨어진 목표점을 향하도록 조향 - 삼각관계로부터 조향각 계산
공식:
δ = arctan(2L * sin(α) / Ld)
L: 차량 축간 거리 (wheelbase)α: 현재 헤딩과 목표점 방향의 각도 차Ld: lookahead distance (속도에 따라 가변 설정)
장점: 단순하고 안정적
단점: 저속 또는 급커브에서 진동 발생
ROS2 Autoware 예시 노드:/control/pure_pursuit_controller
(2) Stanley 제어
원리:
- 경로와의 가로 오차(cross-track error) 와 헤딩 오차(heading error) 를 함께 보정
공식:
δ = θ_e + arctan(k * e_y / v)
θ_e: 헤딩 오차e_y: 측면 오차v: 차량 속도k: 제어 gain
장점: 고속 주행 시 안정적
단점: 저속에서는 진동 가능
Stanley Controller는 실제 Google Waymo, Autoware 등에서도 사용됩니다.
(3) MPC (Model Predictive Control)
원리:
- 차량의 운동 모델을 수학적으로 표현하고,
- 일정 시간 구간 내의 궤적 오차를 최소화하도록 최적화(Optimization) 수행
모델 예시 (Kinematic Bicycle Model):
x_dot = v * cos(ψ)
y_dot = v * sin(ψ)
ψ_dot = v / L * tan(δ)
v_dot = a
목적 함수:
minimize ∑ (position_error² + heading_error² + control_effort²)
제약조건:
- 최대 조향각, 가속도 한계
- 노면 마찰 고려
장점: 고속·정밀 주행 가능
단점: 계산량 많음 (실시간 최적화 필요)
ROS2 예시:
/planning/trajectory → /control/mpc_trajectory_follower
6. 실제 ROS2 제어 파이프라인 예시
/planning/trajectory
↓
/control/trajectory_follower (Pure Pursuit / Stanley / MPC)
↓
/vehicle_cmd (steering, throttle, brake)
↓
CAN Interface → 차량 ECU
- 입력: 목표 궤적
- 출력: 실제 차량 구동 명령 (
/vehicle_cmd) - 제어 주기: 30~100Hz
7. 실전 튜닝 팁
| 제어기 | 주요 파라미터 | 조정 팁 |
|---|---|---|
| PID | Kp, Ki, Kd | Kp 높이면 응답 빠름, 진동 주의 |
| Pure Pursuit | lookahead_distance | 속도 비례로 증가시키면 부드러운 조향 |
| Stanley | k | 높을수록 강한 보정, 저속시 진동 |
| MPC | prediction_horizon, Q, R | Q=오차 가중, R=제어 노력 가중 |
🔍 Tip:
rviz2에서/planning/trajectory와/control/steering_cmd를 함께 시각화하면
차량이 경로를 어떻게 따라가는지 즉시 확인할 수 있습니다.
8. 추가 실수 및 주의사항
- 좌표계 불일치 (base_link / map) → 조향각 계산 오류
- Latency(지연) → 고속 주행 시 진동 유발
- 타이어 슬립 미모델링 → 실제 주행 경로와 궤적 불일치
- Throttle/Brake saturation → 급감속 시 오버슈트
9. 정리
자율주행의 Control 단계는 “경로를 현실에서 구현하는 단계” 입니다.
핵심 요약:
1️⃣ 종방향 제어(Longitudinal) — 목표 속도에 맞게 가감속 결정
2️⃣ 횡방향 제어(Lateral) — 차량이 경로를 따라가도록 조향 계산
3️⃣ MPC — 두 축을 통합해 최적화 기반으로 제어
제어기의 선택은 속도, 환경, 차량 모델에 따라 달라집니다:
- 저속·간단한 주행 → PID + Pure Pursuit
- 고속·정밀 제어 → MPC