見出し画像

JumperT16を使ってみる後編

USBをつないでみましたが、DonkeyCarが認識してくれなかったので、操作ができませんでした。
HIDに対応しているならJS0ファイルなどに反応があるはず。
ファイルを調べてみると、ちゃんとJs0ファイルができています。

/dev/input $ cat js0 | hexdump
0000000 f874 0006 0001 0081 f874 0006 0001 0181
0000010 f874 0006 0001 0281 f874 0006 0000 0381
0000020 f874 0006 7fff 0082 f874 0006 7fff 0182
0000030 08b8 0008 0000 0002 08b8 0008 0000 0102
0000040 5476 0008 fb62 0002 54b2 0008 cb9a 0002
0000050 54ee 0008 8a13 0002 5520 0008 8001 0002
0000060 5688 0008 94ff 0002 56c4 0008 deb7 0002
0000070 56f6 0008 0000 0002 57e6 0008 05f6 0002
0000080 5822 0008 0f85 0002 585e 0008 14fb 0002
0000090 589a 0008 0081 0002 58d6 0008 edbc 0002
00000a0 5912 0008 a560 0002 5944 0008 8e2b 0002

こんな感じでダンプされました。
プロポの入力を調整すると変化するので、USBからの入力をRaspberryPiが受け付けているようです。
Donkeyを起動したときに、「Device name: Arduino LLC Arduino Micro」と表示されているので、それが読めるようにプログラムの書き換えが必要なのかな?

困ったときの人頼み

TechShopで走行会を主催している有山さんが、大急ぎで記事を書いてくれました。

まさしくやりたいことそのものです。
私が参考にすべきは、DonkeyCarのJOYSTICK設定のプログラムを書き換えるところなので、その3を参考にしてDonkeyCarの側を変更します。
いろいろありましたが、これを参考に組み上げると、プロポの入力でDonkeyCarの操作ができるようになりました。

スロットルをニュートラルにすると、学習データを保存しない

操作ができて終わりというわけにはいきませんでした。
何か挙動が違います。
今までF710を使って操作していた時は、
「スロットルを動かすと学習データの収集を開始。終了するまで収集する」
JumperT16で操作すると、
「スロットルを動かすと学習データの収集を開始。スロットルをニュートラルに入れると、学習データの収集を停止する」という動きになっています。
学習データの収集は自動運転の肝ですので、そこの挙動が変わるようでは大変まずい気がします。
しかし、よく考えてみれば、「スロットルを動かしたら学習データを収集し続ける」という仕様についても、「そういう動きをしている」以上の理解はしてませんでした。

学習データを収集する条件はなにか?

controller.pyを詳しく見てみることにします。

def on_throttle_changes(self):
       '''
       turn on recording when non zero throttle in the user mode.
       '''
       if self.auto_record_on_throttle:
           self.recording = (abs(self.throttle) > self.dead_zone and self.mode == 'user')

しっかりコメントが書いてありますね。
作者の意図は、
「user modeで、スロットルが0でないとき、記録をONする」
なるほど、
スロットルとステアリングはセットで学習するので、ステアリングだけ切っても、スロットルが0の時の学習をせずに済みます。
スロットル0を覚えてもいいことはなさそうです。
(摩擦が大きいと止まってしまう。速度が上がらない。など)
お手軽に使えるF710でしたが、実装者の意図に反して、スロットル0の学習をしていたのかもしれません。
そう考えると、dead_zoneも大きな意味を持ちます。
ある程度の数値を入れておけば、速度が低い領域の学習データが発生しないので、遅すぎる入力を学習しなくて済みます。
慎重に学習した挙句、ステアリングは切れるけどスロットルが回らないという状況を回避できます。
myconfig.pyでJOYSTICK_DEADZONEに妥当な数値を入れておけば、低い速度を学習しない=高い速度を保てる、という効果も期待できます。

スロットルの数値を確認してみる

テスト中。

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