先端技術部テクノロジーリサーチグループの渡邊です。
テクノロジーリサーチグループでは、今期から「インダストリアルメタバース」に関する技術調査を行っており、NVIDIAのオープンソースAIロボットJetBotを使って以下のような検証を計画しています。
- AIを使った自律移動
- デジタルツインによる可視化
- デジタルツインによるシミュレーション
前回の記事(AIロボット「JetBot」を組み立てる - JBS Tech Blog)では、ハードウェアの組み立てを紹介いたしました。
今回は公式のソフトウェアをインストールし、AIモデルによるロボットの動作確認を行います。JetBotの公式リポジトリは約2年更新されておらず、2024年2月に動かすにはやや工夫が必要でした。
Jetson Nanoのセットアップ
まずはJetson NanoのOSであるJetPackをインストールします。ただし、基本的に公式サイトの手順に従うだけですので、ここでは詳しい説明は割愛します。基本的な手順は次の通りです。
- microSDカードにJetPackイメージを書き込む(今回はJetPack SDK 4.5.1を使用しました)
- イメージを書き込んだmicroSDカードをJetson Nanoに挿入する
- micro USBから電源を供給し、Jetson Nanoを起動する
- マウス、キーボード、ディスプレイ、Wi-Fiドングルを接続し、GUIでセットアップを進める
- Wi-Fiの設定を行ってネットワークに接続する
jetbotソフトウェアのセットアップ
JetPack+Docker Containerを使う方法でjetbotのソフトウェアを動かします。セットアップは公式の手順に従います。
公式JetBotリポジトリをクローンします。
git clone http://github.com/NVIDIA-AI-IOT/jetbot.git
設定スクリプトの実行
設定スクリプトとスワップ有効化スクリプトを実行し、電源モードなどのパラメータを変更します。
cd jetbot ./scripts/configure_jetson.sh ./scripts/enable_swap.sh
またこのスクリプトはDRAM消費を抑制するため、GUIを無効化します。GUIを使いたい場合は以下のコマンドでGUIを再有効化します。
sudo systemctl set-default graphical.target
コンテナの有効化
JetBotのDockerコンテナを有効化します。
cd docker ./enable.sh $HOME # we'll use home directory as working directory, set this as you please.
動かない
しかし、以下のようなエラーが出てDockerコンテナは起動しませんでした。
JETBOT_BASE_IMAGE not found for 32.7.4. Please manually set the JETBOT_BASE_IMAGE environment variable. (ie: export JETBOT_BASE_IMAGE=...) JETBOT_VERSION=0.4.3 L4T_VERSION=32.7.4 JETBOT_BASE_IMAGE= Restarting docker daemon ... Synchronizing state of docker.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable docker Unable to find image 'jetbot/jetbot:display-0.4.3-32.7.4' locally docker: Error response from daemon: manifest for jetbot/jetbot:display-0.4.3-32.7.4 not found: manifest unknown: manifest unknown. See 'docker run --help'. Unable to find image 'jetbot/jetbot:jupyter-0.4.3-32.7.4' locally docker: Error response from daemon: manifest for jetbot/jetbot:jupyter-0.4.3-32.7.4 not found: manifest unknown: manifest unknown. See 'docker run --help'.
コンテナのビルド
どうやらJetPack SDK 4.5.1に対応したイメージが用意されていないようです。
以下のコマンドでイメージをビルドします。
source configure.sh ./build.sh
ビルドに失敗する
約2年間メンテされていないリポジトリということもあり、すんなりビルドが通りません。
docker/base/Dockerfileの以下の箇所を修正しました。
protobufのバージョンを指定
最新版のprotobufではPython 3.6がサポートされていないようです。
33 RUN pip3 install future==0.17.1 mock==3.0.5 keras_preprocessing==1.0.5 keras_applications==1.0.8 gast==0.2.2 futures protobuf==3.19.4 pybind11 --verbose
packagingのインストールとsetuptoolsのupgrade
jupyterのインストール前の箇所に以下の二行を追記します。
83 RUN pip3 install packaging 84 RUN pip3 install --upgrade setuptools
再ビルドとコンテナの有効化
Dockerfileの修正が完了したら、再びビルドを実行し、Dockerコンテナを有効化します。
./build.sh ./enable.sh $HOME
Dockerコンテナが起動したら、https://{jetbot_ip}:8888 からJupyter Labに接続し、NotebookからJetBotを動かすためのコードを実行することができます。デフォルトパスワードは「jetbot」です。
JetBotを動かす
遠隔操作の実行
Jupyter LabからNotebooks/teleoperation/teleoperation.ipynbを開きます。Notebook内の指示に従い、各セルを実行して遠隔操作を実行します。
ソースコードの修正
私の場合はうまく動かすことができませんでした。
よく調べたところ、jetbot/robot.pyやmotor.pyで以下のコードを実行してモータードライバーの機種を判定しているようなのですが、空のリストが返ってくるために予期されている動作をしていないようでした。
addresses = qwiic.scan()
GitHubの履歴を調べると、これはSparkFunというサードパーティーのJetBotを動作させるために追加されたコードのようでした。今回はNVIDIAの公式インストラクションに従ったハードウェア構成にしているため、このコミットをリバートしてみることにしました。
動作確認
問題となっていたコミットをリバートしたところ、無事Teleoperationのコードが動くようになり、ハードウェアが問題なく動作していることを確認する事が出来ました。
また、Collision Avoidanceについても公式ガイドに付属している訓練済みモデルを配置することで、動かすことができました。
まとめ
JetBotの公式リポジトリのコードに手を加え、JetBotが正しく動作することが確認できました。同じようなトラブルを抱えた方の参考になれば幸いです。
今後はROS2によるJetBotの制御や、Isaac Sim等を使った合成データを用いたAIモデルのトレーニングなどに挑戦します。