이 보고서는 미래모빌리티의 제작 과정과 결과에 대한 내용을 다룬다.
이번 프로젝트를 통해 적은 비용을 통하여 AWS 차량을 학습시키고 최적경로를 미리 계산하고 그에 맞는 속도 프로파일을 통하여 빠른 시간안에 차량이 완주 할 수 있도록 하는 것이 목표이다.
시뮬레이션 환경을 구축
GPU를 이용하여, AWS 클라우드 상이 아닌 개인 PC를 이용한 시뮬레이션 환경 설치하고, 시뮬레이션하여 학습에 있어서 비용을 절감시킬 수 있었다.
현재 AWS클라우드에서 비용은 1시간에 3.5 USD로 10시간 이면 50000원 정도의 요금이 부과 된다.
반면, 개인 PC환경에서 학습시킨 경우 학습시간은 GPU의 메모리 용량에 영향을 받으며, 단지 모델을 업로드 할때, AWS s3에 업로드 하는 비용인 0.23 USD 정도 비용이 발생하기 때문에 비용 절감의 효과가 있다.
또한 Deepracer에 올리는 모델 파일은 직접 PC에서 만들어 탑재 시킬수도 있다.

경로 최적화 & 속도 프로파일 생성
위치좌표를 가지고 곡률을 계산하는 방법
$\vec{x}{1} \sim \vec{x}{n}$까지의 주행경로의 위치벡터들이 있을 때, 이전($\vec{x}{i-1}$), 현재($\vec{x}{i}$), 다음($\vec{x}_{i+1}$)의 세개의 벡터를 가지고 선회반경을 계산하고, 곡률을 구한다.(선회 반경의 역수)
곡률을 구하는 공식은 아래와 같이 나타 낼 수 있다.
$$ \kappa = \frac{2 \cdot \det(\vec{x}{i+1} - \vec{x}{i},\vec{x}{i-1} - \vec{x}{i})}{||\vec{x}{i+1} - \vec{x}{i}||\cdot||\vec{x}{i-1} - \vec{x}{i}||\cdot||\vec{x}{i+1} - \vec{x}{i-1}||} $$
The K1999 Path-Optimization Algorithm:
K1999 알고리즘은 반복적 최적화기법을 사용하여, 특정 현재위치($\vec{x}{i}$)에서 이전의 곡률($\kappa{i-1}$ )과 다음의 곡률($\kappa_{i+1}$)을 계산하여 현재의 곡률을 계산하는 알고리즘이다.
따라서, 트랙의 주행경로를 사전에 알고 있어야 하며, 현재 위치에서의 곡률은 이전곡률과 다음 곡률의 평균 값으로 계산한다. 그 이유는 현재의 위치를 이전, 다음 위치와 동일한 등간격으로 배치하여 부드러운 곡률값으로 보간을 하고, 계산된 곡률을 고려하여 최적화된 위치를 조정하여 최적경로를 생성한다.
또한, 반복을 많이 할수록 더 최적화된 경로를 얻게 된다.
최적화된 경로를 이용할때의 장점은 이미 최적화된 행동공간으로 학습을 진행하고, 그에 따른 최적화된 정책을 만들며, 실제 주행시에도 효율적인 액션을 결정하게 만드는 것이 장점이다.
반면 단점은 만약에 주행 경로를 사전에 알 수 없다면, K1999알고리즘을 사용이 불가능하게 된다.
트랙의 watpoint를 이용해서 최적 경로를 찾아보면 아래그림 같이 나오게 된다.

또한, 각 지점에서 속도 프로파일을 계산하면 아래와 같은 속도를 갖게 된다.

최적화 결과
행동공간 분포

조향과 속도의 분포 인덱스를 나타낸 그래프를 보면 $30^{\circ}$ ~ $-10^{\circ}$ 사이의 왼쪽 조향의 많이 나타났다. 그 이유는 현재 트랙의 구조는 왼쪽 조향이 많은 구조이기 때문에 학습을 하는 동안 에이전트가 왼쪽 조향을 하게 되면 보상을 많이 받게 되고 그 결과로 왼쪽 조향을 하는 정책을 갖게 되어 왼쪽으로 조향을 많이 하게 된다.
에이전트의 보상함수
################ REWARD AND PUNISHMENT ################
"""
@params DISTANCE_MULTIPLE : 최적화된 경로의 가중치
@params SPEED_MULTIPLE : 속도 프로파일의 가중치
"""
## Define the default reward ##
reward = 1.0
## Reward if car goes close to optimal racing line ##
DISTANCE_MULTIPLE = 3
dist = dist_to_racing_line(optimals[0:2], optimals_second[0:2], [x, y])
distance_reward = max(1e-3, 1 - (dist/(track_width*0.5)))
reward += distance_reward * DISTANCE_MULTIPLE
## Reward if speed is close to optimal speed ##
SPEED_DIFF_NO_REWARD = 1
SPEED_MULTIPLE = 2
speed_diff = abs(optimals[2]-speed)
if speed_diff <= SPEED_DIFF_NO_REWARD:
# we use quadratic punishment (not linear) bc we're not as confident with the optimal speed
# so, we do not punish small deviations from optimal speed
speed_reward = (1 - (speed_diff/(SPEED_DIFF_NO_REWARD))**2)**2
else:
speed_reward = 0
reward += speed_reward * SPEED_MULTIPLE
경로에 대한 가중치를 3, 속도에 대한 가중치를 2를 주고 학습을 시켜 보았다. 이를 통해 경로와 속도에 대한 가중치가 높을수록 해당 에이전트가 더 최적경로를 따라가게 하면서, 속도 프로파일을 따르며 주행을 하기때문이다. 단 속도 프로파일보다 최적 경로에 좀더 중점을 두고 싶어 경로에 대한 가중치를 더 크게 주었다.
하지만, 왼쪽으로 선회가 많은 트랙의 구조때문에 왼쪽선회를 하며 빠르게 주행하면 보상을 많이 받게 되어 에이전트가 과도하게 왼쪽으로 조향하며 가속하는 모습을 보였다.
Evaluation 경로와 최적경로 비교
각 좌표의 x,y점의 유클리디안 거리를 계산하고 각 경로의 길이를 비교하여 일치도를 판정하였다.


eval_lap1의 경로와 최적경로를 트랙에 같이 표시한 그림
Evaluation경로와 최적경로 사이에 오차가 생기는 이유는 최적경로는 차량의 크기, 하드웨적 특징을 고려 하지 않으면서 경로를 최적화 시켜 곡률이 큰 부분에서 off-track이 발생하기때문에 학습과정에서 에이전트가 off-track을 발생 시키지 않게 하기 위한 행동을 하면서 최적경로와 실제경로 사이에 오차가 발생하게 된다.
이런 점을 해결하기 위해서 보상함수의 경로에 대한 가중치를 줄이고, 최적경로를 생성할때, 반복수를 줄여서 offtrack이 발생 하지 않을 정도의 최적경로를 생성한다.
기본모델과 비교
최적경로를 만들어 학습을 시킨 모델과 기본 보상함수를 사용한 모델을 시뮬레이션 상에서 비교를 해보았다.
최적경로 모델:

| Trial | Time (MM:SS.mmm) | Trial results (% track completed) | Status | Off-track | Off-track penalty |
|---|---|---|---|---|---|
| 1 | 00:12.139 | 100% | Lap complete | 2 | 4 seconds |
| 2 | 00:13.269 | 100% | Lap complete | 2 | 4 seconds |
| 3 | 00:10.471 | 100% | Lap complete | 1 | 2 seconds |
기본 모델:

| Trial | Time (MM:SS.mmm) | Trial results (% track completed) | Status | Off-track | Off-track penalty |
|---|---|---|---|---|---|
| 1 | 00:20.736 | 100% | Lap complete | 3 | 6 seconds |
| 2 | 00:12.077 | 100% | Lap complete | 0 | -- |
| 3 | 00:11.403 | 100% | Lap complete | 0 | -- |
두 표를 비교했을 때, 최적경로 모델의 완주시간이 기본모델보다 빠른것을 볼 수 있다.
최적경로는 3바퀴를 완주 했을 때 걸린 총 시간이 35.88초가 걸린 반면, 44.22초가 걸렸다.
따라서 Off-track을 고려하여 평균시간으로 계산해보면, 최적경로 모델은 1바퀴를 완주하는데 약 12초가 걸리지만, 기본 모델은 약 22초가 걸리는 것으로 볼 수있다.
결론 및 고찰
최적경로 모델은 완주 시간면에서는 최적의 경로를 따르며 액션을 취하기 때문에 빠른 시간안에 완주가 가능한덕을 아게 되었다.
하지만 최적화의 정도와 학습 가중치, 트랙의 구조에 따라서 학습시 영항을 받아 원래의 최적 경로를 완벽히 따르지 못하게 되는 문제가 발생하였다.
이번 프로젝트에서의 문제점은 아래와 같이 2가지 문제를 발견했다.
따라서, 최적화 시 반복회수를 줄여서 곡률의 크기에 대한 최적좌표의 이동에 여유를 주어서 에이전트가 Off-track이 발생하여 실제 최적경로와 다르게 주행하는 것을 막고, 경로 가중치를 더 높여 조금이라도 경로에서 벗어나면 보상을 받지 못하게 하여 왼쪽 조향을 과도하게 하는 행동에 대한 보상을 줄인다면 에이전트가 최적경로를 잘 추종하면서 Off-track 발생 횟수가 줄어들게 될 것이다.
실제 주행