ML-Agentsでカートポールを実装１

#概要
ML-Agentsでカートポールを実装し、学習させます。自分でML-Aegentsを使って学習させるモデルを作成したい人の助けになればいいと思っています。
#はじめに
ML-Agentsのサンプルのようなモデルを自作します。学習方法は前回の記事で説明したので、今回は学習させるモデルの作り方を中心に記事にしました。公式の[ドキュメント](https://github.com/Unity-Technologies/ml-agents/blob/release_6_docs/docs/Learning-Environment-Create-New.md)を参考にしました。細かいところはこちらを確認してください。

#全体の流れ
モデルの作成、学習には主に４つ工程があります。

- unityで3Dモデルを作成
- 学習させるエージェントのスクリプトを記述する
- Behavior Parameterを設定する
- 学習させる

実際に作成しながら説明していきます。
記事が長くなるので今回は３Dモデルの作成まで説明します。

#unityで3Dモデルを作成
はじめにunityで学習させたい3Dモデルを作成します。今回はカートポールを実装します。カートポールとはカートについているポールが倒れないように制御する問題のことです。
最終的には以下のモデルを作成します。学習を効率化するために複数のモデルを置いてます。
![スクリーンショット 2020-09-07 15.39.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427834/a608da9f-33f7-87d1-511d-565eb0ba33c9.png)

##カートポール作成
まずはじめに以下のモデルの作成について説明します。
![スクリーンショット 2020-09-07 15.43.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427834/49add717-6309-1462-2269-0a7e8e0862da.png)

左下のProjectで以下の画像のようにCartPoleというフォルダを作成してください。また、File/New Sceneから新しいシーンを作成しCart Poleと名付けて作成したフォルダに保存してください。
![スクリーンショット 2020-09-07 15.45.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427834/0f5d38f5-92b7-9a9c-7146-68c21afaca65.png)
Materialにはカートやポール、床の材料特性を設定するものが入ります。Scriptには作成したオブジェクトを動かすスクリプトが入ります。最後のTFModelsは学習済みモデルを入れるフォルダになります。

次にsceneを開いて以下のように３D Objectを追加してください。
![スクリーンショット 2020-09-07 15.53.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427834/05f74a7b-bd03-7ff9-8daa-bd78360f43aa.png)
追加する3D Objectは cube, sylinder, plane　をそれぞれ一つづつ追加してください。また追加したら cubeをCartに、sylinderをPoleに名前を変更してください。また、CartとPoleはTrainingAreaという空のObjectを作成し、そこに入れてください。
それぞれのスケールなどは以下の画像を参考にしてください。
![スクリーンショット 2020-09-07 15.55.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427834/adbf160b-d6f0-8ce3-0b12-e0d9c1774e47.png)
![スクリーンショット 2020-09-07 15.56.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427834/02e25f87-5478-e264-8113-d8cf82f11e2b.png)
![スクリーンショット 2020-09-07 15.55.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427834/95b433c3-cd9b-e12d-7da6-975e603b33a2.png)

次にcomponentを追加していきます。

##Componentの追加
unity では作成したオブジェクトにcomponentを追加することで様々な特性を持たせることができます。今回は rigidbody と Hinge Joint を追加します。 rigidbody を追加することによって、オブジェクトを物理特性によって制御することができるようになります。具体的には重力を付加したり、力を加えたり、空気抵抗などを設定することができます。Hinge Joint を追加するとCart と Pole がヒンジで結合されます。

componentの追加方法は、追加したいオブジェクトを選択し、画面の右下にある Add Component をクリックし追加したい物を選択します。

###rigidbodyの追加
「rigidbody」を選択します。

![スクリーンショット 2020-09-11 14.43.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427834/c6b7933c-fceb-f69a-b8d8-3686e21673af.png)

CartとPoleにそれぞれ追加してください。追加されると以下の画像のようになると思います。

![スクリーンショット 2020-09-11 16.58.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427834/5f1629f8-3db3-b1f4-14b5-965277194e51.png)

![スクリーンショット 2020-09-11 14.48.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427834/19a46a73-4ead-fc8f-8e91-0efb282e63f2.png)

パラメータをそれぞれ画像のように設定してください。（適当でもいいです）

Mass はオブジェクトの質量[Kg]です。

Drag は空気抵抗を表しています。値が大きくなるほど抵抗が大きくなります。0の場合は真空状態となります。

Angular Drag はオブジェクトが回転する時の空気抵抗です。値が大きいほど回転しにくくなります。

Constraints / Freeze Position はオブジェクトの動きを制限させます。今回Cartは横方向（Z方向)に動いて欲しいので、手前方向（X方向）にチェックを入れます。

Freeze Rotation はオブジェクトの回転を制限します。今回はCartは回転しないので全てにチェックを入れてください。

###Hinge Joint の追加
Add Component / Physics / Hinge Joint から追加してください。
![スクリーンショット 2020-09-11 15.31.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427834/5ee97f07-be6c-b686-b6aa-e4e017c71ca7.png)
![スクリーンショット 2020-09-11 15.31.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427834/bd274146-946c-0467-3dcf-d38b316c4fc8.png)
パラメータを画像のように設定してください。また Connected Body に Cart を追加してください。


##Materialの設定
次にオブジェクトのMaterialの設定をします。Cart と Pole は色を設定するだけなので各自設定してください。今回はPlaneで摩擦を設定します。Materialフォルダの中にPhysic Material を追加して、Planeという名前に変更してください。真ん中の黄緑色のやつができると思います。

![スクリーンショット 2020-09-11 15.19.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427834/7eae74b4-1568-f33b-e23e-178ce168dd15.png)
![スクリーンショット 2020-09-11 15.21.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427834/4b0b0adf-1900-e848-6a3b-5ed6c07e4a34.png)

Dynamic Friction で動摩擦を設定します。値は 0~inf で大きいほどオブジェクトが動かなくなります。
Static Friction は静止摩擦を設定します。
今回摩擦のパラメータは適当でいいです（大きすぎるとCartが動かなくなります）。

作成した Physic Material を Plane オブジェクトに追加してください。Planeオブジェクトを選択し、そこにドラッグアンドドロップすればいいです。画像の印のようになっていればOKです。
![スクリーンショット 2020-09-11 15.40.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427834/fc190db3-62ca-4c09-9e12-7dbaaf7b5fbb.png)


これで３Dオブジェクトは完成になります。

#まとめ
今回はunityで3DオブジェクトのCart Pole を作成しました。これで学習させるモデルはほぼ完成しました。[次回](https://qiita.com/Kana-km/items/a731b9433a0026890ff5)はスクリプトを書いていきます。