JetBot + Zao SDK を活用した自動運転と遠隔監視の実現(準備編)
はじめに 🌟
Zao SDK スターターキット上で、PyTorch を利用してラジコンカーの自動運転と Zao Cloud View からの遠隔監視でラジコンカーの自動運転停止・再開を実現する方法を3部構成で紹介していきます。
本記事は3部構成の一部です。
本記事の内容は、Linux の基本操作、Docker の使用方法、Jupyter Notebook の操作に慣れている読者を対象にしています。必要な場合はご自身で追加の情報を検索してみてください。
対象バージョン
2024-03-21時点で Zao SDK バージョン 1.1.0 からの Zao SDK スターターキット に適用可能です。
Zao SDK バージョンが 1.0.0 の場合は、こちらの手順を参考にして Zao SDK スターターキットのバージョンアップを行ってください。
1: MIPI カメラの取り付け 📷
Pytorch での自動運転に使用するカメラとして、MIPI カメラを Zao SDK スターターキットに接続します。ここで説明する MIPI カメラの型番は、Leopard LI-IMX219-MIPI-FF-NANO-H136 V1.3 です。
一旦、Zao SDK スターターキットの電源を OFF して、下図のように MIPI カメラをスターターキットのラジコンカー上の Jetson Nano に取り付けます。この時、MIPI カメラの FFC ケーブルのラベルが Jetson Nano のヒートシンク側になるように取り付けます。
Jetson Nano では MIPI カメラを接続できるポートが 2 つあり、どちらのポートに MIPI カメラを接続しても問題ありません。ここではシャーシと USB カメラへ干渉しないように、電源コネクタがある側のポートに MIPI カメラの FFC ケーブルを取り付けています。
MIPI カメラを下図のようにフレームに固定します。
付属のカメラフレームを使って、ラジコンカーのシャーシの下側にホットグルーで取り付けました。
2: ROM 化の解除 ⚙
Zao SDK スターターキットの Jetson Nano をカスタマイズするためには、ROM 化を解除する必要があります。起動後に Zao SDK スターターキット上で以下のコマンドで設定画面に入り、指示に従って ROM 化を解除した後、システムを再起動してください。
sudo ZaoSetting
ROM 化を解除した場合、実行中に電源が落ちると SD カードを破損する可能性があるため、電源を切断する場合は以下のコマンドで終了してください。
sudo poweroff
3: MIPI カメラの色調整 🌈
Zao SDK スターターキットを起動後、MIPI カメラの映像の色調整や確認については、こちらの手順を参考にして設定を行ってください。
4: ビデオソースの設定 📹
MIPI カメラと USB カメラを接続した場合、デバイスの割り当てが、 /dev/video0 に MIPI カメラ、/dev/video1 に USB カメラとなります。
MIPI カメラを PyTorch 用に、USB カメラを Zao SDK 用に設定する必要があります。
Zao SDK の Video 設定で、Zao SDK 用のカメラを USB カメラ( /dev/video1 )となるように変更します。
設定画面からビデオソースの設定を行います。
以下のコマンドで設定画面を起動して、
sudo ZaoSetting
Video 設定画面に入ります。
Configure VideoSourceWebcam (Active) の画面を選択後、Device を選択して /dev/video1 を入力します。
設定が完了したらシステムを再起動して、USB カメラからの映像を Zao Cloud View に映像転送できているかを確認してください。
5: スターターキットの Jetson Nano への SSH 接続方法 🌐
JetBot は移動ロボットなので、ネットワーク経由でアクセスする必要があります。
こちらの記事を参考にして、PC からスターターキットの Jetson Nano に SSH で接続しましょう。
ssh jetson@jetson.local
初期パスワードは「jetson」です。
6: スターターキットのリモートコントロールプログラムを停止 🛑
スターターキットはデフォルトでリモートコントロールプログラムが起動しています。これを以下のコマンドで停止してください。
sudo systemctl disable zao-sdk-starter-kit-car.service
7: Jetbot レポジトリをクローン 🤖
NVIDIA の GitHub から JetBot レポジトリをクローンします。このレポジトリには JetBot の基本的なコントロールコードが含まれています。
以下のコマンドを ZaoSDK スターターキットの Jetson Nano 上で実行してください。
cd ~
git clone http://github.com/NVIDIA-AI-IOT/jetbot.git
8: Docker コンテナの準備 🐳
PyTorch と JetBot 用の Docker イメージを準備します。
以下の内容の Dockerfile を Jetson Nano 上で作成します。
FROM nvcr.io/nvidia/l4t-pytorch:r32.7.1-pth1.10-py3
RUN sed -i '/apt\.kitware\.com/s/^/#/' /etc/apt/sources.list
RUN install -m 755 -d /etc/apt/keyrings \
&& wget -nv -P /etc/apt/keyrings https://repo.download.nvidia.com/jetson/jetson-ota-public.asc \
&& echo 'deb [signed-by=/etc/apt/keyrings/jetson-ota-public.asc] https://repo.download.nvidia.com/jetson/common r32.7 main' \
> /etc/apt/sources.list.d/nvidia-l4t-apt-source.list
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
libssl1.0-dev supervisor unzip zip \
gstreamer1.0-x gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio \
python3-gst-1.0 python3-smbus \
npm \
libopencv-python \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN npm install -y -g n \
&& n 12
RUN pip3 install --upgrade pip \
&& pip3 install --no-cache-dir \
sparkfun-qwiic==1.1.6 sparkfun-qwiic-i2c==0.9.11 \
Adafruit_MotorHat Adafruit-SSD1306 \
pyserial pyzmq
RUN pip3 install jupyter jupyterlab==2.2.6 --verbose
RUN pip3 install --no-cache-dir ipywidgets \
&& jupyter labextension install @jupyter-widgets/jupyterlab-manager
# jupyter clickable image widget
RUN git clone https://github.com/jaybdub/jupyter_clickable_image_widget -b v0.1 --depth 1 -c advice.detachedHead=false \
&& cd jupyter_clickable_image_widget \
&& pip3 install --no-cache-dir -e . \
&& jupyter labextension install js
RUN jupyter lab build
ENV PYTHONPATH="${PYTHONPATH}:/jetbot"
WORKDIR /jetbot
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--allow-root"]
次に以下のコマンドを実行して Docker イメージを作成します。
ここで作成する Docker イメージは「zao_sdk_jetbot」となります。
Docker イメージの作成には、30分ほど時間がかかります。
sudo docker build -t zao_sdk_jetbot .
9: Docker コンテナを起動
起動コマンドが少し長くなるため、起動用のスクリプトを作成します。
run_docker.sh ファイルを Jetson Nano 上で作成し、以下のテキストを貼り付けます。
#!/bin/bash
docker run -it --rm \
--runtime nvidia \
--network host \
--privileged \
-v /home/jetson/jetbot:/jetbot \
--volume /dev/bus/usb:/dev/bus/usb \
--volume /tmp/argus_socket:/tmp/argus_socket \
--volume /run/zao/ttyZAOV1:/run/zao/ttyZAOV1 \
--device=/dev/i2c-1 \
--device=/dev/video* \
--device=/run/zao/ttyZAOV1 \
zao_sdk_jetbot
実行権限をつけます。
chmod +x run_docker.sh
以下のコマンドを Jetson Nano 上で実行して Docker を起動します。
sudo ./run_docker.sh
10: JupyterNote を起動 🗒
Docker が起動すると、「http://jetson:8888/lab?token=xxxxxx」 のような URL が表示されるます。表示された URL を token を含めて全てコピーします。
上記のコピーした URL の「jetson:8888」を「jetson.local:8888」と変更して、操作している PC 上のブラウザで開いてください。
ブラウザが下図のような表示となります。
11: JetBot の動作確認 🚜
まずは JupyterNote から JetBot をコントロールできるか確認してみましょう。
ブラウザ上の /notebook/basic_motion/basic_motion.ipynb を選択して開きます
ブラウザ上に表示された画面内で Shift + Enter キーを押下して、上からセルを順に実行していき、ラジコンカーのモーターが動作することを確認してください。
終わりに
本記事では、Zao SDK スターターキット上で Pytorch を利用してラジコンカーを動かすまでの説明を行いました。この環境を利用して、自動運転の実現と遠隔での監視、操作を実現していくことができるようになります。
続いて、自動運転の実現については「実践編1」の記事で説明します。
Discussion