Translate

2021年1月27日水曜日

Donkeycar V4.1.0 のデータセット構成を調べる

 Donkeycar の github 上の master ブランチが 4.1.0 になった。


V4はでていたが、masterブランチは3.1.xのままだったので、V4についてはとくに調べることをせずに放置していたのだが..ひさしぶりにインストールしようとしたら..エラー乱発..それでmasterブランチがV4にマージされたことを知った。

Discordにもはいっていたが、やたらPCから音が出るのでアンインストールしていたので、アナウンスが多分あったのだとは思うが、知らなかった。

 V4で何が変わったかというと、一番がTubデータの構造だ。

V3までのTubデータはトップディレクトリdataの下にtub_<1からの連番>_YY-MM-DDというサブディレクトリが運転を実行するたびに作成されこの下に1レコードにつきJSONファイル1つとJPEGファイルが1つ作成されるという構成だった。

V3の構造で最も問題になっていたのが、トレーニング処理がレコード件数に比例して時間がかかるというもの。

1レコード2ファイルのI/O処理がはいるこの構造は、正直機械学習向きではない。とはいえDonkeycarの機械学習モデルはせいぜいが5層で深層学習と言えるほど深くない。ためしていないが数理最適化アルゴリズムのほうがよいかもな..とも思えるくらいの小規模モデルだ。なのでトレーニング時間はそれほど長くはないので、これでも問題なく利用されていた。

また、手動走行中にミスが有りデータを削除する場合、連番に飛びが発生するが、そのままではトレーニング処理でエラーが出てしまうという問題もあった。どうしてもクラッシュしたデータレコードを削除したくなると、歯抜けのTubデータになってしまい、連番をつけなおすスクリプトを作って対処していた。

どうもこれらの問題を解決するためにV4ではdatastore自体を見直したようだ。

で、ソースコードをよんだり、実際にデータを出力させてみた結果、以下の構造をしていることがわかってきた。


 

V3でJSONファイルになっていた数値データは、Catalogファイルに格納される。Catalogファイルは、デフォルト1000レコードごとに切り出されており、Catalogファイルとしての連番がつくようになっている(1000件未満の場合は1ファイルになる)。

 Catalogファイルが複数になる場合があるため、各Catalogファイルに対応したマニフェストファイルが作られている。この中にはCatalogファイルの先頭レコードがレコード連番の南蛮から始まるかや、1行のバイト長リストなどがはいっている。いわばCatalogファイルごとのメタ情報が入っているファイルだ。バイト帳リストは、コード内でランダムアクセス操作をするために使われている(詳細はSeekableクラスを参照してもらえばわかる)。 Catalogマニフェストファイルといえばいいのかな。

そして複数のCatalogファイルをまたいだメタ情報をまとめたのがmanifest.jsonというファイル。ここに入力データのラベルリストや型リストが入っている。また削除対象のインデックス番号リストを格納できるようになっており、ここに削除したいレコードのインデックスをリスト形式で書いておけば削除したものとみなして処理してくれる仕様だ。

 上記のファイルのI/O操作はdatastore_v2.pyにかかれている。Seekableクラスもここに格納されている。

 V3のデータをコンバートするツールも提供されているので、これまでの学習データが無駄になることはないが、ひと手間確実に面倒になることに注意。

 また、Donkeycar上で、python manage.py drive を複数回実行すると、V3の頃はdataの下にサブディレクトリができるが、V4ではインデックス番号はつづきからふられるため、分離できないことも注意が必要だ。dataディレクトリを削除してしまうか移動させておかないと各レコードの_created_atで調整しなくてはならなくなる。

 

 

p.s.

運転する際は、Tubデータを書き込むだけなので、ここまでの内容を理解していれば問題はない。

しかしもし機械学習モデルの入力データ項目にIMU情報はその他の情報をくわえたり、出力データ項目を増やしてモータ数を増やそうとしている場合は、機械学習モデルにデータセットとして渡す処理donkey.parts.pipelineパッケージ以下のコードを理解する必要がある。


2021年1月26日火曜日

Donkeycar の Mobile App を試す

Donkeycarの公式ドキュメントに Mobile App というセクションが増えていた。

Donkeycar: Mobile App
http://docs.donkeycar.com/guide/mobile_app/


OSSであるDonkeycarをそのまま使う場合、PCやRaspberry Pi上でpythonをコマンドラインで動かす必要があったが、このスマホアプリとDonkeycarのOSイメージを使うとそれが不要になるらしい。


ということで試してみた。

必要なものを準備

使用前提は、Raspberry Piに接続するモータドライバの種類がPCA9685もしくはRoboHAT MM1 のどちらかであることと、搭載しているマイクロコンピュータがRaspberry Pi4Bのみということだったので、昔Robocar Storeで購入した標準仕様のDonkeycarのRaspberry Pi3B+を4Bに取り替えて使った。

4Bのメモリサイズは書かれていなかった。2GBのものを使ったが今の所動作している。


他に必要なものはインターネットに接続できるWiFiルータ、SDカード書き込み可能なPC、それにAndroidもしくはAppleのスマートフォン。
F710 Wireless Gamepad も動作するが、なくてもアプリ上から操作が可能になっている。

RoboHAT MM1を使うと電源の電圧状況がアプリからチェックできるらしいが、持っていないので試していない。Raspberry Pi上に乗せるタイプのHAT基板なので初心者はこっちのほうがピンコネクタの接続に迷わなくてすむ。香港のRobocar Storeでもかえるが、スイッチサイエンスでもとりあつかっているようだ。


スイッチサイエンス:Robo HAT MM1
https://www.switch-science.com/catalog/6381/?gclid=CjwKCAiA9bmABhBbEiwASb35V_3CvCwUEIQk95rCpQly56jUx6-lM61jeg6__svzRFkDHcZJ3PwxZBoCvAoQAvD_BwE

あと余談だが、どうも自分の持っているバッテリがへたったのだとおもうが、4BになってしまったのでラジコンバッテリでのRaspberry Piの起動ができなくなっていた。のでスマホ用モバイルバッテリをくくりつけてそちらから給電させて動かした。

 


 

PCを使ってイメージをSDカードへ書き込みDonkeycarへさす(以降PC不要)


イメージをダウンロードしてきてEtcherなどでフォーマット済みのSDカード(自分は32GBを使った)へ書き込む。
wpa_supplicant.confの書き換えとかは不要だ。

なおF710を使いたい場合は、起動前にドングルを指しておくこと。

Donkeycarを起動して2分ほど待つ


初期セットアップがかかるのだとおもうが、まつようにドキュメントに書かれていた。Raspberry Piのランプが安定したら、スマホのWiFi設定画面で接続先として「donkey-<MACアドレス後半>」という名前が出てきたら準備完了だ。

スマホにRobocar Controllerをインストール


セットアップ中にApple Storeで「Robocar Controller」で検索すると、コミュニティロゴであるロバマークのついたアプリがあるのでこれをインストールする。

スマホのWiFi設定をSSID 「donkey-<MACアドレス後半>」 に変更


Donkeycarが起動すると本体がWiFiルータの接続ポイントのようにアクセスポイントが見えるようになる。初回の場合は、まずこれにつないでDonkeycarの設定を色々変更することになる。

アプリで初期設定をおこない反映させる


Robocar Controllerを起動すると初期設定画面がでてくるので、国をJapanに、コントローラタイプをPCA9685(もしくはMM1)に、ホスト名を適当に、WiFi設定をインターネットへ接続可能なSSIDに変更する。走行会の場合はホスト名とパスワードはかならず設定しておくこと。

ちなみにここでSSIDを変更しないでおくと、トレーニング処理を実行できない。ただ、手動運転までは可能なので、外につなぎたくないとか手動運転だけで遊びたい人はやらなくても良い(ただし、スマホはDonkeycar側につなぐので使用中はインターネット接続できなくなる)

 

アプリから一旦ぬけ、スマホのWiFi設定をDonkeycarに指定したSSIDと同じアクセスポイントに変更。

反映させると、ぐるぐる回る画面が永遠に続いてしまうので、アプリを早々にとじ、WiFi設定変更画面でSSIDを変更して、Donkeycarと同じセグメントのLANにつないでおく。




アプリを再度起動、先ほど指定したホスト名を選択


出てこない場合は何度かRefreshする。星をつけていても、ここで認識していないと接続することはできない。星は走行会でたくさんのDonkeycarが動いているとき自分の車かどうかを判別させるためだとおもう。

キャリブレーションを実行


標準Donkeycarの車体は意外とずれているので最初にしておく。ステアリングがフリー状態で中央にきていること、フルで右左にした時の状態はとくに綿密に設定する。
ステアリングも最大スピードがだせるかを確認する。走行会ではない場合はそれなりの速度しか出ないように設定してもいい。

よさそうなら保存する。

ドライブを選択し手動走行を実行


F710で操作したい場合は「Physical Joystick」を、スマホの場合は「Virtual Joystick」を選択する。

F710の場合は、前方カメラ画像は見ることができないが操作しやすい。ただ、走行会だと混線するのでVirtualを選択せざるを得ないかもしれない。

右上の白丸を押すとTubデータのレコーディングが開始される。ある程度慣れたら、レコーディングを開始して、学習データを収集する。



 

終了は左端のバツを押す。すると取得したデータの統計情報が表示される。データ自体はDonkeycar本体に保存される。削除したい場合はアプリから実行できる。


 

 1万件くらいで十分なのでとりあえず頑張って取得する。

トレーニングを実行


トレーニングアイコンを押すと何も出てこないので+を押してジョブを追加する。トレーニングジョブは、1日1車両5回までしかできない。Tubデータは複数選択可能だが、100MBまでという制約があるので注意。またトレーニング処理は最大15分までで強制終了になるため、そのあたりは気をつけて使用する。

15分ほど放置し、再度アプリに接続しトレーニングが終了していることを確認する。

Donkeycarを走行位置において、自動運転開始


トレーニングが完了したジョブを選択すると、AutoPilotが選択できるようになっているはずなので、これを押すと自動運転が開始される。

----


PCは最初のSDカードを作成するときだけしか使用しない。トレーニングはアプリ側が用意したAWSインスタンスを使用する。つまり無料だ(いまのところ?)。太っ腹ではあるが、複数同時にジョブキックされたらどうなるかとかは試していない。おそらく失敗になって再度キックしないとだめなんじゃないかとおもう。

4B前提ということなので、今から始める人は Robocar Store の Donkeycar S1 というモデルを選択することになるとおもう。こちらも試していないので、わからないが、おそらくMM1が搭載されているのではないだろうか。


たぶんこれを作ったのは、Pythonを知らなくてもDonkeycarを扱えるようにしたかったのだとおもう。独自のDonkeycarを作っている人はモータコントローラとRaspberryPiの種類に気をつければだいじょうぶだとおもう。


AWS Glueジョブ(Python/Spark)にPythonパッケージを追加する方法

 AWS Glueジョブには2つの種類が存在します。 ETLジョブ(Spark) PySparkコードが実行できるジョブ。 最低でも10並列で実行するので、DynamicFrame/DataFrame操作以外の処理はPython Shellジョブを使ったほうがよい。 Python...