Chapter 20

예측·계획·제어

센서와 인지가 "지금 주변에 무엇이 어디에 있는가"에 답했다면, 이제 차는 "그래서 어떻게 움직일 것인가"를 정해야 한다. 주변 차와 보행자가 몇 초 뒤 어디에 있을지 예측하고, 목적지까지의 길을 찾고, 차로를 바꿀지 기다릴지 판단하고, 승객이 편안하면서도 부딪히지 않는 궤적을 그린 다음, 조향과 가감속으로 그 궤적을 실제로 따라간다. 이 장은 그 판단과 조작의 사슬을 위에서 아래로 따라 내려가며 하나씩 손으로 돌려 본다.

인지 다음에 오는 일

19장의 인지와 측위는 차 주변의 세계를 숫자로 바꿔 놓았다. 내 차의 위치와 자세, 차로의 형상, 주변 물체의 위치·속도·종류가 초당 수십 번 갱신된다. 하지만 이 정보만으로는 스티어링 휠이 한 눈금도 돌아가지 않는다. 사람이 운전할 때 머릿속에서 일어나는 일을 떠올려 보자. 내비게이션이 알려 준 길을 따라가다가, 앞의 느린 트럭을 보고 추월을 마음먹고, 옆 차로의 빈틈을 확인한 뒤, 부드럽게 핸들을 꺾어 차로를 옮긴다. 이 과정에는 서로 다른 규모의 결정이 층층이 쌓여 있다.

자율주행 소프트웨어도 같은 문제를 여러 층으로 나누어 푼다. 한 번에 "목적지까지의 모든 조향각"을 계산하는 것은 불가능에 가깝기 때문이다. 위층일수록 멀리 보고 천천히 결정하며, 아래층일수록 가까이 보고 빠르게 반응한다.

인지 · 측위 물체, 차로, 내 위치 예측 주변 물체의 미래 궤적 지도 · 목적지 도로망, 규칙 ① 경로 탐색 (route) 어느 도로로 갈 것인가 ② 행동 결정 (behavior) 추종, 차로 변경, 양보, 정지 ③ 궤적 계획 (motion) 시간이 붙은 경로 x(t), y(t) ④ 제어 (control) 조향각, 구동·제동 토크 수 km ~ 수백 km분 단위, 필요할 때 수백 m약 1~10 Hz 50~200 m, 5~10 s약 10~20 Hz 수 m, 1 s 이내약 50~100 Hz 보는 범위갱신 주기
그림 20-1. 계획과 제어의 계층. 아래로 갈수록 보는 범위는 짧아지고 갱신은 빨라진다. 수치는 대표적인 범위다.
층질문출력대표 기법
예측다른 차와 보행자는 어디로 갈까물체별 미래 궤적과 확률운동 모델, 차로 기반 가설, 학습 모델
경로 탐색어느 길로 갈까도로·차로의 순서다익스트라, A*
행동 결정지금 무엇을 할까행동 목표(차로 변경, 정지선 정지 등)상태 기계, 비용 기반 선택
궤적 계획정확히 어떤 선을 어떤 속도로 그릴까수 초 길이의 궤적다항식 샘플링, 격자 탐색, 최적화
제어그 선을 따라가려면 얼마나 꺾고 밟을까조향·가속·제동 명령PID, 퓨어 퍼슈트, 스탠리, LQR, MPC

층을 나누면 각 층을 따로 설계하고 시험할 수 있다는 장점이 있다. 대신 층 사이의 약속이 어긋나면 문제가 생긴다. 행동 결정이 "차로를 바꿔라"라고 했는데 궤적 계획이 차의 운동 한계 안에서 그런 궤적을 찾지 못할 수 있다. 그래서 아래층은 실패를 위층에 알리고, 위층은 다른 행동을 고르는 되먹임이 반드시 필요하다. 최근에는 이 층들을 하나의 신경망으로 묶으려는 시도도 활발한데, 이는 장의 끝과 21장에서 다룬다.

경로와 궤적. 이 장에서 경로(path)는 공간에 그려진 선, 즉 "어디를 지나는가"만을 뜻한다. 궤적(trajectory)은 거기에 시간이 붙은 것, 즉 "언제 어디에 있는가"다. 같은 경로라도 속도 프로파일이 다르면 다른 궤적이다.

예측: 다른 차의 몇 초 뒤

계획은 미래에 대한 것이므로, 지금의 장면만으로는 부족하다. 교차로에 다가오는 저 차가 3초 뒤에 내 앞을 가로지를지, 속도를 줄여 우회전할지에 따라 내가 할 일이 달라진다. 예측(prediction)은 인지가 추적해 준 물체의 현재 상태(위치, 속도, 방향, 종류)를 받아 앞으로 대표적으로 약 3~8초 동안의 위치를 내놓는다.

운동 모델로 미는 예측

가장 단순한 방법은 "지금 하던 대로 계속한다"고 가정하는 것이다. 등속 모델(Constant Velocity, CV)은 현재 속도 벡터를 그대로 연장한다.

$$\mathbf{p}(t+\tau) = \mathbf{p}(t) + \mathbf{v}(t)\,\tau, \qquad \mathbf{p}(t+\tau) = \mathbf{p}(t) + \mathbf{v}\,\tau + \tfrac{1}{2}\mathbf{a}\,\tau^2$$
왼쪽은 등속 모델, 오른쪽은 가속도까지 유지된다고 보는 등가속 모델(CA)이다. \(\tau\)는 예측 시간.

회전하고 있는 차에는 요 레이트까지 유지된다고 보는 등속 회전 모델(Constant Turn Rate and Velocity, CTRV)이 더 맞는다. 이런 운동 모델은 칼만 필터의 예측 단계와 같은 식이며, 1초 이내의 짧은 구간에서는 꽤 정확하다. 문제는 그다음이다. 도로가 굽어 있으면 등속 모델은 차를 도로 밖으로 내보내고, 교차로 앞에서 감속 중인 차에 등가속 모델을 적용하면 몇 초 뒤에는 뒤로 달리는 차가 된다. 운동 모델은 물리는 알지만 도로와 의도는 모른다.

차로를 아는 예측, 여러 가설

차는 대개 차로를 따라 달린다. 그래서 정밀 지도의 차로 중심선을 가져와 "이 차는 이 차로를 따라간다"고 가정하면 훨씬 먼 미래까지 그럴듯한 예측이 나온다. 다만 교차로처럼 갈 수 있는 차로가 여럿이면 하나만 고를 수 없다. 이때는 직진·좌회전·우회전 각각을 가설로 두고, 관측이 각 가설과 얼마나 맞는지에 따라 확률을 매긴다.

$$P(m_i \mid z) \;\propto\; P(z \mid m_i)\,P(m_i)$$
\(m_i\)는 i번째 기동 가설, \(z\)는 관측(차로 중심에서 벗어난 거리, 방향 차이, 감속 여부, 방향지시등 등). 베이즈 규칙으로 사전 확률을 관측으로 고친다.

예측에는 위치뿐 아니라 불확실성도 함께 붙는다. 먼 미래일수록 가능한 위치가 넓게 퍼지므로, 계획 쪽은 확률이 낮더라도 위험한 가설을 완전히 무시하지 않도록 설계한다. 아래 시뮬레이터에서 서쪽에서 교차로로 들어오는 차를 세 가지 방법으로 예측해 보자.

SIMULATOR

교차로 진입 차량의 예측 비교

상대 차의 실제 의도
가설 확률 (직진 / 좌 / 우)—
CV 오차—
CTRV 오차—
최빈 가설 오차—
해볼 것: 테두리만 그려진 차가 예측 시간 뒤의 실제 위치(정답)다. 재생 위치를 천천히 옮기며 교차로 직전에서 세 예측의 오차를 비교한다. 방향지시등을 끄면 확률이 언제 뒤집히는지, 회전 도중에는 CTRV가 왜 CV보다 나은지, 회전이 끝난 직후에는 왜 다시 틀리는지 확인한다.

상호작용

지금까지의 예측은 상대를 내 행동과 무관하게 움직이는 물체로 취급했다. 실제 도로에서는 그렇지 않다. 내가 차로 변경을 시작하면 뒤차가 속도를 줄여 주고, 내가 머뭇거리면 상대가 먼저 지나간다. 예측과 계획을 완전히 분리하면 혼잡한 합류 구간에서 "빈틈이 생길 때까지 영원히 기다리는" 문제가 생긴다. 이를 줄이려고 내 후보 궤적별로 상대의 반응을 조건부로 예측하거나, 여러 참여자의 미래를 한꺼번에 추론하는 학습 기반 모델을 쓴다. 최근의 예측 모델은 지도와 주변 물체의 과거 궤적을 입력으로 받아 여러 개의 미래 궤적과 그 확률을 직접 출력한다.

전역 경로 탐색: 다익스트라와 A*

가장 위층의 계획은 내비게이션과 같은 일을 한다. 도로망을 그래프로 본다. 교차로나 차로의 분기점이 노드, 그 사이의 도로 구간이 간선이며, 간선에는 거리나 예상 소요 시간 같은 비용이 붙는다. 자율주행에서는 도로 단위가 아니라 차로 단위의 그래프를 쓰고, 차로 변경도 비용이 있는 간선으로 넣는다.

4358 2345 S A B C D G 노드 A의 평가 g(A) = 4온 거리 h(A) = 8남은 추정 f = g + h = 12 노드 B의 평가 g(B) = 3, h(B) = 10 f = 13 A를 먼저 펼친다
그림 20-2. 도로 그래프. 간선의 숫자는 비용이다. A*는 지금까지 온 비용 g와 목표까지의 추정 비용 h를 더한 f가 가장 작은 노드부터 펼친다. 굵은 선이 최단 경로(비용 13)다.

다익스트라(Dijkstra) 알고리즘은 출발점에서 가까운 노드부터 차례로 확정해 나간다. 출발점에 물을 부었을 때 물이 퍼지는 순서와 같다. 반드시 최단 경로를 찾지만, 목표가 어느 쪽에 있는지 모르는 채로 사방으로 퍼지므로 쓸데없는 곳까지 조사한다.

A*는 여기에 "목표까지 대략 얼마나 남았는가"라는 추정값, 즉 휴리스틱(heuristic) \(h(n)\)을 더한다.

$$f(n) = g(n) + w\,h(n)$$
\(g(n)\)은 출발점에서 n까지 실제로 든 비용, \(h(n)\)은 n에서 목표까지의 추정 비용, \(w\)는 휴리스틱 가중치. \(w=0\)이면 다익스트라, \(w=1\)이면 표준 A*다.

휴리스틱이 실제 남은 비용을 절대 넘지 않으면(직선 거리가 대표적이다) A*는 다익스트라와 똑같이 최단 경로를 보장하면서 조사하는 노드 수를 크게 줄인다. \(w\)를 1보다 키우면 목표 쪽으로 더 탐욕스럽게 달려가 훨씬 빨라지지만, 찾은 경로가 최단이 아닐 수 있다. 계산 시간과 경로 품질을 맞바꾸는 것이다.

SIMULATOR

격자 지도에서의 다익스트라와 A*

끌어서 벽 그리기 · S/G는 끌어서 이동
펼친 노드 수—
경로 길이—
다익스트라 (w=0)—
노드 수 절감—
해볼 것: w를 0, 1, 2로 바꿔 가며 재생한다. 색이 진할수록 나중에 펼친 칸이다. w=0에서는 원형으로 퍼지고, w=1에서는 목표 쪽으로 길쭉해진다. 예시 지도의 ㄷ자 벽처럼 목표 방향이 막힌 곳에서 w가 큰 탐색이 어떻게 헛걸음하고, 경로 길이가 최단보다 얼마나 길어지는지 확인한다.

실제 도로망은 노드가 수백만 개에 이르므로, 미리 계산해 둔 계층 구조(고속도로 우선 탐색, 축약 계층 등)를 함께 써서 대륙 규모의 경로도 밀리초 단위로 찾는다. 경로 탐색은 한 번 계산해 두고 길을 벗어나거나 통제 구간이 생겼을 때만 다시 한다.

행동 결정: 지금 무엇을 할 것인가

경로가 "2 km 앞에서 오른쪽 출구로 나간다"를 정했다면, 행동 결정 층은 그 사이의 전술을 정한다. 앞차를 따라갈지, 추월할지, 언제 출구 쪽 차로로 옮길지, 신호등 앞에서 설지를 고른다. 가장 오래되고 지금도 널리 쓰이는 방법은 유한 상태 기계(Finite State Machine, FSM)다. 차가 있을 수 있는 행동 상태를 몇 개로 나누고, 어떤 조건이 만족되면 다른 상태로 넘어가는지를 규칙으로 적는다.

현재 상태전이 조건다음 상태
차로 유지앞차와의 시간 간격이 줄어들고 앞차가 내 희망 속도보다 느림추종
추종앞차가 희망 속도보다 충분히 느린 상태가 일정 시간 지속차로 변경 준비
차로 변경 준비옆 차로의 앞·뒤 간격이 모두 필요 간격 이상차로 변경
차로 변경목표 차로 중심에 도달차로 유지
추종앞이 비거나 앞차가 빨라짐차로 유지

간격 수락

차로 변경이나 합류, 비보호 좌회전에서 핵심은 "저 빈틈에 들어가도 되는가"다. 이를 간격 수락(gap acceptance)이라 한다. 옆 차로에서 내 앞에 있을 차와 뒤에 있을 차에 대해 각각 필요한 간격을 계산하고, 둘 다 만족할 때만 진입한다. 뒤차가 나보다 빠르면 그 차가 급하지 않게 감속해서 속도를 맞출 수 있을 만큼의 거리를 더 요구한다.

$$g_{\text{rear}} \ge d_0 + \tau\,v_r + \frac{\max(0,\;v_r - v_e)^2}{2\,b}$$
\(d_0\)는 정지 여유 거리, \(\tau\)는 시간 간격, \(v_r\)은 뒤차 속도, \(v_e\)는 내 속도, \(b\)는 뒤차에 기대하는 편안한 감속도.
계산 예. 내가 70 km/h(19.4 m/s), 옆 차로 뒤차가 90 km/h(25 m/s)로 다가온다. \(d_0=3\) m, \(\tau=0.8\) s, \(b=2\ \mathrm{m/s^2}\)이면 필요한 뒤 간격은 \(3 + 0.8\times25 + (25-19.4)^2/(2\times2) \approx 3 + 20 + 7.8 = 30.8\) m다. 속도 차가 없다면 23 m면 충분하다. 추월 차로로 들어가기 전에 속도를 올려 두는 것이 왜 유리한지 숫자로 보인다.
SIMULATOR

고속도로 행동 상태 기계

상태—
옆 차로 앞 간격 / 필요—
옆 차로 뒤 간격 / 필요—
자차 속도—
해볼 것: 자차(강조색)는 희망 속도 100 km/h로 달리다가 느린 앞차를 만난다. 처음 설정에서는 옆 차로 차간 거리가 좁아 "차로 변경 준비"에서 계속 기다린다. 차간 거리를 55 m 이상으로 넓히면 초록색 간격 창이 열리며 차로 변경으로 전이한다. 옆 차로 속도를 올리면 필요한 뒤 간격이 얼마나 늘어나는지 본다. 차는 실제보다 크게 그렸다.

규칙 기반과 비용 기반

상태 기계는 이해하기 쉽고, 왜 그런 결정을 했는지 추적할 수 있어 안전 검증에 유리하다. 하지만 상황이 복잡해질수록 상태와 전이 조건이 폭발적으로 늘어나고, 조건의 경계에서 결정이 이리저리 뒤집히는 문제가 생긴다. 그래서 요즘은 규칙으로 후보 행동을 걸러 낸 다음, 남은 후보마다 비용(예상 소요 시간, 위험도, 편안함, 교통 법규 위반 정도)을 계산해 가장 낮은 것을 고르는 방식을 많이 쓴다. 행동 트리, 확률적 의사결정 모델(POMDP의 근사), 학습 기반 정책도 같은 자리에 들어갈 수 있다. 어떤 방식이든 "한 번 정한 행동은 약간 더 싸게 쳐 준다"는 이력 효과를 넣어 결정이 떨리지 않게 한다.

궤적 계획: 부드럽고 안전한 선

행동이 "왼쪽 차로로 옮긴다"로 정해졌다. 이제 앞으로 몇 초 동안 차가 지나갈 정확한 선과 시각을 만들어야 한다. 좋은 궤적은 세 가지를 만족한다. 다른 물체와 부딪히지 않고(안전), 가속도와 그 변화가 작으며(편안함), 목적지에 쓸데없이 늦지 않는다(효율). 그리고 무엇보다 차가 실제로 따라갈 수 있어야 한다.

프레네 좌표계

도로는 굽어 있지만 운전자는 "차로를 따라 얼마나 갔는가"와 "차로 중심에서 옆으로 얼마나 벗어났는가"로 생각한다. 프레네 좌표계(Frenet frame)는 이 직관을 그대로 좌표로 만든 것이다. 기준선(보통 차로 중심선)을 따라 잰 거리 \(s\)와 기준선에서 수직으로 벗어난 거리 \(d\)를 쓴다. 굽은 도로를 곧게 펴서 보는 셈이어서, 차로 변경은 도로 형상과 상관없이 "\(d\)를 0에서 3.5 m로 옮기는 일"이 된다.

s (기준선을 따라 잰 거리) d 기준선 도로 위에서 (x, y) 프레네 좌표로 펴면 (s, d) s d sd d = 0 (차로 중심)
그림 20-3. 프레네 좌표계. 굽은 기준선을 따라 잰 거리 s와 수직 오프셋 d로 위치를 나타내면 도로가 곧은 띠로 펴진다.

저크를 최소로 하는 5차 다항식

승객이 느끼는 불쾌감은 가속도 자체보다 가속도가 변하는 빠르기, 즉 저크(jerk)와 관계가 깊다. 시작과 끝의 위치·속도·가속도가 주어졌을 때 저크 제곱의 적분을 최소로 하는 곡선은 시간에 대한 5차 다항식임이 알려져 있다. 미지수가 여섯 개이고 경계 조건도 여섯 개(양 끝의 위치·속도·가속도)이므로 계수가 하나로 정해진다. 횡방향으로 정지 상태에서 정지 상태로 \(D\)만큼 옮기는 경우는 식이 특히 간단하다.

$$d(t) = D\,\bigl(10\,\tau^3 - 15\,\tau^4 + 6\,\tau^5\bigr), \qquad \tau = t/T$$ $$a_{y,\max} \approx 5.77\,\frac{D}{T^2}, \qquad j_{\max} = 60\,\frac{D}{T^3}, \qquad \int_0^T j^2\,dt = 720\,\frac{D^2}{T^5}$$
\(D\)는 횡 이동 거리, \(T\)는 차로 변경 시간. 최대 횡가속도는 \(T^2\)에, 최대 저크는 \(T^3\)에 반비례한다.
계산 예. 차로 폭 3.5 m를 5초에 옮기면 최대 횡가속도는 \(5.77\times3.5/25 \approx 0.81\ \mathrm{m/s^2}\), 최대 저크는 \(60\times3.5/125 = 1.68\ \mathrm{m/s^3}\)이다. 같은 차로 변경을 2.5초에 하면 각각 3.2 m/s²와 13.4 m/s³로, 시간은 절반인데 저크는 8배가 된다. 주행 보조 시스템은 대표적으로 횡가속도 약 3 m/s², 횡저크 약 5 m/s³ 이내로 움직이도록 설계한다.

후보를 뿌리고 비용으로 고른다

하나의 궤적만 계산하면 그 궤적이 장애물과 겹칠 때 대안이 없다. 그래서 끝 조건을 조금씩 바꾼 후보를 한꺼번에 여러 개 만든다. 차로 변경 시간 \(T\)를 여러 값으로, 목표 횡 위치 \(D\)를 차로 중심 좌우로 조금씩 바꿔 부채꼴 모양의 후보 다발을 만든 다음, 각 후보에 대해 다음을 차례로 검사한다.

운동 한계가속도·저크·곡률이 한계를 넘는 후보를 버린다.
충돌 검사예측된 다른 물체의 위치와 시각별로 겹치는지 확인한다.
비용 계산남은 후보에 편안함·시간·목표 이탈 비용을 매긴다.
선택비용이 가장 낮은 궤적을 제어기에 넘긴다.
$$J = w_j \int_0^T j^2\,dt \;+\; w_t\,T \;+\; w_d\,(D - D_{\text{target}})^2$$
첫 항은 편안함, 둘째 항은 효율(빨리 끝낼수록 좋음), 셋째 항은 목표 차로 중심에서 벗어난 정도. 가중치 \(w\)가 주행 성격을 정한다.
SIMULATOR

저크 최소 차로 변경과 후보 샘플링

횡가속도 [m/s²]횡저크 [m/s³]가속도 한계 ±3저크 한계 ±5
모드
선택된 궤적—
최대 횡가속도—
최대 횡저크—
변경 중 주행 거리—
살아남은 후보—
해볼 것: 정지한 장애물 차를 끌어서 옮긴다. 점선 상자는 자차 중심이 들어가면 충돌로 보는 영역(상대 차 크기에 자차 크기와 여유를 더한 것)이다. 빨간 후보는 충돌, 주황 후보는 편안함 한계 초과로 버려진다. 장애물을 가까이 당기면 긴 T 후보가 차례로 사라지고, 끝내 남는 후보가 없으면 행동 결정 층이 감속을 골라야 한다. "궤적 하나" 모드에서는 T를 줄이며 저크가 한계를 넘는 지점을 찾는다. 가로와 세로의 축척은 다르다.

격자 탐색과 최적화

다항식 샘플링은 차로가 분명한 도로에서 빠르고 잘 동작한다. 하지만 주차장이나 공사 구간처럼 기준선이 없는 비정형 공간에서는 쓸 수 없다. 이때는 앞에서 본 A*를 차에 맞게 고친 하이브리드 A*를 쓴다. 일반 A*는 격자 칸에서 옆 칸으로 아무 방향이나 이동하지만, 차는 제자리에서 옆으로 움직일 수 없다. 하이브리드 A*는 노드를 (위치, 방향)의 연속 상태로 두고, "최대로 왼쪽·직진·최대로 오른쪽, 그리고 전진·후진"으로 짧게 굴러간 결과만을 이웃으로 삼는다. 그래서 찾은 경로는 처음부터 차의 최소 회전 반경을 지킨다.

SIMULATOR

하이브리드 A* 주차 경로

출발 차를 끌어서 이동
주차 방식
펼친 상태 수—
경로 길이—
전·후진 전환—
계산 시간—
해볼 것: 가는 선은 탐색이 시도한 움직임, 굵은 선은 찾은 경로다(전진은 강조색, 후진은 주황). 회전 반경을 키우면 한 번에 들어가지 못하고 전·후진을 반복하는 경로가 나온다. 전면 주차와 후면 주차 중 어느 쪽이 좁은 통로에서 유리한지 비교한다. 탐색은 목표 자세의 허용 오차 안에 들면 끝나며, 실제 구현은 마지막 구간을 해석적인 곡선으로 정확히 이어 붙인다.

샘플링이나 탐색으로 얻은 궤적은 후보가 이산적이어서 조금 거칠다. 최적화 기반 계획은 궤적을 수십 개의 점으로 나타내고, 부드러움과 장애물과의 거리, 차의 운동 한계를 비용과 제약으로 적은 다음 수치 최적화로 푼다. 품질은 가장 좋지만 좋은 초기값이 없으면 엉뚱한 해에 빠지므로, 실제 시스템은 탐색이나 샘플링으로 대략의 궤적을 찾은 뒤 최적화로 다듬는 2단 구성을 많이 쓴다.

차가 따라갈 수 있는 궤적

종이 위에서는 어떤 선이든 그릴 수 있지만, 차는 그렇게 움직이지 못한다. 계획이 지켜야 하는 차의 운동 제약을 가장 간단하게 담은 것이 기구학 자전거 모델(kinematic bicycle model)이다. 좌우 바퀴를 하나로 합쳐 앞바퀴 하나와 뒷바퀴 하나로 보고, 타이어가 옆으로 미끄러지지 않는다고 가정한다. 타이어의 슬립각까지 고려하는 동역학 모델은 10장에서 다뤘다.

δ δ 회전 중심 R L (휠베이스) 뒷바퀴 (x, y, θ) 운동 방정식 dx/dt = v cos θ dy/dt = v sin θ dθ/dt = v tan δ / L R = L / tan δ 곡률 κ = 1/R
그림 20-4. 기구학 자전거 모델. 두 바퀴의 축에 수직인 선이 만나는 점이 회전 중심이며, 조향각 δ가 회전 반경을 정한다.
$$\dot{x} = v\cos\theta, \qquad \dot{y} = v\sin\theta, \qquad \dot{\theta} = \frac{v}{L}\tan\delta, \qquad \kappa = \frac{1}{R} = \frac{\tan\delta}{L}$$
\((x, y)\)는 뒤 차축 중심, \(\theta\)는 차의 방향, \(v\)는 속도, \(\delta\)는 앞바퀴 조향각, \(L\)은 휠베이스, \(\kappa\)는 경로의 곡률.

이 식에서 두 가지 제약이 나온다. 첫째, 조향각에는 기계적 한계가 있으므로 최소 회전 반경이 있다. 휠베이스 2.7 m에 앞바퀴 최대 조향각이 35°라면 뒤 차축 중심 기준으로 \(R = 2.7/\tan35° \approx 3.9\) m이고, 차체 바깥 모서리 기준의 최소 회전 반경은 대표적으로 약 5~6 m다. 경로의 곡률이 \(1/R_{\min}\)보다 크면 차는 그 경로를 따라갈 수 없다. 둘째, 조향각은 순간적으로 바뀌지 못하므로 곡률은 연속이어야 한다. 직선에 원호를 바로 이어 붙인 경로는 접점에서 스티어링 휠을 순간 이동시키라고 요구하는 셈이다. 그래서 도로 설계와 궤적 계획 모두 곡률이 서서히 변하는 완화 곡선이나 스플라인을 쓴다.

속도는 곡률이 정한다

속도가 붙으면 타이어의 한계가 더 엄한 제약이 된다. 곡률 \(\kappa\)인 경로를 속도 \(v\)로 돌면 횡가속도는 \(a_y = v^2\kappa\)다. 7장에서 본 대로 타이어가 낼 수 있는 힘은 마찰원 안에 있으므로, 횡가속도와 종가속도를 합친 크기가 \(\mu g\)를 넘을 수 없다. 자율주행차는 승차감을 위해 이보다 훨씬 낮은 편안함 한계를 스스로 건다.

$$v_{\max}(s) = \sqrt{\frac{a_{y,\max}}{|\kappa(s)|}}, \qquad a_x^2 + a_y^2 \le (\mu g)^2$$
\(a_{y,\max}\)는 허용 횡가속도. 편안한 주행에서는 대표적으로 약 2~3 m/s², 마른 노면의 물리적 한계는 약 8~9 m/s²다.
계산 예. 반경 100 m(\(\kappa = 0.01\ \mathrm{m^{-1}}\))인 커브를 횡가속도 2 m/s² 이내로 돌려면 \(v = \sqrt{2/0.01} = 14.1\) m/s, 약 51 km/h가 한계다. 같은 커브를 마찰 한계(8 m/s²)까지 쓰면 28.3 m/s, 약 102 km/h다. 반경이 4분의 1로 줄면 제한 속도는 절반이 된다.

코너 제한 속도만으로는 속도 계획이 끝나지 않는다. 코너 직전에서 순식간에 속도를 떨어뜨릴 수는 없기 때문이다. 그래서 두 번 훑는다. 후진 패스는 경로의 끝에서 시작점 쪽으로 거슬러 오르며 "다음 지점의 속도까지 허용 감속도로 줄일 수 있는 최대 속도"로 깎는다. 전진 패스는 시작점에서 끝으로 가며 "이전 지점에서 허용 가속도로 올릴 수 있는 최대 속도"로 다시 깎는다.

$$v_i \le \sqrt{v_{i+1}^2 + 2\,a_{\text{dec}}\,\Delta s} \;\;(\text{backward}), \qquad v_i \le \sqrt{v_{i-1}^2 + 2\,a_{\text{acc}}\,\Delta s} \;\;(\text{forward})$$
\(\Delta s\)는 이웃한 경로점 사이의 거리, \(a_{\text{dec}}\)와 \(a_{\text{acc}}\)는 허용 감속도와 가속도의 크기.
SIMULATOR

곡률 기반 속도 계획

제어점을 끌어 도로를 바꾼다
계산 단계
주행 시간—
최소 곡률 반경—
가장 느린 코너—
지금 (속도 / 종 / 횡)—
해볼 것: 도로는 가속 구간이 초록, 감속 구간이 빨강, 한계 속도로 달리는 구간이 강조색이다. 계산 단계를 하나씩 올려 점선(곡률 한계)이 후진 패스와 전진 패스로 어떻게 깎이는지 본다. 제어점을 끌어 급한 코너를 만들면 그 앞에 감속 구간이 길게 생긴다. 감속도 한계를 낮추면 브레이크를 밟기 시작하는 지점이 얼마나 앞당겨지는지 확인한다.

제어: 궤적을 따라가는 손과 발

궤적 계획이 내놓은 것은 "0.1초 뒤에는 여기, 0.2초 뒤에는 저기"라는 목표의 나열이다. 제어기는 지금의 위치·속도와 목표의 차이를 보고 조향각과 구동·제동 명령을 계산한다. 보통 속도를 맡는 종방향 제어와 조향을 맡는 횡방향 제어로 나누어 설계한다.

종방향: PID

속도 제어의 기본은 17장의 ACC에서 본 PID 제어다. 목표 속도와 실제 속도의 차이에 비례하는 항, 그 누적에 비례하는 항, 변화율에 비례하는 항을 더해 가속도 명령을 만들고, 이를 엔진·모터 토크나 브레이크 압력으로 바꾼다. 계획이 준 목표 가속도를 그대로 더해 주는 앞먹임(feedforward)을 함께 쓰면 오차가 생기기 전에 미리 움직일 수 있다.

$$a_{\text{cmd}} = a_{\text{ref}} + K_p\,e + K_i\!\int e\,dt + K_d\,\dot{e}, \qquad e = v_{\text{ref}} - v$$
\(a_{\text{ref}}\)는 궤적이 요구하는 가속도(앞먹임), 나머지는 오차를 줄이는 되먹임 항이다.

횡방향: 퓨어 퍼슈트

퓨어 퍼슈트(pure pursuit)는 사람이 운전할 때 "저 앞의 한 점을 보고 그쪽으로 간다"는 감각을 그대로 옮긴 기하학적 방법이다. 뒤 차축 중심에서 경로 위로 전방 주시 거리(lookahead distance) \(L_d\)만큼 떨어진 점을 목표점으로 잡는다. 지금 자세에서 출발해 그 점을 지나는 원호는 하나뿐이고, 그 원호의 반경에 맞는 조향각을 자전거 모델로 구한다.

기준 경로 α 2α 목표점 원호 중심 L_d R L 현의 길이와 원호 반경 L_d = 2 R sin α κ = 1/R = 2 sin α / L_d δ = atan(2 L sin α / L_d) 자전거 모델 tan δ = L κ
그림 20-5. 퓨어 퍼슈트. 뒤 차축에서 목표점까지의 선분은 원호의 현이며, 차의 방향과 이루는 각 α로부터 조향각이 정해진다.
$$\delta = \arctan\!\left(\frac{2L\sin\alpha}{L_d}\right)$$
\(\alpha\)는 차의 방향과 목표점 방향 사이의 각, \(L_d\)는 전방 주시 거리, \(L\)은 휠베이스.
계산 예. 휠베이스 2.7 m, 주시 거리 10 m, 목표점이 진행 방향에서 10° 왼쪽에 있으면 \(\delta = \arctan(2\times2.7\times\sin10°/10) = \arctan(0.094) \approx 5.4°\)다. 주시 거리를 5 m로 줄이면 같은 각도 오차에 대해 조향각이 약 두 배가 된다. 주시 거리가 조향의 민감도를 정하는 셈이다.

조정 변수는 사실상 \(L_d\) 하나다. 짧게 잡으면 경로에 바짝 붙지만 작은 오차에도 크게 꺾어 차가 좌우로 흔들린다. 길게 잡으면 부드럽지만 코너에서 안쪽을 깎아 지나간다. 그래서 보통 속도에 비례해 \(L_d = k\,v\)로 늘린다. 사람도 빨리 달릴수록 멀리 본다.

스탠리와 LQR

스탠리(Stanley) 제어기는 앞 차축을 기준으로 삼는다. 조향각은 두 항의 합이다. 하나는 경로의 방향과 차의 방향 차이 \(\psi_e\)를 그대로 메우고, 다른 하나는 앞 차축이 경로에서 벗어난 거리 \(e\)에 비례해 경로 쪽으로 꺾는다. 속도로 나누어 주므로 빨리 달릴수록 같은 오차에 조향을 덜 쓴다.

$$\delta = \psi_e + \arctan\!\left(\frac{k\,e}{v}\right)$$
\(\psi_e\)는 방향 오차, \(e\)는 앞 차축의 횡 오차, \(k\)는 게인, \(v\)는 속도.

LQR(Linear Quadratic Regulator)은 한 걸음 더 나아가 차량 모델을 직접 쓴다. 횡 오차, 방향 오차와 그 변화율을 상태로 두고, 차의 운동을 선형 모델로 적은 다음 "오차 제곱과 조향 사용량 제곱의 가중 합"을 최소로 하는 되먹임 게인을 수학적으로 구한다. 게인을 감으로 맞추는 대신 "오차를 얼마나 싫어하는가"와 "조향을 얼마나 아끼는가"의 비율만 정하면 된다.

SIMULATOR

퓨어 퍼슈트와 스탠리 경로 추종

화면을 눌러 차를 옮긴다
제어기
횡 오차—
횡 오차 RMS (20 s)—
조향각—
횡가속도—
해볼 것: 차는 기구학 자전거 모델을 실제로 적분해 움직이며, 조향 액추에이터의 지연(약 0.25 s)과 조향각·조향 속도 한계가 들어 있다. 기본 속도(7 m/s)에서 주시 거리를 1.5 m로 줄이면 차가 좌우로 크게 흔들리며 경로를 벗어난다. 속도를 12 m/s로 올리면 3 m에서도 같은 일이 생긴다. 빠를수록 멀리 봐야 하는 이유다. 반대로 12 m 이상으로 늘리면 흔들림은 없지만 코너 안쪽을 1 m 넘게 깎는다. 스탠리로 바꾼 뒤 "옆으로 2 m 밀기"를 눌러 게인에 따라 경로로 돌아오는 빠르기가 어떻게 달라지는지 본다. 아래 그래프는 차 중심의 횡 오차다(양수는 경로의 왼쪽).

MPC: 미래를 내다보는 제어

지금까지의 제어기는 현재의 오차에 반응했다. 모델 예측 제어(Model Predictive Control, MPC)는 차량 모델로 앞으로 몇 초 동안의 움직임을 직접 계산해 보고, 그 구간 전체에서 비용이 가장 낮은 입력의 열을 최적화로 찾는다. 가속도와 저크의 한계, 앞차와의 최소 간격 같은 제약을 식에 그대로 넣을 수 있다는 것이 가장 큰 장점이다.

지금 k 예측 구간 (N 스텝) k + N 목표 지나온 출력 예측한 출력 첫 입력만 사용 계획한 입력 열
그림 20-6. MPC의 이동 구간 원리. 매 주기마다 예측 구간 전체의 입력을 최적화하지만 실제로 쓰는 것은 첫 입력뿐이고, 다음 주기에 새 측정값으로 처음부터 다시 푼다.
$$\min_{u_0,\dots,u_{N-1}} \sum_{k=0}^{N-1} \Bigl[\, q\,(x_k - x_k^{\text{ref}})^2 + r\,u_k^2 + r_{\Delta}\,(u_k - u_{k-1})^2 \Bigr] \quad \text{s.t.}\;\; x_{k+1} = f(x_k, u_k),\;\; u_{\min} \le u_k \le u_{\max}$$
\(x_k\)는 예측한 상태, \(u_k\)는 입력, \(N\)은 예측 구간의 스텝 수, \(q, r, r_\Delta\)는 추종 오차·입력 크기·입력 변화에 대한 가중치.

여기서 중요한 점은 최적화로 얻은 입력 열 중 첫 번째 입력만 실제로 쓴다는 것이다. 다음 주기가 되면 새로 측정한 상태에서 출발해 예측 구간을 한 칸 밀고 다시 최적화한다. 이를 이동 구간(receding horizon) 방식이라 한다. 모델이 완벽하지 않고 앞차가 예상과 다르게 움직여도, 매번 다시 계획하므로 되먹임 효과가 생긴다. 아래 시뮬레이터는 앞차를 따라가는 종방향 문제를 MPC로 풀고, 같은 상황의 PID 제어와 나란히 비교한다.

SIMULATOR

MPC 맛보기: 앞차 추종

MPCMPC의 계획PID목표 간격
앞차 주행
간격 (MPC / PID)—
최소 간격 (MPC / PID)—
저크 RMS (MPC / PID)—
속도 (앞차 / MPC / PID)—
해볼 것: "지금" 선의 오른쪽 점선이 MPC가 방금 세운 계획이고, 왼쪽 실선이 실제로 지나온 기록이다. 계획은 매 순간 다시 그려진다. 예측 구간을 1초 이하로 줄이고 급제동을 누르면, 먼 미래의 간격 부족이 비용에 들어오지 않아 늦게 반응하고 간격이 위험 영역(빨간 띠)까지 줄어든다. 구간을 4초 이상으로 늘리면 같은 가중치로도 여유 있게 멈춘다. 편안함 가중치를 올리면 가속도 곡선이 완만해지는 대신 간격 오차가 커진다. MPC는 앞차가 지금 속도를 유지한다고 예측하므로(등속 모델) 급제동 직후의 계획은 낙관적이었다가 빠르게 고쳐진다. 잘 조정한 PID도 이 문제를 무난히 푼다. MPC의 강점은 게인을 다시 맞추지 않고 가중치와 제약만으로 성격을 바꿀 수 있다는 데 있다.

횡방향에도 같은 원리를 쓴다. 자전거 모델로 예측 구간 동안의 경로 이탈을 계산하고 조향각의 크기와 변화율 한계를 제약으로 넣는다. 종·횡을 한꺼번에 푸는 MPC는 마찰원 제약까지 다룰 수 있어 한계 주행이나 긴급 회피에 강하다. 대가는 계산량이다. 매 주기(대표적으로 10~50 ms) 안에 최적화가 끝나야 하므로, 모델을 선형화해 2차 계획 문제로 바꾸거나 전용 해법을 쓴다.

현실의 제약: 지연, 승차감, 안전 여유

지연과 액추에이터 한계

센서가 장면을 찍은 순간부터 바퀴가 실제로 꺾일 때까지는 시간이 걸린다. 인지 처리, 계획 계산, 차량 네트워크 전송, 그리고 조향 모터와 브레이크 유압이 움직이는 시간이 모두 더해지면 전체 지연은 대표적으로 약 0.1~0.3초에 이른다. 시속 100 km에서 0.2초는 5.6 m다. 제어기가 이 지연을 모른 채 게인만 높이면 앞의 퓨어 퍼슈트 시뮬레이터에서 본 것처럼 진동한다. 그래서 제어기는 "명령이 실제로 반영될 시점의 차 상태"를 모델로 미리 계산해 그 상태를 기준으로 제어하고, MPC는 지연과 액추에이터의 응답을 모델에 포함한다.

액추에이터에는 크기와 속도의 한계도 있다. 조향 모터가 낼 수 있는 조향 속도, 브레이크 압력이 올라가는 속도, 모터와 엔진이 낼 수 있는 토크는 유한하다(8장, 15장). 계획이 이 한계를 무시한 궤적을 내놓으면 제어기는 따라가지 못하고 오차가 쌓인다. 좋은 스택은 위층부터 한계를 알고 계획한다.

승차감

사람이 운전하는 차에서는 운전자가 자기 조작을 예상하므로 멀미를 덜 느낀다. 자율주행차의 탑승자는 모두 승객이다. 그래서 가속도와 저크의 한계를 사람이 운전할 때보다 보수적으로 잡는다. 일상 주행에서 종가속도는 대표적으로 약 ±2 m/s², 저크는 약 1~2 m/s³ 이내가 편안하다고 본다. 물론 긴급 상황에서는 편안함 제약을 풀고 타이어 한계까지 쓴다. 평상시와 비상시의 한계를 구분해 두는 것도 계획의 일이다.

안전 여유: RSS 맛보기

"안전하게 운전한다"를 수식으로 적을 수 있을까. 책임 민감 안전(Responsibility-Sensitive Safety, RSS)은 상식적인 운전 규칙을 수학적 조건으로 옮기려는 시도다. 가장 기본이 되는 것은 앞차와의 최소 안전 거리다. 앞차가 낼 수 있는 가장 강한 제동으로 멈추고, 나는 반응 시간 동안 오히려 가속하다가 그 뒤에 약한 제동으로 멈춘다는 최악의 경우에도 부딪히지 않는 거리다.

$$d_{\min} = v_r\,\rho + \tfrac{1}{2}\,a_{\max}\,\rho^2 + \frac{(v_r + \rho\,a_{\max})^2}{2\,b_{\min}} - \frac{v_f^2}{2\,b_{\max}}$$
\(v_r\)은 뒤차(나)의 속도, \(v_f\)는 앞차 속도, \(\rho\)는 반응 시간, \(a_{\max}\)는 반응 시간 동안의 최대 가속도, \(b_{\min}\)은 내가 보장하는 최소 제동 감속도, \(b_{\max}\)는 앞차의 최대 제동 감속도. 결과가 음수면 0으로 본다.
계산 예. 두 차 모두 90 km/h(25 m/s), \(\rho = 0.5\) s, \(a_{\max} = 2\), \(b_{\min} = 4\), \(b_{\max} = 8\ \mathrm{m/s^2}\)이면 \(d_{\min} = 12.5 + 0.25 + 26^2/8 - 25^2/16 \approx 12.5 + 0.25 + 84.5 - 39.1 = 58.2\) m다. 시간 간격으로는 약 2.3초에 해당한다. 가정한 감속도 값에 따라 결과가 크게 달라지므로, 이 매개변수를 어떻게 정하느냐가 곧 "얼마나 조심스러운 차인가"를 정한다.

이런 규칙 기반 안전 검사는 계획 알고리즘과 별도로 두고, 계획이 무엇을 내놓든 마지막에 걸러 내는 안전 감시층으로 쓰는 경우가 많다. 횡방향 간격, 우선권, 시야가 가려진 곳에서의 속도 같은 나머지 규칙과 시스템 차원의 안전 설계는 21장에서 이어서 다룬다.

학습 기반 계획

규칙과 비용 함수를 사람이 일일이 쓰는 방식은 드문 상황이 끝없이 나오는 실제 도로에서 한계가 있다. 그래서 사람의 주행 데이터를 흉내 내도록 신경망을 학습시키는 모방 학습, 시뮬레이터에서 시행착오로 정책을 익히는 강화 학습, 그리고 센서 입력에서 궤적까지를 하나의 신경망으로 잇는 엔드투엔드 방식이 빠르게 발전하고 있다. 학습 기반 계획기는 복잡한 상호작용에서 사람처럼 자연스럽게 움직이는 장점이 있지만, 왜 그런 결정을 했는지 설명하기 어렵고 학습 데이터에 없던 상황에서의 동작을 보장하기 어렵다. 현재의 실용적인 구성은 학습 모델이 후보 궤적을 제안하고, 이 장에서 본 운동 제약 검사·충돌 검사·규칙 기반 안전 감시가 그 제안을 검증하는 혼합 방식이다.

심화: 왜 층 사이의 주기가 다른가. 제어기는 차의 동역학(요 운동의 고유 진동수는 대표적으로 약 1~2 Hz)보다 충분히 빨라야 하므로 50~100 Hz로 돈다. 궤적 계획은 주변 물체의 움직임에 맞춰 10~20 Hz면 충분하다. 계획이 새 궤적을 내놓을 때마다 이전 궤적과 매끄럽게 이어지지 않으면 제어기가 목표의 순간 이동을 따라가려고 덜컥거린다. 그래서 새 궤적은 "지금 차의 실제 상태"가 아니라 "이전 궤적 위에서 조금 뒤의 점"에서 출발하도록 이어 붙인다.

핵심 정리

  1. 판단과 조작은 경로 탐색 → 행동 결정 → 궤적 계획 → 제어의 층으로 나뉘며, 아래로 갈수록 보는 범위는 짧고 갱신은 빠르다.
  2. 예측은 운동 모델(등속·등가속·등속 회전)로 짧은 미래를, 차로 기반 다중 가설과 확률로 긴 미래를 다룬다. 불확실성은 시간이 갈수록 커진다.
  3. A*는 \(f = g + h\)가 작은 노드부터 펼친다. 휴리스틱이 실제 비용을 넘지 않으면 최단 경로를 보장하면서 다익스트라보다 적게 탐색한다.
  4. 행동 결정은 상태 기계와 비용 비교로 이루어지며, 차로 변경은 옆 차로의 앞·뒤 간격이 모두 필요 간격 이상일 때만 시작한다.
  5. 프레네 좌표의 5차 다항식은 저크가 최소인 궤적을 준다. 최대 횡가속도는 \(5.77D/T^2\), 최대 저크는 \(60D/T^3\)이며, 여러 후보를 만들어 한계 검사·충돌 검사·비용으로 고른다.
  6. 차는 최소 회전 반경과 연속 곡률을 지켜야 하고, 코너 속도는 \(v = \sqrt{a_y/\kappa}\)로 제한된다. 후진·전진 패스로 가감속 한계를 반영한 속도 프로파일을 만든다.
  7. 퓨어 퍼슈트는 전방 주시 거리 하나로 조향을 정한다. 짧으면 진동하고 길면 코너를 깎는다. 스탠리는 앞 차축의 방향 오차와 횡 오차를 함께 쓴다.
  8. MPC는 예측 구간에서 제약을 지키며 입력을 최적화하고 첫 입력만 쓴 뒤 다시 푼다. 지연, 액추에이터 한계, 승차감, 안전 거리(RSS)가 모든 층의 설계를 제약한다.

확인 퀴즈

A*에서 휴리스틱 가중치를 0으로 두면 어떤 알고리즘과 같아지는가?

\(f = g + w\,h\)에서 \(w=0\)이면 지금까지 온 비용 g만으로 순서를 정하므로 다익스트라와 같다. 최단 경로는 보장되지만 목표와 무관한 방향까지 고르게 탐색한다.

차로 폭 3.5 m의 차로 변경을 5차 다항식으로 계획한다. 변경 시간을 6초에서 3초로 줄이면 최대 횡저크는 몇 배가 되는가?

최대 저크는 \(60D/T^3\)으로 시간의 세제곱에 반비례한다. 시간이 절반이면 \(2^3 = 8\)배다. 6초일 때 약 0.97 m/s³, 3초일 때 약 7.8 m/s³이다. 최대 횡가속도는 \(T^2\)에 반비례하므로 4배가 된다.

반경 50 m 커브를 횡가속도 2 m/s² 이내로 돌 때 제한 속도에 가장 가까운 것은?

\(v = \sqrt{a_y R} = \sqrt{2\times50} = 10\) m/s, 즉 36 km/h다. 반경 100 m일 때의 51 km/h에서 반경이 절반이 되면 속도는 \(1/\sqrt{2}\)배가 된다.

퓨어 퍼슈트 제어기로 달리는 차가 직선 구간에서 좌우로 계속 흔들린다. 가장 먼저 해 볼 조치는?

주시 거리가 짧으면 작은 횡 오차에도 큰 조향각이 나와, 조향 지연과 만나 진동한다. 주시 거리를 늘리면 같은 오차에 대한 조향이 작아져 안정된다. 대신 너무 길면 코너를 안쪽으로 깎으므로 보통 속도에 비례해 정한다.

MPC가 예측 구간 전체의 입력 열을 구하고도 첫 입력만 쓰고 다음 주기에 다시 푸는 이유로 가장 알맞은 것은?

모델은 완벽하지 않고 앞차 같은 외부 조건도 예측과 다르게 변한다. 매 주기 새로 측정한 상태에서 다시 최적화하면 계획 전체가 되먹임으로 고쳐진다. 계산량은 오히려 늘어난다.

교차로에서 감속 중인 차의 5초 뒤 위치를 등가속 모델로 예측했더니 차가 뒤로 가는 결과가 나왔다. 이 문제의 근본 원인은?

운동 모델은 "지금 하던 대로 계속한다"는 가정이다. 감속은 정지나 회전을 위한 일시적인 행동인데 이를 무한히 연장하면 물리적으로 말이 안 되는 결과가 된다. 긴 예측에는 차로 형상과 기동 가설이 필요하다.