🚗

JetBot + Zao SDK を活用した自動運転と遠隔監視の実現(準備編)

2024/03/25に公開

はじめに 🌟

Zao SDK スターターキット上で、PyTorch を利用してラジコンカーの自動運転と Zao Cloud View からの遠隔監視でラジコンカーの自動運転停止・再開を実現する方法を3部構成で紹介していきます。

本記事は3部構成の一部です。

  1. 準備編 (本記事)
  2. 実践編1
  3. 実践編2

本記事の内容は、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