自由課題

学んだり、考えたり、試したりしたこと。

Jetson Nanoで自律走行ラジコンを作る(2)

前回記事は以下。

Jetson Nanoで自律走行ラジコンを作る(1) - 自由課題

今回は、機内で収集したデータをGoogle Driveにアップロードするスクリプトを作成してみようと思う。今回はPythonで書く。

Google DriveにアクセスするためのAPIはDrive APIというらしく、APIの説明は以下にある。

developers.google.com

APIを使用したい場合はGCPのプロジェクトを作成していろいろな設定をする必要があるので、心を無にして言われた通りにする。クレデンシャル作成時にアプリケーションの種類を何となく"TVs and limited input device"にした*1

簡単な動作確認を行うためのスクリプトが用意されているので、これを実行する。

developers.google.com

上記を実行するには以下が必要だった。

$ sudo apt-get install python3-pip
$ pip3 install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

スクリプトを実行すると、Google Drive内のファイルが10個表示される。ここまで確認できたら、最終的には何かデータをアップロードするので、いろいろ調べながら適当なファイルをアップロードするスクリプトを書いてみる。以下の公式ドキュメントが参考になった*2

Upload file data  |  Google Drive API  |  Google Developers
google-api-python-client/media.md at master · googleapis/google-api-python-client · GitHub
API Documentation
https://googleapis.github.io/google-api-python-client/docs/dyn/drive_v3.files.html

ちなみに、Google DriveAPIを使用するためには単に自分のGoogleアカウントのパスワードを用意するだけではダメで、GCP上にアプリケーションを作成する必要があるのでちょっと面倒ではある。

いろいろドキュメントを読んだり実際の動作を確認したところによると、少なくともこの記事執筆時点では、ファイルのアップロード速度はそれほど速くなく複数ファイルをバッチアップロードする機能もないように見える。今回のケースでは秒間30個のファイル*3が生成されるので、訓練データの生成時にリアルタイムで各ファイルをGoogle Driveにアップロードするのは無理そうだ。何となく走行中リアルタイムにデータをアップロードするのを想像してテンションを上げていたので残念である*4

仕方がないので、訓練データを収集し終わった時点で一旦データをtarballにして、このファイルをアップロードすることにする。Google Drive側でフックを掛けるか学習スクリプト内で前処理するかしてデータを展開する予定である。

tarballを作成するのは標準のtarfileパッケージを使えばよい。Pythonにはこのような基本的なものはバンドルされているのでちょっとしたものを作りやすい。

スクリプトは以下にpushしてある。

github.com

今回の実装追加でデータフローは以下のようになった。

f:id:kimito_k:20210523141018p:plain

Jetson NanoにSSHで接続してスクリプトを実行してもよいのだが、実行するコマンドはいつも同じなのでゲームパッドのSELECTボタンを押すと実行されるようにした。
あまり考えていないが、おそらく手動走行と自律走行の切り替えは何らか必要なので無駄になることはない気がする。

ということで、数分間自宅のリビングを適当に走行させて5500セットくらいの訓練データを収集・アップロードした。画像(360x240)は1枚20〜30KB程度で、展開後のデータサイズは総計200MB程度のようだった。

うまくいくか分からないが、次回はいよいよモデルを作り始めてみる。

*1:合っているかは不明

*2:ドキュメントがあまり整理されていないようで情報を見つけるのに正直かなり苦労した

*3:15FPSで1フレームごとにJPEGと制御データのファイルを作成する

*4:おそらくIoT関連のクラウドサービスを使用するようにすれば実現できそうだが、それはそれで多少手がかかりそうなので気が向いたらやってみることにする