ツインモーター台車をDonkeycarで走らせる(1)

# はじめに

最近AIラジコンカーが流行っているそうなので、手元の部品で試せないかと思ってやってみました。
今回試すAIラジコンカーは[Donkeycar](http://www.donkeycar.com/) ですが、公式の手順ではステアリングサーボを使って操舵する、いわゆる一般的なラジコンを紹介しています。
ここでは、タミヤ製の

- [ダブルギヤボックス（左右独立４速タイプ）](https://www.tamiya.com/japan/products/70168/index.html)
- [トラック＆ホイールセット](https://www.tamiya.com/japan/products/70100/index.html)
- [透明ユニバーサルプレート （2枚セット）](https://www.tamiya.com/japan/products/69906/index.html)

を使って作ったツインモーター台車を使い、手軽にDonkeycarを試してみます。
車体の完成イメージはこちら。

![P_20190105_092011_vHDR_Auto.jpg](https://qiita-image-store.s3.amazonaws.com/0/333764/e6bc5940-d47e-5c4a-d66a-a23773de3c3c.jpeg)


# モータードライバの作成

Donkeycarは、ESCやステアリングサーボにPWM入力をしてコントロールするラジコンカーを前提に設計されています。  
公式の[ドキュメント](http://docs.donkeycar.com/guide/build_hardware/)ではPCA9685を使ったサーボシールドをRaspberry PiとI2C接続してラジコンカーをコントロールする手順が記載されています。今回はPCA9685サーボシールドからのPWM信号を入力としてツインモーター台車をコントロールするモータードライバーを実装しました。
(ArduinoとRaspberry Piを直接繋いだらよいのではという声が聞こえてきそうですが、今回は極力公式のソースコードをそのまま試してみようという試みでした。そのままラジコン戦車にも応用できそうですしね。)  

![モータードライバ構成図.png](https://qiita-image-store.s3.amazonaws.com/0/333764/c2cfb924-3113-4f56-aff0-946ad51d57eb.png)



こんな感じの構成です。
Arduino Nanoにて2CHのPWM入力(前進/後進、左右)を受け付け、ツインモーター台車の左右のモーターへ出力します。左右の回転数差で進む方向をコントロールします。  
モータードライバには、スタンダードなTA7291Pを2つ使っています。Arduino Nanoを使っているのはスペースの都合です。Arduino用ソースコードは下記になります。

https://github.com/kitata9/simple_motorDriver_PWM

![P_20190105_094544_vHDR_Auto.jpg](https://qiita-image-store.s3.amazonaws.com/0/333764/eb31791a-4fe9-e9f9-8c0d-25ba5f44e506.jpeg)


今回はユニバーサル基板に実装しましたが、そのうちプリント基板化したいと思います。
モーター用の電源供給は、ArduinoやRaspberry Piからとるのではなく、専用の配線を用意して行います。ここでは、PCA9685サーボシールドを経由してPanasonic製のモバイルバッテリーからモータードライバへ電源入力しています。ちなみに、Raspberry Piへの電源入力も同じモバイルバッテリーから行っていますが、とりあえずは安定して動いています。

# ゲームパッドで操作してみる

車体の準備が整ったところで、Donkeycarのソフトウェアを使って走行させてみます。
Donkeycarの環境構築には、[公式ドキュメント](http://docs.donkeycar.com/)のほか下記のページを参考にさせていただきました。

- [Donkey Carの作り方(RasPi側)](https://qiita.com/akira-sasaki/items/c37468e88c9bbd739a65)
- [DonkeyCar セットアップ（旧バージョン2.5.1）](https://qiita.com/mituhiromatuura/items/86a4dde22f469119f9d3)

Donkeycarイメージを使ってセットアップしたあと、下記のコマンドで今回の台車用のプロジェクトフォルダ「dualMotorCar」を作成します。

    $ donkey createcar ~/dualMotorCar

manage.py及びconfig.pyが含まれたプロジェクトフォルダが生成されます。

Donkeycarを自動走行させるためには、

- 学習データの生成(人間が操作した内容とその時の画像)
- 走行のためのモデル作成(GPUを積んだホストマシンで実行)
- モデルをDonkeycarへデプロイ

の手順が必要になります。

学習データの生成に関して、Donkeycarをセットアップした直後はWebコンソールからのコントロールで車体を走らせて生成することができます。しかし、Wi-Fi経由で動作が不安定だったり操作が難しかったりしたので、ゲームパッドを使って操作できるようにしました。

ゲームパッドにはELECOM JC-U3912Tを使いますが、必要なソフトウェアモジュールとして[Donkey Car用ジョイスティックコントローラ](https://github.com/coolerking/donkeypart_game_controller)を利用させていただきました。
ジョイスティックコントローラーのGithubに記載されている手順通りにソフトウエアのどうぬ湯とともにmanage.pyを書き換えるほかに、PCA9685からのPWM出力を調整するためconfig.pyを下記のように書き換えました(抜粋)。

```
#VEHICLE                                                                                        
DRIVE_LOOP_HZ = 20
MAX_LOOPS = 100000

#CAMERA                                                                                         
CAMERA_RESOLUTION = (120, 160) #(height, width)                                                 
CAMERA_FRAMERATE = DRIVE_LOOP_HZ

#STEERING                                                                                       
STEERING_CHANNEL = 1
STEERING_LEFT_PWM = 474
STEERING_RIGHT_PWM = 314

#THROTTLE                                                                                       
THROTTLE_CHANNEL = 0
THROTTLE_FORWARD_PWM = 474
THROTTLE_STOPPED_PWM = 394
THROTTLE_REVERSE_PWM = 314
```


STTEERINGやTHROTTLEの部分でPWM出力の幅やニュートラル時の値を設定することができます。
また、カメラの解像度やフレームレートもここで設定します。

ここまで設定できたところで、下記のコマンドを実行するとゲームパッドでツインモーター台車をコントロールできるようになります。

    ~/dualMotorCar $ python manage.py drive --js


# 次回は…

いかがでしたでしょうか。
今回はDonkeycar事始めとして、ツインモーター台車ラジコンを作りました。
次回は実際にコースを作って学習させ、自動走行を試してみたいと思います。