yak shaving

まずはシミュレータでDonkeyCarをやってみて趣味の自動運転テクノロジーはどうなっているのかを試してみたいとおもいます。https://docs.donkeycar.com/guide/simulator/

まず、DonkeyCar本体。https://github.com/autorope/donkeycar これはPCとラジコンに載せたラズパイに入れるものみたい。

次に、シミュレータに接続するモジュール。https://github.com/tawnkramer/gym-donkeycar したのシミュレータに接続できるようになるDonkeyCarの拡張。

そしてシミュレータ本体。これはUnityで作られたゲームみたいなものでした。 https://github.com/tawnkramer/gym-donkeycar/releases gym-donkeycarがlistenしてシミュレータがconnectするという造りになっていました。

これらをインストールする必要があるのですが、ゴニョゴニョと考えた結果、DonkeyCar本体とgym-donkeycarはNVIDIAなDocker内のLinux。シミュレータはMacで動かすことになりました。

まず、NVIDIAなDockerホストを準備しました。 https://qiita.com/takeru@github/items/a1e6a9b77d13abaf8c2d これで重い学習がきても安心。

DonkeyCar+gym-donkeycarのコンテナを作りました。 https://gist.github.com/takeru/55b686b459bfa60f83c4ad75bc5d51d6 これで試行錯誤しやすくて安心。

そして、Macでシミュレータを動かしてDonkeyCarと接続、運転してなんらかのデータ収集まではできたのですが、シミュレータのコントロールが難しくてまともなデータが作れません。微妙なハンドル操作ができるゲームパッドが必要なようです。

実機のラジコンが来たら(まだ発送されてないな。)ゲームパッドが必要なので買ってもいいのですが、WiiリモコンがBluetoothなゲームコントローラだったという記憶があります。

ちょっと調べた結果、Wiiリモコンは標準的なプロトコルではないのでMacには(かんたんには)つながらないようです。Linuxなら繋がりそうだけど。

M5StickCにWiiリモコンをつなぐ件について調査。 http://wiibrew.org/wiki/Wiimote https://qiita.com/jp-96/items/ff3822ab81f7696172c0 このあたりを参考にできそう。

esp-idfという環境が必要。これもDockerで https://github.com/shungok/esp32-cmake-development-env https://qiita.com/shungok/items/c8fb090e06d5ddcd6f22 これを利用させてもらってすぐできました。

esp-idfのexampleを見ていると https://github.com/espressif/esp-idf/tree/master/examples/bluetooth/bluedroid 「coex contains Classic BT and BLE coex examples」ってあって、たぶんWiiリモコンはClassic BTだからBLEで「一般的なゲームコントローラデバイス」をつくれてClassic BTとBLEが同時に動かせるのならば、Wiiリモコンを普通のゲームパッドとしてMacにつなぐ中継デバイスがつくれるんじゃないの?なんて考えてしまいました。Wiiリモコンは世の中に何億台眠ってるのでしょうか。

ところで、Dokcerのesp-idf環境には1つ問題があって、手元のMacのシリアルポートにDocker内から接続するのがめんどうでややこしい。Mac上のVirtualBoxのDockerからならどうにかなるけど、ネットワークの向こうのLinuxのQEMU/KVMの中のDockerから手元のMacbookなんてことになるとまあ無理でしょうってみんな諦めるとおもう。でもたいていこういうのには素敵なハックをしている人が必ずいて、すこし調べると、socatとかser2netとかでシリアルポートをネットワーク越しに使うというのがあった。でも試したがだめ。socatはDTR/RTSを扱わないので書き込み時の自動リセットがかからない、ser2netはRFC2217というDTR/RTSも扱ってくれるプロトコルに対応しているが、Mac側がser2netサーバでOKでもLinux側のクライアントが無い。無いというか、つくるのが難しい https://unix.stackexchange.com/questions/498332/virtual-tty-client-for-network-telnet-rfc2217-server?rq=1 ということだった。

最後、運良く流れ着いたのが、 https://github.com/espressif/esptool/issues/383 ここ。ほらやっぱり素敵なハックがあった。pythonのシリアルポートを扱うライブラリの中にあるRFC2217の実装を元にリセットタイミングの問題を魔改造( https://github.com/espressif/esptool/issues/383#issuecomment-443871237 )でなんとかしたもの。MaixPyのファームウエアビルド環境にもこれいれればいいな。

これをきれいにまとめたのが、 https://github.com/takeru/esptool/pull/1 これ。

これで、Docker内のesp-idf開発環境からMacにつないだM5StickCに書き込みできるようになりました。

で、https://qiita.com/jp-96/items/ff3822ab81f7696172c0 に戻ってmake flash & make monitorで、M5StickCとWiiリモコンがつながってボタンのオンオフが読めていることが確認できました。あとは http://wiibrew.org/wiki/Wiimote これがあるのでどうにでもなる。

次回は、ESP32でBLEなゲームコントローラーを作ってMacに接続できるのか?です。






この記事が気に入ったらサポートをしてみませんか?