Donkey Carを設定のみで2WD化 (プログラム改変なし)

#■はじめに
標準のDonkeyはスロットル&ステアの構成ですが、2WD化すればより様々な車体をDonkey化できると思いやってみました。車体は3000円のラジコン戦車を改造してつくりましたが、2台のDC Motorの2WDであれば何でもよいです。
#■車体イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234533/79eed8b0-1e2d-2735-ea35-2b289ad447ac.png)

#■ポイント
##・簡単すぎるぐらい簡単に2WD化する。
##・FaBoさんのDonkeyCar3チュートリアルをベースラインとする。
##・DRIVE_TRAIN_TYPE = "SERVO_ESC"のままとする。
##・プログラムは改変せず、設定変更のみで実現する。
##・前後左右できる2WDカーを、2つのDC Motorでつくる。
##・ESCは回転サーボSG90-HV内蔵基板を流用し安く上げる。
##・左右のモーターをF710の2つのStickの前後操作で運転。

#■機械学習後の自立自動走行動画
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/Donkeycar?src=hash&amp;ref_src=twsrc%5Etfw">#Donkeycar</a><br>Donkey AI Carを設定のみ(ソフト改変なし)で2WD化しキャタピラ車に応用。動画後半にアップ映像。Qiita投稿準備中。 <a href="https://t.co/UTL1dOINeq">pic.twitter.com/UTL1dOINeq</a></p>&mdash; Google Homer (@google_homer_) <a href="https://twitter.com/google_homer_/status/1220646647442464769?ref_src=twsrc%5Etfw">January 24, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#■使用したDonkeyCarチュートリアル
###FaBoさんが公開しているチュートリアル「[FaBo DonkeyCar Docs](https://faboplatform.github.io/DonkeyDocs/)」に基づいて構築したDonkey Carをベースラインとして、2WD化する場合の変更点を記述していきます。以下にチュートリアルのメニューのみ抜粋であげておきます。「組み立て」部分は、本Qiita記事の「■車体の組み立て(参考)」の内容で読み替えて下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234533/03ff77ca-02f8-4373-0e30-9b431da16bbd.png)

#■システム構成
###スロットルのServo信号を右車輪のDC Motorに、ステアリングのServo信号を左車輪のDC Motorに割り当てます。
###Servo信号でDC Motorを回すには、ESC(パワーコントローラ)が必要ですがサイズが大きく高価です。そこで簡易ESCとして、超小型で安価(500円×2)な回転サーボSG90-HV内蔵基板を流用します。
###電源はすべて2Aのモバイルバッテリーでまかなっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234533/23dd76e4-7bd1-5e0a-a715-ca0ba98bd693.png)

#■主要部品
クリックで購入サイト表示されます。
[① ラジコン戦車](https://www.yodobashi.com/product/100000001004193055/) **(2WD DC Motor×2の構成なら何でもよい)**
[② 360°連続回転サーボSG90-HV](http://akizukidenshi.com/catalog/g/gM-14382/) **(基板取出しDC Motor Driverとして流用)**
[③ Raspberry Pi 3B](https://www.switch-science.com/catalog/3050/) **(推奨3B+ですが、持ち合わせの3Bで代用)**
[④ PCA9685 I2C Servo Driver HAT](https://www.amazon.co.jp/dp/B07K7NK2TJ)　**(HAT以外の方が購入しやすいかも)**
[⑤ Raspberry Pi用広角Camera Module](https://www.fabo.store/collections/donkeycar/products/raspberry-pi%E7%94%A8-camera-module)
[⑥ 32G microSD Card](https://www.amazon.co.jp/dp/B07MTCJHP6)
[⑦ ワイヤレスゲームパッドF710](https://www.yodobashi.com/product/100000001001732200/) **(教師走行で使用)**

#■簡易ESCの作成方法　(2台つくります)
回転サーボSG90-HVを部品取りに使います。ギア不良で回らなくなったものなどを活用するとよいでしょう。底面の4本のネジを外すことで簡単に基板が取り出せます。内蔵モーターに繋がっている線2本を切断し、基板を取り出します。サーボの3線側ケーブルはそのまま使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234533/5bf061c8-a422-e053-9307-de8d4c8869e1.png)


#■ゲームパッドの左Stickを前後操作に設定変更
###標準設定では右Stickを前後に倒す事でスロットルを、左Stickを左右に倒す事でステアリングを制御するようになっています。右車輪はスロットルに接続しているのでStickの前後操作のままで問題ありません。一方、左車輪はステアリングに接続しているので左右操作のままでは操作しづらいので、前後で操作できるように変更します。左Stickの前後操作と左右操作を入れ替えるようcontroller.pyを書き換えます。
```nano ～/donkeycar/donkeycar/parts/controller.py```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234533/38d4dbc9-5edc-5868-397a-bd9b0f67239e.png)
(注)使用するゲームパッドがF710にもかかわらず上記ではPS3の設定を変更していますが、正しいです。うまく説明できないのですが、たぶんチュートリアルの標準Donkeyの設定の方に齟齬があるのでこうなってしまっているような気がします。
###設定変更後のゲームパッドの操作動画(教師走行)
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/Donkeycar?src=hash&amp;ref_src=twsrc%5Etfw">#Donkeycar</a><br>2WD Donkey、ステアとスロットルを左右2輪に割り当て。教師走行用のJoyconのステア(左スティック)レバー操作を左右から前後に設定変更するのが肝だった。Qiita投稿準備中。 <a href="https://t.co/L9AU3IH5Fc">pic.twitter.com/L9AU3IH5Fc</a></p>&mdash; Google Homer (@google_homer_) <a href="https://twitter.com/google_homer_/status/1220648794582179841?ref_src=twsrc%5Etfw">January 24, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#■キャリブレーションの設定変更(参考値)
チュートリアルにモーターパワーを調整する「キャリブレーション」手順が記載されていますが、ステアとスロットル個別の調整のため2WDを直進させるため2台のモーターのパワーバランス調整には不向きです。代りに、実際に教師走行させてみて調整する方法をお勧めします。設定値を書き換える操作自体はキャリブレーションで説明されてる方法でやります。2WD車体の構成によって異なると思いますが、参考として設定値を書いておきます。
```nano ～/mycar/myconfig.py```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234533/b07900dd-545e-de6f-5edf-d21dc51a0568.png)


#■車体の組み立て(参考)
今回はラジコン戦車を流用して車体をつくりました。モーター2台をラジコン受信機から切断して、ラズパイに繋ぎ変える形です。モーター横の基板はラジコンの受信機で、Donkeyに対しては何も作用していません。上物のボディーは残念ながら乗りませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234533/6ed6758d-3154-5b81-c94c-7720f11903ac.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234533/b26f8d1f-816a-1c03-685a-d6923b1bada5.png)

#■まとめ
非常に簡単にスロットル&ステアの構成を2WDの構成に変更する事ができました。さらに、DC Motorの代りに回転Servoを使えばESCも不要になり、より簡単な構成にもできます。しかしながら、2WDの左右のモーターを対応した2つのStickで操作するようにしたため、とても運転しずらかったです。教師データ作成のためにコースの導線を正確にトレースしなければならないというDonkeyの特性を考えると、やはりスロットル&ステア構成の車体の方がよいようです。

以上