概要

人工知能のディープラーニングを使って、ラジコンカーの自動運転をしてみました。
ラジコンカーに自動運転をさせるための手順は、おおまかに以下の三つです。
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の説明通りに行いました。

>> Donkey Carのページ

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に合わせる)

GUI画面のキャプチャー画像

GUI画面

この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.ディープラーニングのモデル

学習モデルを出力してみた。

ディープラーニングのモデル(donkey car)の画像

ディープラーニングのモデル(donkey car)

 

<参考>

Donkey Car
DonkeyCar セットアップ