Control(제어) 기초: 경로를 따라가기 위해 조향·가감속을 어떻게 계산하는가

대상: 자율주행이나 로봇 주행에서 “경로를 실제로 따라가기 위한 제어 원리”를 이해하고 싶은 개발자
환경: 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. 실전 튜닝 팁

제어기주요 파라미터조정 팁
PIDKp, Ki, KdKp 높이면 응답 빠름, 진동 주의
Pure Pursuitlookahead_distance속도 비례로 증가시키면 부드러운 조향
Stanleyk높을수록 강한 보정, 저속시 진동
MPCprediction_horizon, Q, RQ=오차 가중, 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

댓글 남기기