Skip to content

Instantly share code, notes, and snippets.

@masato-ka
Last active June 21, 2020 04:43
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save masato-ka/1ce4ae946c7d05f00c91c32f582eda83 to your computer and use it in GitHub Desktop.
Save masato-ka/1ce4ae946c7d05f00c91c32f582eda83 to your computer and use it in GitHub Desktop.
DonkeySIM-hands-on.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "DonkeySIM-hands-on.ipynb",
"provenance": [],
"collapsed_sections": [],
"mount_file_id": "1Pa9V2aYvUcU_iCdg4rJX3TmDxZQ-ShL1",
"authorship_tag": "ABX9TyP+X3ZXLGzCBZRat+yFOzPv",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"accelerator": "GPU"
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/masato-ka/1ce4ae946c7d05f00c91c32f582eda83/donkeysim-hands-on.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "FPj4NfMM58ko",
"colab_type": "text"
},
"source": [
"# DonkeyCar バーチャルレースハンズオン資料\n",
"\n",
"## **イントロダクション**\n",
"\n",
"このハンズオンではAI RC Carの代表例であるDonkeyCarとそのシミュレータを使用して、ディープラーニングを利用した自動走行を<font color=\"Red\">**バーチャルで体験**</font>します。実機のDonkeyCarとほぼ同じステップを踏むため、実機への足がかりとなります。\n",
"\n",
"> **<font color=\"Red\">注意</font>**\n",
">\n",
"><font color=\"Blue\">ハンズオンを進めるにはPythonの環境構築が必要です。Wndowsの場合はWindowsファイアウォールの設定を変更する場合があります。またPCでUnityで作られた3Dシミュレータを動作させる必要がありあます。</font>\n",
"\n",
"### **このハンズオンで学べること**\n",
"\n",
"DonkeyCarソフトウェアの基本的な仕組みと使い方を学習します。\n",
"\n",
"* AI RC Carの自動走行の概要と仕組み\n",
"* DonkeyCarソフトウェアの使い方\n",
" * 走行データの収集、学習、自動走行\n",
"\n",
"### **AI RC Carの自動走行の基本的な流れ**\n",
"\n",
"一般的なAI RC Carの自動走行の実現方法は3つのSTEPで実現されます。まずはじめにAIに学習させるためのデータを集めます。このデータは教師データと呼ばれ、人が操作する教示走行によって集めます。この教師データには人の運転操作がお手本として記録されています。次のステップでは教師データを使ってAIを学習させます。ディープラーニングによってあるコースの画像からその時の人のお手本に近い値が出力されるように学習していきます。最後のステップでは学習したAIを使い自動走行を行います。カメラで撮影されたコースの画像からAIがその時に最適なアクセルとスロットルを使い走行します。AIが人間の操作を覚えて、それを思い出しながら走るイメージです。\n",
"\n",
"> *図1. AI RC CARの自動走行の基本的な流れ\n",
">\n",
">![AIRCCAR仕組み](https://user-images.githubusercontent.com/1833346/83032521-e8c18780-a070-11ea-8d27-dc327a2131e0.png)\n",
"\n",
"\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "U1irmIq4bhMS",
"colab_type": "text"
},
"source": [
"## **0. ハンズオンの事前準備**\n",
"\n",
"ハンズオン環境について説明します。ハンズオンはテキスト兼実行環境のJupyter notebookを利用します。このJupyter notebookは2つの環境に接続して利用します。一つはローカルのPC(以下ローカル環境)です。もう一つはGoogle ColaboratoryのGPUインスタンス(以下、colab環境)となります。ローカル環境は「教師データの収集」と「自動走行」に利用します。colab環境は「AIの学習」にのみ利用します。\n",
"\n",
"> * 図1. ハンズオン環境の構成\n",
">![env](https://user-images.githubusercontent.com/1833346/83320489-13832a00-a283-11ea-95f2-626785dc3b73.png)\n",
"\n",
"\n",
"演習を始める前に、ローカル環境が以下を満たすか確認してください。\n",
">\n",
">- [ ] Python3.7がインストールされていること。\n",
">- [ ] pipがコマンドラインから実行できること。\n",
">- [ ] Gitがインストールされコマンドラインから実行できること。\n",
"\n",
"pythonのインストール方法は[こちら](https://docs.python.org/ja/3.7/using/index.html)\n",
"\n",
"gitのインストール方法は[こちら](https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)\n",
"\n",
"過去にAnacondaをインストールしたことがある人(ターミナルを立ち上げた際にbaseが表示される人)は以下のコマンドで環境を無効化する。\n",
"\n",
"```\n",
"(base)$conda deactivate \n",
"```\n",
"See in http://home.hatanaka.info/article/460548794.html\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"### **準備1 colab環境の設定**\n",
"\n",
"colab環境でGPUを利用できるように設定します。この設定によりcolab環境でAI学習を行う場合はクラウド上のGPUサーバが利用できます。\n",
"\n",
"**手順1. ノートブックの設定ダイアログを表示する**\n",
"\n",
"colab上のメニューから「ランタイム」->「ランタイムタイプを変更」を選択して、「ノートブックの設定」ダイアログを表示します。\n",
"<br>\n",
"> * 図2. ランタイムのタイプを変更を選択\n",
">\n",
"><img width=\"351\" alt=\"インスタンスtype\" src=\"https://user-images.githubusercontent.com/1833346/82916786-7471e000-9fad-11ea-917c-5fd0ec4b5b39.png\">\n",
"<br>\n",
"\n",
"**手順2. GPUインスタンスの選択**\n",
"\n",
"「ノートブックの設定」ダイアログの「ハードウェアアクセラレータ」プルダウンメニューから「GPU」を選択して、「保存」を押下してください。\n",
"<br>\n",
"> * 図3. ノートブックの設定ダイアログ\n",
">\n",
"><img width=\"445\" alt=\"gpuインスタンス\" src=\"https://user-images.githubusercontent.com/1833346/82916809-7b005780-9fad-11ea-9cde-e886b086cea3.png\">\n",
"<br>\n",
"以上でColab側の設定は完了となります。\n",
"\n",
"\n",
"### **準備2 ローカルPCの設定**\n",
"\n",
"ローカル環境の設定を行います。ローカル環境の設定ではPythonの仮想環境を作成し、Jupyter Notebookをインストールします。Pythonの仮想環境はこの演習によるPCへの変更を最小限にするために利用します。\n",
"\n",
"**手順1. 仮想環境の作成**\n",
"\n",
"まずは演習用のフォルダを作り、pythonの仮想環境を作成します。以下のコマンドを実行してください。macOSの場合はターミナルから、Windowsの場合はコマンドプロンプトから作業しましょう。\n",
"\n",
"各コマンド先頭の$はシェルやコマンドプロンプトの入力待ち状態を表します。$以降のコマンドを入力してください。\n",
"\n",
"* macOS\n",
"\n",
"```\n",
"$mkdir ~/workspace && cd workspace\n",
"#仮想環境を作成するためのツールvirtualenvのインストール\n",
"$pip install virtualenv\n",
"#仮想環境vdonkeyの作成 ~/workspace/vdonkeyが作成される。\n",
"$virtualenv vdonkey\n",
"```\n",
"\n",
"* Windows\n",
"\n",
"```\n",
"# %HOMEPATH%はC:¥Users¥ユーザ名\n",
"$mkdir %HOMEPATH%¥workspace && cd %HOMEPATH%¥workspace\n",
"#仮想環境を作成するためのツールvirtualenvのインストール\n",
"$pip install virtualenv\n",
"#仮想環境vdonkeyの作成 ~/workspace/vdonkeyが作成される。\n",
"$virtualenv vdonkey\n",
"```\n",
"\n",
"このコマンドではホームディレクトリ配下にworkspaceというフォルダを作成します。さらに、2行目のコマンドでvdonkeyというPythonの仮想環境を作成しています。\n",
"\n",
"**手順2. 仮想環境のアクティベーション<font Color=\"Red\">★</font>**\n",
"\n",
"作成したPythonの仮想環境で作業ができるように設定を行います。以下のコマンドを実行すると、仮想環境が利用できます。\n",
"\n",
"* macOSの場合\n",
"```\n",
"$cd ~/workspace\n",
"$source vdonkey/bin/activate\n",
"実行後ターミナルの表記が以下のようになることを確認する。\n",
"(vdonkey)$\n",
"```\n",
"\n",
"* Windowsの場合\n",
"```\n",
"$cd %HOMEPATH%¥workspace\n",
"$vdonkey¥Scripts¥activate.bat\n",
"実行後ターミナルの表記が以下のようになることを確認する。\n",
"(vdonkey)$\n",
"```\n",
"\n",
"この作業は新しくターミナルを起動する毎に実施する必要があります。仮想環境から抜けたい場合はターミナルを閉じることで終了します。\n",
"\n",
"\n",
"**手順3. Jupyter Notebookのインストール**\n",
"\n",
"続いて、[Jupyter Notebook](https://jupyter.org/)をインストールします。仮想環境を利用可能にしたターミナル上で以下のコマンドを実行してください。実行前に必ず、先頭が(vdonkey)になっていることを確認してください。\n",
"\n",
"```\n",
"#(vdonkey)が先頭についていることを確認する\n",
"(vdonkey)$pip install jupyter jupyter_http_over_ws\n",
"(vdonkey)$jupyter serverextension enable --py jupyter_http_over_ws\n",
"```\n",
"\n",
"**手順4. Jupyter Notebookの起動<font Color=\"Red\">★</font>**\n",
"\n",
"次のコマンドを実行してJupyter Notebookを起動します。\n",
"\n",
"```\n",
"#(vdonkey)が先頭についていることを確認する\n",
"#カレントディレクトリがworkspaceディレクトリになっていることを確認する。\n",
"(vdonkey)$jupyter notebook --NotebookApp.allow_origin='https://colab.research.google.com' --port=8888 --NotebookApp.port_retries=0\n",
"```\n",
"\n",
"実行が完了すると以下のようにアクセス先のURLが表示されます。\n",
"\n",
"* ローカルURL\n",
"```\n",
"例:http://localhost:8888/?token=aef9ad2f5008c5db6a0c896886210cf7807b1b5dbf748de6\n",
"```\n",
"\n",
"この「ローカルURL」はColaboratoryのランタイム切り替えに必要になります。ターミナルはハンズオンが終わるまで終了させないでください。\n",
"\n",
"以上で、ローカル環境の設定は完了です。\n",
"\n",
"\n",
"### **準備3 colab環境とローカル環境の切り替え**\n",
"\n",
"colab環境とローカル環境の切り替え方法を確認します。まずはローカル環境へ接続します。画面右上の「編集」左側にある下矢印をクリックし、「ランタイム選択」のプルダウンリストを表示します。「ローカルランタイムに接続」を選択して「ローカル接続の設定」ダイアログを表示します。\n",
"\n",
"<br>\n",
"> * 図4. ランタイム選択のプルダウンリスト\n",
">\n",
"><img width=\"419\" alt=\"local-runtime-choose\" src=\"https://user-images.githubusercontent.com/1833346/82817503-11fae000-9ed8-11ea-87cc-c7f5252544d2.png\">\n",
"<br>\n",
"\n",
"「バックエンドURL」に準備2-手順4で表示された「ローカルURL」を貼り付け、「接続」を押下します。画面右上に「接続済み(ローカル)」と表示されれば成功です。\n",
"<br>\n",
"> * 図5. ローカル接続の設定ダイアログ\n",
">\n",
"><img width=\"625\" alt=\"local-runtime-dialog\" src=\"https://user-images.githubusercontent.com/1833346/82817791-8f265500-9ed8-11ea-8751-7035be9d4a12.png\">\n",
"<br>\n",
"> * 図6. 接続済み(ローカル)\n",
">\n",
"><img width=\"350\" alt=\"local-connected\" src=\"https://user-images.githubusercontent.com/1833346/82817814-9e0d0780-9ed8-11ea-87ae-6bea884c381b.png\">\n",
"<br>\n",
"\n",
"colabに接続する場合はランタイム選択のプルダウンリストを選択してください。「ホスト型ランタイムに接続」を選択してください。\n",
"\n",
"1. ローカル環境に接続する場合 - ローカルランタイムに接続を選択\n",
"2. colab環境に接続する場合 - ホスト型ランタイムに接続を選択\n",
"\n",
"> <font Color=\"Red\">**注意**</font>\n",
">\n",
"><font Color=\"Blue\">どちらのランタイムに接続しているか、確認をしてから演習の作業を進めてください。「STEP5.学習」の手順.3, 手順.4, 手順.5のみcolab環境に接続します。それ以外は全てローカル環境で作業を行います。</font>\n",
"\n",
"\n",
"以上で事前準備は完了です。\n",
"\n",
"\n",
"一度終了して再度実行する場合は<font Color=\"Red\">★</font>の手順を実行してください。\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "eAFSri0-lKwv",
"colab_type": "text"
},
"source": [
"## **1. DonkeyCarソフトウェアのインストール**\n",
"\n",
"ローカル環境へDonkeyCarのソフトウェアをインストールします。このハンズオンでは次のセルを実行することでローカル環境へインストールできます。ローカル環境に接続していることを確認して、次のセルを実行してください。\n",
"\n",
"セルの実行方法はマウスでセルを選択後、表示される**「三角ボタン」を押下**するか、**キーボードから「Shift+Enter」**で実行できます。実行が完了するとセルの横に[数字]が表示されます。\n",
"\n",
"各コマンドの先頭についている```!```や```%```はノートブックからコマンドを実行するためのおまじないです。ノートブックを使わずにシェルやコマンドプロンプトのみで操作する場合は無視してください。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "H5UqOcbs9p7A",
"colab_type": "code",
"colab": {}
},
"source": [
"#DonkeyCarソフトウェアのインストールセル\n",
"\n",
"# Tensorflowインストール\n",
"!pip install tensorflow==1.15.0\n",
"\n",
"# DonkeyCarソフトウェア本体をインストール\n",
"!git clone https://github.com/autorope/donkeycar\n",
"%cd donkeycar\n",
"!git checkout master\n",
"!pip install -e .[pc]\n",
"!pip install -e gym-donkeycar\n",
"%cd ../\n",
"\n",
"#シミュレータ用クライアントライブラリをインストール\n",
"!pip install gym\n",
"!git clone https://github.com/tawnkramer/gym-donkeycar\n",
"!pip install -e gym-donkeycar\n",
"\n"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "3EMnPX_1aQTG",
"colab_type": "text"
},
"source": [
"DonkeyCarソフトウェアはWindowsやmacOS,UbuntuそしてRaspberryPi, Jetson Nanoといった様々なプラットフォームへインストールできます。各プラットフォームへのインストール手順は以下のURLを参照してください。\n",
"\n",
"**<font Color=\"Blue\">参考 DonkeyCarインストール</font>**\n",
"https://docs.donkeycar.com/guide/install_software/\n",
"\n",
"\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "QvNbAaXtKX9w",
"colab_type": "text"
},
"source": [
"## **2. DonkeyCarワークスペースの作成**\n",
"\n",
"DonekyCarではワークスペースという単位で作業を進めていきます。ワークスペースはDonkeyCarの設定やAIモデル、学習データを管理する単位です。ワークスペースを複数利用することで複数の設定を同時に残すことができます。走行させるコースごとにワークスペースを作ると良いでしょう。\n",
"\n",
"ワークスペースを作成するコマンドは```donkey createcar --path <ワークスペース名>```です。\n",
"```<ワークスペース名>```に指定されたフォルダが作成されます。相対パス、絶対パスで指定可能です。\n",
"\n",
"ここではローカル環境でJupyter Notebookを起動したターミナルのカレントディレクトリ配下に「mycar」という名前のプロジェクトが作成します。次のセルを実行してください。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "aPxYUIpKAY-6",
"colab_type": "code",
"colab": {}
},
"source": [
"PROJECT_PATH=\"mycar\"\n",
"!donkey createcar --path $PROJECT_PATH"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "60LA6vWpaUzG",
"colab_type": "text"
},
"source": [
"「--path」引数の値を変えることで、プロジェクト名や作成場所を変更できます。パスは絶対パス、相対パスで指定可能です。\n",
"\n",
"***"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rqYdjoLSPqKQ",
"colab_type": "text"
},
"source": [
"## **3. 設定ファイルの修正**\n",
"\n",
"DonekyCarワークスペースにせ作成される「myconfig.py」ファイルを編集することで、DonkeyCarの設定を変更することができます。「STEP2.DonkeyCar」で作成したワークスペース内のmyconfig.pyにシミュレータ用の設定を実施します。\n",
"\n",
"「mycar/myconfig.py」をテキストエディタで開き、以下のように設定値のコメントアウトを解除して値を変更してください。\n",
"\n",
"> **<font color=\"Red\">注意</font>**\n",
">\n",
"><font Color=\"Blue\">Windows標準のメモ帳を使用した場合、正常に動作しない場合があります。Visual Studio Codeなど他のエディタを使用して編集してください。</font>\n",
"\n",
"<font Color=\"Blue\">*参考*</font>: [Visual Studio Code](https://azure.microsoft.com/ja-jp/products/visual-studio-code/) \n",
"\n",
"\n",
"```\n",
"DONKEY_GYM = True\n",
"DONKEY_SIM_PATH = \"remote\"\n",
"DONKEY_GYM_ENV_NAME = \"donkey-mountain-track-v0\"\n",
"GYM_CONF = { \"body_style\" : \"donkey\", \"body_rgb\" : (128, 128, 128), \"car_name\" : \"me\", \"font_size\" : 100}\n",
"SIM_HOST = \"127.0.0.1\" \n",
"```\n",
"\n",
"> * 表1. シミュレータ設定値の意味\n",
">\n",
">|設定値 |意味 |\n",
"|:-------------------------|:-----------------------------|\n",
"|DONKEY_GYM |シミュレータを利用する場合はTrueに変更|\n",
"|DONKEY_SIM_PATH|シミュレータの実行パス、この演習ではremoteに固定|\n",
"|DONKEY_GYM_ENV_NAME|シミュレータのコース名を指定する。|\n",
"|GYM_CONF | シミュレータ上での車の種類、色、表示されるユーザ名を指定する|\n",
"|SIM_HOST | シミュレータのIPアドレス|\n",
"\n",
"---\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "A1rPkDBbQQsg",
"colab_type": "text"
},
"source": [
"## **4. 学習データの収集**\n",
"\n",
"ここではシミュレータ上のDonkeyCarを操作してAIに学習させるためのデータを集めます。\n",
"\n",
"**手順1. DonkeySIMのダウンロード**\n",
"\n",
"以下のURLからローカル環境のプラットフォームにあったDonkeySIMをダウンロードして、zipファイルを解凍します。バージョンは「May Race Edition v20.5.16」を選択しましょう。\n",
"\n",
"https://github.com/tawnkramer/gym-donkeycar/releases\n",
"\n",
"**手順2. DonkeySIMの実行<font Color=\"Red\">★</font>**\n",
"\n",
"ダウンロードしたDonkeySIMを開き、実行ファイルを実行します。以下のようなシミュレータ画面が表示されます。\n",
"<br>\n",
">* 図7. DonkeySIM起動画面\n",
">\n",
"><img width=\"506\" alt=\"sim-top\" src=\"https://user-images.githubusercontent.com/1833346/82818250-65b9f900-9ed9-11ea-8ca2-5c9f90f9615d.png\">\n",
"\n",
"**手順3. DonkeyCarソフトウェアの起動<font Color=\"Red\">★</font>**\n",
"\n",
"DonkeyCarのコントーラは```python manage.py drive```コマンドで起動します。次のセルを実行します。これまでのセルとは違い、実行を手動で停止させるまで完了することはありません。\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "38t_rIiGx-U-",
"colab_type": "code",
"colab": {}
},
"source": [
"#CLIなどで実行する場合はカレントディレクトリがworkspaceになっていることを確認する。\n",
"PROJECT_PATH=\"mycar\"\n",
"%cd $PROJECT_PATH \n",
"!python manage.py drive"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "CQckksWtnUR9",
"colab_type": "text"
},
"source": [
"コマンドを実行すると、DonkeySIMの画面が走行画面に切り替わり、コントロール用のWEBインタフェースにアクセスできるようになります。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "qyh9DAH2vNuW",
"colab_type": "text"
},
"source": [
"**手順4. コントロール画面への接続<font Color=\"Red\">★</font>**\n",
"\n",
"「手順3」を実行後、しばらくしたら以下のURLにWEBブラウザでアクセスしてください。コントロール画面が表示されます。\n",
"\n",
"http://localhost:8887\n",
"\n",
"USB接続のゲームコントローラがある場合は、PCに接続してPCのブラウザから接続します。ない場合は、スマートフォンからアクセスしてください。スマートフォンからアクセする場合は「localhost」をローカルPCのIPアドレスに読み替えてアクセスしてください。\n",
"\n",
"> <font Color=\"Red\">**注意**</font>\n",
">\n",
"> <font Color=\"Blue\">WEBコントロール画面にアクセスするブラウザはGoogle Chromeの最新版、またはmobile safariを利用してください。</font>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2FrJNrPtHOs-",
"colab_type": "text"
},
"source": [
"**WEBコントロール画面各部の説明**\n",
"\n",
">* 図8. WEBコントロール画面\n",
">\n",
"><img width=\"810\" alt=\"web_controller2\" src=\"https://user-images.githubusercontent.com/1833346/83343603-91a10880-a337-11ea-8cbe-44b3578406f5.png\">\n",
"\n",
"\n",
"<br>\n",
"\n",
">*表2. WEBコントロール画面各項目の名称と意味*\n",
">\n",
">|No |名称 |意味                   |\n",
"|:----|:-------------------------|:--------------------|\n",
"|1 |Control Mode |・操作方法を指定する。<br>1. Joysteick-キーボード操作(J,K,L,I)<br>2.Gamepad-USB接続のゲームコントローラ<br>3. Device Tilt-スマートフォンの傾き(加速度センサ)。|\n",
"|2 | MaxThrottle |スロットルの最大値を設定する。 |\n",
"|3 | ThrottleMode |・スロットルの操作方法を指定する<br>1. User - ユーザーがスロットルを操作<br>2. Constant - MaxThrottleで指定の速度で固定\n",
"|4 | Mode&Pilot |・AI Carの動作モードを指定する<br>User(d) - ユーザによる操作モード <br> local pilot - AIによる自動走行|\n",
"|5 |Angle & Throttle | 現在のステアリングとスロットルの値|\n",
"|6 |Start Recording |学習データの収集開始ボタン。スマートフォン利用時のみ有効。<br>USBコントローラではスロットルが0以外の場合に自動的に収集する。|\n",
"|6 |StartVehicle/StopVehicle | 運転操作の開始と終了ボタン、スマートフォン利用時のみ有効となる。|\n",
"\n",
"**手順5. シミュレータの操作<font Color=\"Red\">★</font>**\n",
"\n",
"2つの操作方法のいずれかに従って、シミュレータを操作し、学習データを収集します。初心者の場合は「操作方法1 スロットル固定走行」で操作を行いましょう。走行によって取得されるデータ数は手順3のセルの出力に表示されます。1万データを目安に収集を行ってください。\n",
"\n",
"**操作方法1 スロットル固定走行**\n",
"\n",
"1. 「表3.スロットル固定走行の設定」に従い、各項目を設定する。\n",
"2. 走行をスタートさせる。\n",
" * USBゲームパッドの場合は左スティックを前に倒す\n",
" * スマートフォンの場合は「StartVeheicle」を押下して、スマートフォンを前に傾ける\n",
"3. 走行操作\n",
" * コースに沿ってコースアウトしないように走行する。\n",
" * USBゲームパッドの場合は右スティックを左右に動かして操作する。\n",
" * スマートフォンの場合は左右に傾ける。\n",
" * 操作がうまくいかない場合は停止し、再度データを取得し直す。\n",
"4. データ収集の開始と停止\n",
" * ゲームコントローラの場合スロットルと連動してログの取得が行われます。\n",
" * スマートフォンの場合、Start Recording/Stop Recordingで操作します。\n",
"5. 停止する場合\n",
" * USBゲームパッドの場合はThrottleModeをUserに変更する。\n",
" * スマートフォンの場合は「StopVheicle」を押下する。\n",
"\n",
">*表3.スロットル固定走行の設定*\n",
">\n",
">| 項目          | 設定値 |\n",
"|:-----------------|:-------------------------------|\n",
"|Cotrol Mode | 1. USBゲームコントローラを使う場合は「Gamepad」を押してください。<br>2. スマートフォンから操作する場合は「Device Tilt」を選択してください。|\n",
"|MaxThrottle | MaxThrottleは30%を選択する。<br><font Color=\"Blue\">※慣れに応じて速度は変更する。</font>|\n",
"|ThrottleMode | Contant |\n",
"|Mode&Pilot | User(d) |\n",
"\n",
"\n",
"**操作方法2 マニュアルスロットル走行**\n",
"\n",
"1. 「表4.マニュアルスロットル走行の設定」に従い、各項目を設定する。\n",
"2. 走行をスタートさせる。\n",
" * USBゲームパッドの場合は左スティックを前に倒す\n",
" * スマートフォンの場合は前に傾ける\n",
"3. 走行操作\n",
" * コースに沿ってコースアウトしないように走行する。\n",
" * USBゲームパッドの場合\n",
" * 左スティックの前後でスロットル操作\n",
" * 右スティックの左右でステアリング操作\n",
" * スマートフォンの場合\n",
" * 前後に傾けてスロットルを操作\n",
" * 左右に傾けてステアリングを操作\n",
" * 操作がうまくいかない場合は停止し、再度データを取得し直す。\n",
"4. データ収集の開始と停止\n",
" * ゲームコントローラの場合スロットルと連動してログの取得が行われます。\n",
" * スマートフォンの場合、Start Recording/Stop Recordingで操作します。\n",
"5. 停止する場合\n",
" * USBゲームパッドの場合はスロットルを中立にする。\n",
" * スマートフォンの場合は「StopVheicle」を押下する。\n",
"\n",
">*表4.マニュアルスロットル走行の設定*\n",
">\n",
">| 項目          | 設定値 |\n",
"|:-----------------|:-------------------------------|\n",
"|Cotrol Mode | 1. USBゲームコントローラを使う場合は「Gamepad」を押してください。<br>2. スマートフォンから操作する場合は「Device Tilt」を選択してください。|\n",
"|MaxThrottle | MaxThrottleは30%を選択する。<br><font Color=\"Blue\">※慣れに応じて速度は変更する。</font>|\n",
"|ThrottleMode | User |\n",
"|Mode&Pilot | User(d) |\n",
"\n",
"><font Color=\"Blue\">*参考*</font>\n",
">\n",
"> 学習を行うためにはコースに沿った走行データが重要です。コースアウトや車の横転が発生した場合は、すぐに録画を停止して、当該のデータを削除してください。コントローラで車の姿勢が戻せない場合は、手順3のセルを停止し、再度実行してください。\n",
"\n",
"\n",
"> <font Color=\"Blue\">**コラム 収集した学習データについて**</font>\n",
">\n",
"> 収集された学習データはワークスペース直下の「data/tub_xxxxxx」というフォルダに収集されます。学習データはAI RC CARに搭載されたカメラの画像とその対となるjsonファイルとして保存されます。jsonファイルには画像撮影時にユーザが操作していたスロットルとアクセルの値が保存されます。\n",
">\n",
"> つまり、学習データはコースの画像データと人間のお手本操作(ラベルデータ)です。「STEP5. 学習」ではAIがこの教師データを元に、ある画像の時に、人間がどのような操作をしたかを模倣させる学習を行います。このような学習を模倣学習(Behavior Cloning)と呼びます。\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "e-Dujk1Iaeyv",
"colab_type": "text"
},
"source": [
"---"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "jjsQ5eOadncm",
"colab_type": "text"
},
"source": [
"## **5. 学習**\n",
"\n",
"いよいよDonkeyCarのAIを学習させます。学習はcolab環境で行います。\n",
"\n",
"**手順1. 学習データの圧縮<font Color=\"Red\">★</font>**\n",
"\n",
"ローカルで収集した走行データをcolab環境へアップロードするためにzipファイルに圧縮します。教師データはワークスペース配下のdataフォルダに入っています。以下のコマンドを実行してdataフォルダをdata.zipという名前で圧縮します。\n",
"\n",
"* macOSの場合\n",
"\n",
"演習通りに進めた場合、ホーム配下の```workspace/mycar/data```を圧縮してください。\n",
"\n",
"\n",
"* Windowsの場合\n",
"\n",
"```C:¥Users¥<ユーザ名>¥workspace¥mycar¥data```を圧縮してください。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8lfftCjufFpg",
"colab_type": "text"
},
"source": [
"**手順2. colab環境への接続<font Color=\"Red\">★</font>**\n",
"\n",
"<font color=\"Red\">ここからはcolabインスタンスに接続します。</font>\n",
"\n",
"colab環境に接続します。接続が完了した後に、画面左側上から3つ目のフォルダアイコンを選択し、アップロードボタンを押下します。ローカル環境から圧縮したdata.zipを選択して、colabへ圧縮した教師データアップロードします。\n",
"\n",
"> 図8. cplab環境へのファイルアップロード\n",
">\n",
"><img width=\"326\" alt=\"フォルダ選択画面\" src=\"https://user-images.githubusercontent.com/1833346/82819110-cc8be200-9eda-11ea-9fd9-ca2b88f61c26.png\">\n",
"\n",
"**手順3. colab環境の構築<font Color=\"Red\">★</font>**\n",
"\n",
"AIの学習を実行するため、colab環境にDonkeyCarの環境を構築します。次のセルを実行して、環境構築とワークスペースの作成を行います。\n",
"\n",
"> <font color=\"Red\">**注意**</font>\n",
">\n",
"> <font color=\"Blue\">colab環境無料枠の場合90分間接続がないと環境がリセットされます。また、12時間を越えると強制的にリセットされます。</font>\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "jjbIv31ifwOc",
"colab_type": "code",
"colab": {}
},
"source": [
"## colab環境の構築\n",
"\n",
"# DonkeyCarソフトウェア本体をインストール\n",
"!git clone https://github.com/autorope/donkeycar\n",
"%cd donkeycar\n",
"!git checkout master\n",
"!pip install -e .[pc]\n",
"!pip install -e gym-donkeycar\n",
"%cd ../\n",
"\n",
"#シミュレータ用クライアントライブラリをインストール\n",
"!pip install gym\n",
"!git clone https://github.com/tawnkramer/gym-donkeycar\n",
"!pip install -e gym-donkeycar\n",
"\n",
"#mycarワークスペースの作成\n",
"#作成後はmycarワークスペース内に移動することに注意。\n",
"PROJECT_PATH=\"mycar\"\n",
"!donkey createcar --path $PROJECT_PATH\n",
"%cd $PROJECT_PATH "
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "QT4lylhQgiaF",
"colab_type": "text"
},
"source": [
"**手順4. 学習データの展開<font Color=\"Red\">★</font>**\n",
"\n",
"環境構築完了後、次のセルを実行して学習データをDonkeyCarのワークスペース、```mycar```に展開します。data.zipを解凍して得られる、dataフォルダがmycar内のdataフォルダを上書きするように解凍します。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "J0stvvGEajH1",
"colab_type": "code",
"colab": {}
},
"source": [
"FILE_NAME = \"/content/data.zip\"\n",
"!rm -rf data\n",
"!unzip $FILE_NAME"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "2-x3OBK5E27_",
"colab_type": "text"
},
"source": [
"**手順5. colabでの学習の実行<font Color=\"Red\">★</font>**\n",
"\n",
"次のコマンドを実行して、DonkeyCarの学習を実行します。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "2Kvu4yhDNHbU",
"colab_type": "code",
"colab": {}
},
"source": [
"%cd /content/mycar\n",
"!python manage.py train --model models/mypilot.h5"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "0zV3Ov5xhgy3",
"colab_type": "text"
},
"source": [
"学習が完了すると、mycar/modelsにmypilot.5hというファイルが作成されています。このファイルが学習データから学習したAIのモデルファイルになります。左側のファイルブラウザで当該のファイルを探し、右クリックからダウンロードしてください。\n",
"\n",
"**手順6. AIモデルファイルの配置<font Color=\"Red\">★</font>**\n",
"\n",
"ダウンロードしたmypilot.5hをローカル環境のワークスペース配下のディレクトリ```workspace¥mycar¥models```に移動させてください。\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "GVtBqxbyeQl2",
"colab_type": "text"
},
"source": [
"\n",
"> <font Color=\"Blue\">*コラム DonkeyCarのAIは何を学習しているのか*</font>\n",
">\n",
">学習で何が行われているのかをかく。\n",
">畳み込み層では画像の中から特徴となる。\n",
"> * 特徴抽出(CNN)\n",
"> * 回帰(全結合層)\n",
">* 画像を入力して回帰部分の結果の誤差が少なくなるようにパラメータを計算している。\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2i7kIu4NE6vG",
"colab_type": "text"
},
"source": [
"## **6. 自動走行<font Color=\"Red\">★</font>**\n",
"\n",
"<font color=\"Red\">**ここからはローカル環境に接続します。**</font>\n",
"\n",
"\n",
"いよいよ自動走行を行います。まずは、忘れずにcolab環境からローカル環境へ切り替えを行いましょう。\n",
"\n",
"DonkeySIMを立ち上げ後、次のセルを実行して```python manage.py drive```を実行します。```--model```引数には先ほどcolab環境からコピーしてきたmypilot.h5を指定します。これで、DonkeyCarソフトウェアが自動走行する準備ができました。"
]
},
{
"cell_type": "code",
"metadata": {
"id": "FMIp3IvcYdWx",
"colab_type": "code",
"colab": {}
},
"source": [
"#CLIで実行する場合はworkspace¥mycarに移動していることを確認する。\n",
"!python manage.py drive --model models/mypilot.h5"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "DuuuVABejdBG",
"colab_type": "text"
},
"source": [
"以下のURLにアクセスして、WEBコントローラ表示してください。\n",
"\n",
"* http://localhost:8887\n",
"\n",
"\n",
"コントローラ画面で「Mode & Pilot」を「local pilot」に変更して、「Start Vhecle」を押すと自動走行が始まります。\n",
"\n",
"さあ!初めての自動走行を楽しみましょう。\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "kM5lcDzKhdUi",
"colab_type": "text"
},
"source": [
"## **6. リモートサーバへの接続**\n",
"\n",
"バーチャルレースに参加するためにはリモートサーバへ接続する必要があります。ここではリモートサーバへ接続するための方法を説明します。\n",
"DonkeyCarワークスペース内の「myconfig.py」を以下のように変更して、リモートサーバアドレスを設定してください。サーバアドレスはリモートサーバの管理者に確認してください。\n",
"\n",
"```\n",
"DONKEY_GYM = True\n",
"DONKEY_SIM_PATH = \"remote\"\n",
"DONKEY_GYM_ENV_NAME = \"donkey-mountain-track-v0\"\n",
"GYM_CONF = { \"body_style\" : \"donkey\", \"body_rgb\" : (128, 128, 128), \"car_name\" : \"me\", \"font_size\" : 100}\n",
"SIM_HOST = \"<リモートサーバのURL>\" \n",
"```\n",
"その後「6.自動走行」と同様に自動走行を開始してください。ローカルでのDonkeySIM起動は必要ありません。\n",
"\n",
"><font Color=\"Blue\">*コラム リモートシミュレータで自動走行がうまくいかない*</font>\n",
">\n",
"> ローカルシミュレータで自動走行がうまくいっていたのに、リモートシミュレータに接続した途端にうまく走らなくなってしまった。こういう状況になると自分の設定やリモートシミュレータが悪いのかと疑いなたくなります。ですが、多くの場合通信の遅延時間(レイテンシ)が増大した事に起因しています。DonkeyCarのソフトウェアとシミュレータはTCP通信で常に通信しています。コースの画像がシミュレータから送信され、それを受けAIがステアリングとスロットルの予測を行い、予測した値をシミュレータへ送信します。画像と予測値の往復の間にもシミュレータの車は惰性で動き続けています。そのため、通信の遅延によってAIの判断と実際の車両の位置にズレが生じるのです。\n",
">\n",
"> 「myconfig.py」には「SIM_ARTIFICIAL_LATENCY」という設定があります。設定した時間(msec)だけ車の操作を遅らせることができるため、ローカルでレイテンシを再現可能です。この機能を使い、実際のバーチャルレースの走りを予想しながら、通信遅延を織り込んだAIを作ることも勝つためには重要です。"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "wM_ORe-Mlryz",
"colab_type": "text"
},
"source": [
""
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment