概要
人工知能のディープラーニングを使って、ラジコンカーの自動運転をしてみました。
ラジコンカーに自動運転をさせるための手順は、おおまかに以下の三つです。
1)手動運転モードで、人がラジコンカーを操縦します。コースからはみ出さないように10周以上走らせます。そのときのカメラ画像とステアリング角度の情報を記録します。
2)それらを訓練データとして人工知能のディープラーニングに学習させます。
3)自動運転モードに切り替えると、ディープラーニングの学習結果を使って、ラジコンカーが自動運転します。
動画
ラジコンカーの自動運転の動画
ラジコンカーの自動運転の動画(コースを少し難しくしました)
ラジコンカーに取り付けたカメラの映像(人がラジコンカーを操縦中)
このような画像をディープラーニングの訓練データに使用する。
ラジコンカーの自動運転のための、データ記録・学習・自動運転を早送りで編集してみました。
説明
1.使用した部品
ラジコンカー | No.347 ランチボックス 2005 58347(タミヤ 1/12 電動RCカーシリーズ) |
スピードコントローラ | QuicRUN-1060-Brushed(HOBBYWING) |
サーボ | MG996R(TOWER PRO) |
バッテリー | YB-L300A(YOKOMO) Lipo 30C 7.4V 3000mAh |
ラズベリーパイ | Raspberry Pi3 Model B+ |
マイクロSDカード | microSDHCカード 32GB MLC NANDフラッシュ採用 UHS-I Class10 TS32GUSD500S-E(Transcend) |
カメラ | Raspberry Pi用カメラモジュール サイズ113広角レンズ(サインスマート) |
PWMサーボドライバー | PCA9685(HiLetgo)16チャンネル 12ビットPWM IICモジュール |
ヒートシンク | Raspberry Pi B+用ヒートシンクセット P-09282(秋月電子通商) |
DCDCコンバータ | OKL-T/6-W12N-C使用 小型高効率DCDCコンバーター可変電源キット(降圧)K-07728(秋月電子通商) |
電圧計 | 小型デジタル電圧計 赤 DC 2.5V~30V 2線式(KKHMF) |
カメラ固定用部品 | アルミ板金で製作 |
ワイヤレスコントローラ | PS3ワイヤレスコントローラ (DUALSHOCK3) (SONY) |
PC | Windows 10 Pro OMEN by HP 15 Corei7-8750H 16GB GeForce GTX1070 with Max-Q Design(8GB) |
(注意)ラジコンカーの、スピードコントローラとサーボはPWM入力に対応しているものを選択する。
ソフトウェアはDonkey Carのものを利用しました。手順も、Donkey Carの説明通りに行いました。
amazonの商品ページへのリンク
No.347 ランチボックス 2005 58347(タミヤ 1/12 電動RCカーシリーズ)
QuicRUN-1060-Brushed(HOBBYWING)
HiLetgo PCA9685 16チャンネル 12-ビット PWM Servo モーター ドライバー IIC モジュール Arduinoに対応 ロボット
2.配線
ラズベリーパイに、PWMサーボドライバー、カメラを接続する。
(GPIOの 3.3V(01pin),SDA1(03pin),SCL1(05pin),Ground(09pin)をPCA9685の基板に接続)
PWMサーボドライバーには、以下のチャンネルにサーボとスピードコントローラを接続する。
THROTTLE_CHANNEL = 0 STEERING_CHANNEL = 1 |
電源は、バッテリーを分岐して、スピードコントローラ、DCDCコンバータ、電圧計に接続する。
DCDCコンバータの5V出力をラズベリーパイに接続する。
(ラズベリーパイの電源端子 GPIOの 5V(02pin),Ground(06pin)に5Vを供給)
donkeycarからラズベリーパイのディスクイメージ(RPi3B and 3B+用)をダウンロードし、マイクロSDカードに書き込む。それを使ってラズベリーパイを起動する。
3.設定・調整(PWM、カメラ)
Windows PCで、Python環境のAnacondaにdonkeycarのソフトウェアをインストールする。
Windows PCからラズベリーパイの接続には、TeraTermの使用した。ファイル転送にはWinSCPを使用した。
PWMと前輪のステアリングの関係について、キャリブレーションをする。
piで実行
cd ~/mycar donkey calibrate --channel 1
PWMと後輪のスロットルの関係について、キャリブレーションをする。
piで実行
donkey calibrate --channel 0
キャリブレーション結果をconfig.pyに書き込む。
piで実行
python manage.py drive
WindowsのGoogle Chromeで http://192.168.0.8:8887/ を開く(IPアドレスはpiに合わせる)
このChrome画面でPWM出力値を変更できる。
スロットルの加速 は i、減速は k ステアリングの右 は l、左は j |
車の旋回直径のグラフを書いて左右対称になるようキャリブレーションを再調整(config.pyを修正)する。
キャリブレーション結果(config.py)
STEERING_LEFT_PWM = 305 STEERING_RIGHT_PWM = 500 THROTTLE_FORWARD_PWM = 400 THROTTLE_STOPPED_PWM = 360 THROTTLE_REVERSE_PWM = 310
Chrome画面にラジコンカーのカメラ映像が映るので、カメラの取付位置と角度を調整する。
piで、ブルーツースを有効にして、ワイヤレスコントローラの設定を行う。
4.人がラジコンカーを操縦してデータを記録する
piとワイヤレスコントローラの接続に成功すると、以下で確認できる。
piで実行
ls /dev/input/js0 hexdump /dev/input/js0
ワイヤレスコントローラ操作モードで起動する
piで実行
python manage.py drive --js
モードは起動時の「User」のまま。
ワイヤレスコントローラで、ラジコンカーを操縦して、訓練データを記録する。
(10~20周 (5-20k images))
Select | モード切替 「User」「Local Angle」「Local(angle and throttle)」 |
□ | スロットル上限 増 |
X | スロットル上限 減 |
〇 | 記録ON/OFF |
Start | 一定スロットル |
piのtubフォルダにDonkeyデータが記録される。
((注意)ボタン割り当てが違ったのでcontroller.pyを修正した。)
((注意)tubフォルダ内の記録データを削除するときにmeta.jsonをうっかり消さないこと。)
5.ディープラーニングで学習する
tubフォルダ内に記録されたデータをWindowsに転送する。
それを訓練データとして、ディープラーニングを学習させる。(約5000のデータで約8分かかった)
WindowsのAnacondaの端末で実行
cd C:\Users\sakamoto\mycar python manage.py train --tub tub --model models/mypilot
学習結果のmypilotをpiに転送する。
記録したデータから動画を生成する。
WindowsのAnacondaの端末で実行
donkey makemovie --tub tub --out=tub_movie.mp4
(tubフォルダ内に記録されたデータが最初(0_cam-image_array_.jpg、record_0.json)からでないときエラーになった。)
6.学習結果を使って、ラジコンカーを自動運転させる
学習結果で起動する。
piで実行
python manage.py drive --model models/mypilot --js
Selectでモードを「Local Angle」に切り替える。
(モードを「Local Angle」に切り替えたときにエラーが出たのは、Windowsのmanage.pyがKerasLinearで、piのmanage.pyがKerasCategrocialであった。これらを統一する必要がある。)
ラジコンカーは自動運転でコースを走る。
7.ディープラーニングのモデル
学習モデルを出力してみた。