見出し画像

D-Robotics RDK X3 入門 (12) - Line Following

「RDK X3」の「Line Following」についてまとめました。

Application Development Guide - Line Following


前回

1. Line Following

Line Following」タスクとは、ロボットカーがガイドラインに沿って自律的に前進する能力を指します。ガイドラインが左に曲がると、車も左に曲がります。ガイドラインが右に曲がると、車もそれに応じて右に曲がります。

このタスクは車輪付きロボットの基本的なタスクであり、次のような方法で実装できます。

・複数の光電センサー (グレースケールセンサー) を設置し、その戻り値に基づいてセンサーがライン上にあるかどうかを判断し、それに応じてロボットの移動方向を調整。
・カメラを使用して、エッジ検出などの従来の画像処理方法に基づいて画像内の線の位置を取得し、ロボットの移動方向を調整。

上記の方法では、照明条件や環境の変化があった場合に良好な認識結果を得るために、画像収集、しきい値調整、テストを繰り返す必要があります。

そこで今回は、「CNN」(畳み込みニューラルネットワーク) を使用して、「Line Following」タスクのガイドラインの位置を認識します。「CNN」は、優れた適応性と堅牢性を備えた、深層学習アルゴリズムの1つです。これによって、手動でしきい値を調整することなく、ロボットを環境の変化に適応させることができます。

2. サポート

・プラットフォーム

・RDK X3
・RDK X3 Module

・システム

・Ubuntu 20.04 (Foxy)
・Ubuntu 22.04 (Humble)

・機能
MIPIカメラを起動して画像をキャプチャし、ガイドラインの検出と車の制御を実行し、最後に実際の車の動きを通してライン追従効果を実証。

3. 前準備

3-1. RDK X3 での前準備

(1) Ubuntu 20.04/22.04 に D-Robotics RDK とをインストール。
(2) TogetheROS.Bot をインストール。
(3) MIPI または USB カメラは D-Robotics RDK をインストール。

3-2. PC での前準備

(4) PC を「D-Robotics RDK」と同じネットワークセグメントに接続。
(5) PC に次の環境をインストール。

・Foxy
(1) Ubuntu 20.04 および ROS2 Foxy Desktop Full
(2) OEパッケージ のアルゴリズムツールチェーン。

wget -c ftp://vrftp.horizon.ai/Open_Explorer_gcc_9.3.0/2.3.3/horizon_xj3_open_explorer_v2.3.3_20220727.tar.gz

(3) Docker のアルゴリズムツールチェーン。

wget -c ftp://vrftp.horizon.ai/Open_Explorer_gcc_9.3.0/2.3.3/x3pi_toolchain/ai_toolchain_2.3.3.tar.gz

(4) プロジェクトソースコード。

https://github.com/D-Robotics/line_follower/tree/develop

・Humble
(1) Ubuntu 22.04 および ROS2 Humble Desktop Full
(2) OEパッケージ のアルゴリズムツールチェーン。

wget -c ftp://vrftp.horizon.ai/Open_Explorer_gcc_9.3.0/2.3.3/horizon_xj3_open_explorer_v2.3.3_20220727.tar.gz

(3) Docker のアルゴリズムツールチェーン。

wget -c ftp://vrftp.horizon.ai/Open_Explorer_gcc_9.3.0/2.3.3/x3pi_toolchain/ai_toolchain_2.3.3.tar.gz

(4) プロジェクトソースコード。

https://github.com/D-Robotics/line_follower/tree/develop

4. 使い方

4-1. D-Robotics RDK

OriginBotキットは、2つのアクティブホイールと1つのパッシブホイールを備えた車です。車の回転制御は、2つのアクティブホイールの速度差によって実現されます。MCUモジュールは主に車のモーター制御に使用され、シリアル通信を介してメイン制御ボード「D-Robotics RDK」と通信します。

OriginBotのWebサイト

上図に示すように、「D-Robotics RDK」はカメラを通じて車の前方の環境データを取得します。画像データは学習済みのCNNモデルによって処理され、誘導線の座標を推測します。次に、特定の制御戦略に基づいて、車の動作モードが計算されます。動作制御命令はUARTを介して車に送信され、システム全体の閉ループ制御を実現します。

PCはデータの注釈付けと学習に使用されます。効率を向上させるために、「D-Robotics RDK」を使用して、イーサネット経由で注釈付け用の画像をPCに送信します。

4-2. 5つの主要ステップ

ソフトウェアエンジニアリングプロセス全体には、5つの主要ステップが含まれます。

・データの取得と注釈
タスクの目標に応じて対応するデータを取得し、モデルの学習用に注釈を付けます。
・モデルの選択
タスクの目標に基づいて適切なモデルを選択し、性能と精度の両方を確保します。
・モデルの学習
注釈付きデータを使用してモデルを学習し、十分な精度要件を達成します。
・モデルの変換
アルゴリズムツールチェーンを使用して、学習済みの浮動小数点モデルを「D-Robotics RDK」で実行できる固定小数点モデルに変換します。
・モデルのデプロイ
変換したモデルを「D-Robotics RDK」で実行し、認識結果を取得してロボットの動作を制御します。

4-3. データの取得と注釈

モデルの学習には、データの収集と注釈付けが不可欠です。ここでは、「tros.b」の「hobot_sensor」が提供する MIPI カメラ画像取得機能とデバイス間通信機能を利用して、PC上に簡単なデータ収集および注釈付けシステムを構築します。データ収集および注釈付けシステムのワークフローは次のとおりです。「tros.b」の「sensors」が提供するMIPIカメラ画像取得機能とデバイス間通信機能を使用して、PC上に簡単なデータ収集および注釈付けシステムを構築します。データ収集および注釈付けシステムのワークフローは次のとおりです。

「D-Robotics RDK」上で、「mipi_cam」を起動します。選択したカメラモジュールはF37、出力画像フォーマットは解像度 960x544 の BGR8 です。通信方法は non-zero copy です。

・Foxy

# Configure the tros.b environment
source /opt/tros/setup.bash
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
ros2 launch mipi_cam mipi_cam.launch.py mipi_out_format:=bgr8 mipi_io_method:=mmap

・Humble

# Configure the tros.b environment
source /opt/tros/humble/setup.bash
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
ros2 launch mipi_cam mipi_cam.launch.py mipi_out_format:=bgr8 mipi_io_method:=mmap


PC上で実行します。

・Foxy

source  /opt/ros/foxy/setup.bash
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
# Build line_follower_model, go to the line_follower_model directory
colcon build --packages-select line_follower_model
# Load the compiled line_follower_model
source install/setup.bash
# Run the annotation program on the PC
ros2 run line_follower_model annotation

・Humble

source  /opt/ros/humble/setup.bash
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
# Build line_follower_model, go to the line_follower_model directory
colcon build --packages-select line_follower_model
# Load the compiled line_follower_model
source install/setup.bash
# Run the annotation program on the PC
ros2 run line_follower_model annotation

マウスの右ボタンを使用して、画像中央の黒いガイドラインの中心をクリックし、ターゲットポイントをマークします。 Enterを押すと、プログラムはラベル付け結果とともに画像を自動的にimage_datasetフォルダに保存します。画像の名前は xy_[x座標][y座標][uuid].jpg で、uuidはファイル名の重複を避けるための画像の一意の識別子です。上記のデータ収集と注釈付けの方法に従って、後続のモデルの学習のために、できれば少なくとも100枚の画像など、一定量のデータを収集します。環境や場所に変化があったときにも、対応する画像を収集して、モデルの適応性を向上させることができます。

4-4. モデルの選択

モデルの成熟度、モデルを学習するための CPU/GPU のハードウェア要件を考慮して「ResNet」を選択しています。「ResNet」(Residual Neural Network) は、Kaiming He、Xiangyu Zhang、Shaoqing Ren、Jian Sun などの Microsoft Research Institute の研究者によって提案されました。2015年の ILSVRC (ImageNet Large Scale Visual Recognition Challenge) で優勝しました。「ResNet」は、ショートカット接続を巧みに使用して、深層学習におけるモデル劣化の問題を解決します。これは、最も広く使用されているCNN特徴抽出ネットワークの1つです。「ResNet18」の構造は次のとおりです。

「D-Robotics RDK」では、「ResNet18」は最大232FPSの高い推論性能を持ち、「ResNet50」は100FPSを超える推論性能を持っています。高いフレームレートは、データ処理のリアルタイム性を保証します。これは、車両速度の向上や将来的により複雑なアプリケーションの実装に必要な条件です。ここでは、最初は「ResNet18」を使用し、ボトルネックが発生した場合は、後でより深い「ResNet50」を検討します。ガイドライン座標xとyの出力を満たすために、「ResNet18」のFC出力を、ガイドラインのx座標とy座標を直接出力する2に変更する必要があります。「ResNet18」の入力解像度は224x224です。ここで選択した学習フレームワークは、人気のPyTorchです。ここではCPU版のPyTorchがインストールされていますが、ハードウェアにGPUカードがある場合は、GPU版のPyTorchを使用できます。インストールコマンドは次のとおりです。

pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cpu

開発用PC は、次の仕様の通常のノートPCです。

・CPU : Intel i5-7260U
・DDR : 8G
・OS : Ubuntu 20.04

4-5. モデルの学習

コードは、「line_follower/line_follower_model/line_follower_model/training_member_function.py」にあります。

PC上で実行します。

・Foxy

source  /opt/ros/foxy/setup.bash
# Compile line_follower_model and enter the line_follower_model directory
colcon build --packages-select line_follower_model
# Load the compiled line_follower_model
source install/setup.bash
# Run the PC-side annotation program
ros2 run line_follower_model training

・Humble

source  /opt/ros/humble/setup.bash
# Compile line_follower_model and enter the line_follower_model directory
colcon build --packages-select line_follower_model
# Load the compiled line_follower_model
source install/setup.bash
# Run the PC-side annotation program
ros2 run line_follower_model training

4-6. モデルの変換

PyTorchで学習して得られた浮動小数点モデルをそのまま「D-Robotics RDK」上で実行すると効率が低くなります。実行効率を向上し、BPUの5Tの演算能力を活用するためには、浮動小数点モデルを固定小数点モデルに変換する必要があります。

(1) PyTorch モデルからONNXモデルを生成。
PC上で実行します。

ros2 run line_follower_model generate_onnx

実行後、現在のディレクトリに best_line_follower_model_xy.onnx モデルを生成します。

(2) 浮動小数点モデルから固定小数点モデルを生成。
コードは「line_follower/10_model_convert」にあります。
OEパッケージのディレクトリ構造は次のとおりです。

.
├── bsp
│   └── X3J3-Img-PL2.2-V1.1.0-20220324.tgz
├── ddk
│   ├── package
│   ├── samples
│   └── tools
├── doc
│   ├── cn
│   ├── ddk_doc
│   └── en
├── release_note-CN.txt
├── release_note-EN.txt
├── run_docker.sh
└── tools
    ├── 0A_CP210x_USB2UART_Driver.zip
    ├── 0A_PL2302-USB-to-Serial-Comm-Port.zip
    ├── 0A_PL2303-M_LogoDriver_Setup_v202_20200527.zip
    ├── 0B_hbupdate_burn_secure-key1.zip
    ├── 0B_hbupdate_linux_cli_v1.1.tgz
    ├── 0B_hbupdate_linux_gui_v1.1.tgz
    ├── 0B_hbupdate_mac_v1.0.5.app.tar.gz
    └── 0B_hbupdate_win64_v1.1.zip

プロジェクトから「10_model-convert」をアルゴリズムツールチェーン OE パッケージ「ddk/samples/ai_toolchain/horizo​​n_model-convert_sample/03_classification/directory」にコピーします。

アルゴリズムツールチェーン「docker」をロードし、OEパッケージのルート ディレクトリで実行します。

sh run_docker.sh /data/

キャリブレーションデータを生成します。このステップで生成されたキャリブレーションデータは、主にモデル コンパイルの次のステップでのキャリブレーションに使用されます。学習のモデルデータの一部は、標準が正しい限り特別な要件なしで使用できます。数量は100枚程度にする必要があります。

cd ddk/samples/ai_toolchain/horizon_model_convert_sample/03_classification/10_model_convert/mapper
sh 02_preprocess.sh

モデルをコンパイルします。このステップでは固定小数点モデルが生成されます。

# Execute in the docker
cd ddk/samples/ai_toolchain/horizon_model_convert_sample/03_classification/10_model_convert/mapper
sh 03_build.sh

4-7. モデルのデプロイ

モデル変換により、「D-Robotics RDK」の「BPU」で実行できる固定小数点モデルを取得しました。これを「D-Robotics RDK」に展開して、画像取得、モデル推論、モーション制御の完全な機能を実現するにはどうすればよいでしょうか。ここでは、「tros.b」の「hobot_dnn」実装を利用します。「hobot_dnn」は、「tros.b」ソフトウェアスタックのボードエンドアルゴリズム推論フレームワークであり、「D-Robotics RDK」の「BPU」を使用してアルゴリズム推論機能を実装します。モデル管理、モデル記述に基づく入力処理と出力解析、モデル出力メモリの割り当てと管理など、ロボットアプリケーション開発のためのシンプルで使いやすいモデル統合および開発インターフェイスを提供します。

必要なインターフェイスを実装するには、「DnnNode」を継承します。ここでは、パブリック継承が使用され、実装する必要があるインターフェイスは次のとおりです。

・SetNodePara() : モデルパスやモデル名などのモデルパラメータを設定するために使用。
・SetOutputParser() : モデル推論出力を解析するために使用。
・PostProcess(const std::shared_ptr<DnnNodeOutput> &outputs) : 結果のさらなる後処理に使用。

コードについては「line_follower/line_follower_perception/src/line_follower_perception.cpp」を参照してください。

「line_follower_perception」フォルダとコンパイルされた固定小数点モデルをボードにコピーして実行します。

・Foxy

# Configure the tros.b environment
source /opt/tros/setup.bash
# Execute in the line_follower_perception folder path,the branch of x3 verison is feature-x3, and the branch of x5 verison is feature-x5. Please pull the corresponding branch according to the device model for compilation
colcon build --packages-select line_follower_perception

コンパイルが完了したら、パラメータ model_path と model_name を使用してモデルパスと名前を指定します。

source install/setup.bash
ros2 run line_follower_perception line_follower_perception --ros-args -p model_path:=./resnet18_224x224_nv12.bin -p model_name:=resnet18_224x224_nv12 &

・Humble

# Configure the tros.b environment
source /opt/tros/humble/setup.bash
# Execute in the line_follower_perception folder path,the branch of x3 verison is feature-x3, and the branch of x5 verison is feature-x5. Please pull the corresponding branch according to the device model for compilation
colcon build --packages-select line_follower_perception

コンパイルが完了したら、パラメータ model_path と model_name を使用してモデルパスと名前を指定します。

source install/setup.bash
ros2 run line_follower_perception line_follower_perception --ros-args -p model_path:=./resnet18_224x224_nv12.bin -p model_name:=resnet18_224x224_nv12 &


MIPIカメラを実行します。

・Foxy

# Configure the tros.b environment
source /opt/tros/setup.bash
ros2 launch mipi_cam mipi_cam.launch.py &

最後に、車のモーションコントロール パッケージに入り、 originbot_base を実行します。

source install/setup.bash
ros2 run originbot_base originbot_base

・Humble

# Configure the tros.b environment
source /opt/tros/humble/setup.bash
ros2 launch mipi_cam mipi_cam.launch.py &

最後に、車のモーションコントロール パッケージに入り、 originbot_base を実行します。

source install/setup.bash
ros2 run originbot_base originbot_base


車は動きに沿ってラインをスタートします。



いいなと思ったら応援しよう!