AWS_DeepRacerの実装_パート2

### 【はじめに】
前回DeepRacerのデフォルト設定値を用いてモデルを作成しました。
今回は前回作成したモデルを用いてコースを走らせ、タイムを測定します。
その後、報酬関数を編集し、タイムを縮めていきます。

※前回記事は下記
https://qiita.com/S-Kagamiya/items/b024eb50547d92236186

### 【測定方法】
今回使用するコースは以下の設定コースを用います。

①DeepRacerのAWSコンソール画面から測定するモデルの画面に移動します。

②モデルの画面の右下「Start new evaluation」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528832/c7e696f7-dd9a-9770-c118-3723940c45f2.png)

③評価方法とコースを選択します。
Race type：「Time trial」
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528832/ac4c108c-3436-493e-835c-3c82aa9c3283.png)

Choose number of trials to evaluate your model：「3 trials」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528832/e1ca8c22-360f-08d2-91c8-56055c4acb24.png)

走行コース：Smile Speedway（反時計周り）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528832/16bf4c1a-123a-bb5a-1a41-1393e7774f30.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528832/1826126b-abd3-8b6d-444b-712c74ca9955.png)

④測定開始
設定後、「Start evaluation」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528832/b21f0792-56bd-53de-d6aa-688e6a1f9ee5.png)

### 【前回モデル測定結果】
モデルのコンソール画面に測定結果が表示されます。
3回コースを走行させたので下記画像の通り、3回の測定結果が表示されます。
今回の測定結果、Lap Time「00:22.598s」を基準にタイムを縮めていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528832/3a78e2bd-6f62-c849-37a3-214afedc5acc.png)


### 【今パート使用のモデル】
今回は報酬関数を編集し先ほど測定したコースと同様のものを用いてタイムを測定していきます。
評価関数以外の設定値に関しては下記画像の設定値を参考にしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528832/36550583-bba7-4d47-b074-99c128b79822.png)

報酬関数に関してですが、進行方向と速度の両方を考慮するようにしました。
カーブと直進で速度の調整を行うようにしています。
・初期報酬として1.0を設定しています。

・方向の差が10度を超える場合（カーブなど）、理想的な速度を1.0と仮定し、速度差の二乗を報酬から減算しています。

・方向の差が10度以下の場合（直線部分での走行）、理想的な速度を3.0と仮定し、同様に速度差の二乗を報酬から減算しています。

実際に使用した評価関数は以下の通りです。
```:
import math

def reward_function(params):
    heading = params['heading']
    waypoints = params['waypoints']
    closest_waypoints = params['closest_waypoints']
    speed = params['speed']
    next_point = waypoints[closest_waypoints[1]]
    prev_point = waypoints[closest_waypoints[0]]

    # 進行方向の計算
    track_direction = math.atan2(next_point[1] - prev_point[1], next_point[0] - prev_point[0])
    track_direction = math.degrees(track_direction)

    # 方向の差を計算
    direction_diff = abs(track_direction - heading)
    if direction_diff > 180:
        direction_diff = 360 - direction_diff

    # 方向と速度に基づいた報酬
    reward = 1.0
    if direction_diff > 10:
        # カーブでは速度を落とす
        ideal_speed = 1.0
        reward *= max(0, 1 - (speed - ideal_speed)**2)
    else:
        # 直線では速度を上げる
        ideal_speed = 3.0
        reward *= max(0, 1 - (speed - ideal_speed)**2)

    return reward

```

### 【今回作成したモデルの測定結果】
今回作成したモデルでの測定結果は以下の通りとなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528832/6949a9c7-a336-94cb-ecdb-367055a4ee25.png)

前回Lap Time：00:22.598s
今回Lap Time：00:19.263s

今回のモデルでは3秒ほどタイムが縮まりました。

### 【まとめ】
前回の報酬関数においてはコースの中央線に近づくほど高い報酬を得るようなシンプルな評価関数を用いましたが、今回は実際に現実において運転する際の動作を考え、カーブで減速し、直進で速度を出すといったような評価関数を用いタイムを縮めることに成功しました。
まだカーブの際の適正速度の変更、直進での適正速度を変更し、検証する部分はあると思っているので、次回からはこの評価関数を改良し、さらにタイムを縮め、15秒を切ることを目標に作業を行っていきます。

## 
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area