背景
こちらの記事で作成したモデルをエッジデバイス上で動作可能にし、シミュレーション上での動作確認をすることで、エッジデバイスでのモデルの動作確認に加え、実環境では再現できないレアなケースや危険なケースでの動作確認が可能です.記事
各機能の連携をRosのトピックで扱うようにすれば、新しいセンサーが導入されても、Rosのトピックとして扱えるため、センサー専用に実装する必要がなくなります.ROS
艾萨克·西姆はいくつかのRosトピックのメッセージ送信をサポートしており、シミュレーション上のカメラ情報をRosトピックとして送信することができます.
この機能を利用して、エッジデバイスにRosメッセージとして送信して、エッジデバイスで動画解析が可能です.
また動画解析の結果はRosのトピックメッセージとして、エッジデバイスから送信可能です.
システム構成
同一ネットワーク内であれば、Rosのトピックはネットワーク経由で送付可能です.
Jetson Xavier NX、Jetpackは4.5.1で動作確認をしました。杰森にはディスプレイがついています。(今回使用するコードの制約でディスプレイなしでは動作しません.)
艾萨克·西姆2021.1.1を使用しています.
今回の環境はJetsonと工作站は局域网で繋がっています。
この構成にした理由として、假摄像机は簡単にリアルなカメラに置き換え可能であり、Rosのトピックで深流の結果を渡す方式にすることで、ロボットシステムとの統合が簡単になるためです。下図のようなイメージになります.
全体の動作の流れは下記です.
- 艾萨克·西姆·でシミュレーションを動作させて。Rosのカメラトピックを送信します
- ROSのカメラトピックを假摄像机経由で深流で動作します。
- DeepStreamにはRos用にパッケージ化されたオープンソースがあるので、それを使用します.深流のROSトピックによって物体検出結果と認識結果をROSトピック経由で取得します.
艾萨克·西姆
Isaac Simでros2を動作します.码头工人でIsaac Simを動作させます.sudoはdockerにsudoなしで動作する設定をしていれば必要ありません.
xhost +local:
での動作方法は下記リンクに記述してあります码头。
- https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/setup.html?highlight=docker#docker-container-deployment
こちらのブログで使用したアセットを指定します.ブログ
”omniverse://localhost/Isaac/Samples/Synthetic_Data/Stage/”のパス直下にあるUSDファイルを指定します.
ROS2の設定
窗口->Extensionをクリックします。
搜索部分にROSと入力するとROS网桥が確認できるのでROS网桥をオフにしてからROS2网桥をオンにします。
Rosカメラをシミュレーションに追加します
创建->艾萨克->ROS->Cameraを選択します。
右のStageにROS Cameraが追加されています。
これで▷の再生ボタンを押すとROS2 Cameraトピックが送信されます。
学習したモデルのファイルフォーマットを変換
こちらのブログで作成したモデルをJetsonなどの他のハードウェアで扱えるように変換します.ブログ
Keyを設定します。
export KEY=tlt_encode
下記コマンドでtltファイルフォーマットのモデルファイルをet ltのファイルフォーマットに変更します.
このファイルフォーマットにすることでJetsonなどの他のハードウェアで扱えるようになります.
tao detectnet_v2 export -m tlt-experiments/model_cardbox_pushcart/model.step-20640.tlt -o tlt-experiments/model_cardbox_pushcart_final/model.step-20640.etlt -k $KEY --data_type fp32 --batch_size 32 --max_batch_size 32 --verbose
下記のようにログを確認できます.输出ノード名も確認できます。このノード名はDeepStreamを動作する際に使用します.
2021–08–23 13:46:34,498 [INFO] root: Registry: [‘nvcr.io’]
学習したモデルを数据流用に変換
杰森上で作業をします。
Taoで学習したモデルをjetsonに持ってきてjetson用に変換します.今回、検証したモデルは量子化、枝刈り処理をしていないモデルを使用しています.
sftpやusbなど何らかの方法で先ほど変換したモデル(.etltフォーマットのモデル)をjetsonに持って来てください.
変換したモデル(.etltフォーマットのモデル)はJetson用に変換されていないので、陶氏转换器でJetson用に変換します.
このコマンドはJetpackのバージョンなどに依存するので、対応するバージョンをこちらで確認してダウンロードしてください。こちら
下記に一例を示します.数値精度はfp16でモデルを変換しています。
./tao-converter -d 3,800,1024 -k tlt_encode -t fp16 -p input_1,1x3x800x1024,1x3x800x1024,2x3x800x1024 -e ./model_cardbox_pushcart_final/model_fp16.plan ./model_cardbox_pushcart_final/model.step-20640.etlt
正常に動作すれば下記のようなログがでます.
[INFO]
使用したオプションの説明はこちらにあるので、モデルによって修正お願い致します.こちら
深流
このパートはJetsonで作業をします.
深流は動画解析に使用するソフトウェアです。利点に関してはこちらの記事で記述しています.記事
今回はこちらの記事で作成したモデルをDeepStreamで動作してシミュレーションの解析を行います.記事
假摄像机杰森(の設定ローカル)
ROSのカメラトピックを假摄像机に流すことで深流で解析できるようにします。
こちらのコードで假相机の設定を行います。こちら
下記設定を行っておきます.
sudo apt-get install -y v4l2loopback-dkms
他の設定はDOCKER上で行うため、DOCKERコンテナを作成します.
深流ROSの環境構築
注意:DeepStreamの動作の際にディスプレイが必要なのでDockerを動作する際はディスプレイがついているターミナルから動作する必要があります。
下記コードをクローンしてDockerファイルが存在するディレクトリに移動します.
git clone https://github.com/NVIDIA-AI-IOT/ros2_deepstream.git
下記のDockerファイルを修正します.
- https://github.com/NVIDIA-AI-IOT/ros2_deepstream/blob/main/docker/dockerfile.ros.eloquent.deepstream
ベースとなるコンテナのバージョンが古いので修正します.(2021年年9月時点)
修正前
修正後
Dockerfileのpycudaのインストール前後の部分を修正します.“#EXISTS LINES“の部分がもともと存在していた部分になります。
こちらの手順でDockerコンテナをビルドします.こちら
cd ros2_deepstream/docker
学習済みモデルを連携できるようにdockerを動作するdocker_run.shを修正します。
注意点:csiカメラもしくはusbカメラなどがすでについている場合は伪摄像头が/dev/Video0に、アサインされないので、もしカメラがついている場合はV4L2-ctl–List-Devicesコマンドで確認してから/dev/Video部分を修正してください。(SUDO APT-GET INSTALL v4l-utilsでインストールできます。)
虚拟视频设备が/dev/Video0にアサインされていることが確認できます。
v4l2-ctl--list-devices
先程変換したモデルファイルをここに下記コマンドで移動させておきます.
cd $HOME
下記コマンドでDockerを実行します.
cd ~/ros2_deepstream/docker/
ROS2カメラトピックのサブスクライブ
假相机用にコードを用意します。以下のコマンドはDocker内で動作します.
下記コマンドで修正用のディレクトリをコピーします.
cp -r single_stream_pkg single_stream_pkg_virtual_camera
下記ディレクトリに移動します.
cd single_stream_pkg_virtual_camera/
xmlの修正します。
修正前
修正後
下記コマンドでファイル名を修正します.
mv resource/single_stream_pkg resource/single_stream_pkg_virtual_camera
setup.cfgを修正します。
修正前
修正後
setup.pyを修正します。
修正前
修正後
修正前
修正後
下記コマンドでディレクトリ名を修正します.
mv single_stream_pkg single_stream_pkg_virtual_camera
使用しないPythonファイルを削除します.
rm single_stream_pkg_virtual_camera/single_stream*.py
下記コマンドで空のファイルを作成します.
touch single_stream_pkg_virtual_camera/single_stream_virtual_camera.py
“single_stream_pkg_virtual_camera/single_stream_virtual_camera.py”を修正して、Rosのカメラトピックを假摄像机に流すコードを作成します。
/DEV/Video0の部分は伪摄像头がアサインされている/DEV/VIDEOを設定してください
下記ディレクトリに移動します.
cd /dev_ws/
下記コマンドで假相机をビルドします。
colcon build
下記コマンドで假相机を動作します。
ros2 run single_stream_pkg_virtual_camera single_stream_virtual_camera
動作に成功した場合、下記のようにIsaac SimのROS2相机トピックをサブスクライブしている様子が分かります。サブスクライブができるまで若干時間がかかります.
[INFO] [minimal_subscriber]: I heard: (720, 1280, 3)
ROS2深流の修正
別ターミナルを開いて動作しているDockerプロセスにアクセスします.
坞站PSコマンドでコンテナIDを確認できます。sudoはdockerにsudoなしで動作する設定をしていれば必要ありません.
sudo docker ps
下記のように確認できるのでこのコンテナIDを使用します。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
下記コマンドでDockerにアクセスします.
sudo docker exec -it “コンテナID” bash
深流ラベルファイル
ラベルファイル“OBJECT_LABEL_ISAAC_SIM.txt”を作成します。
下記ラベル情報を追記して保存します.
echo “cardbox;pushcart” > /dev_ws/src/ros2_deepstream/config_files/object_labels_isaac_sim.txt
深流設定ファイル
”/workdir/model_cardbox_pushcart_final/dssd_labels.txt”を作成します.
各識別IDを文字列に変換するためのテキストファイルで内容は下記のようなテキストファイルになります。上からID順に記載されています。
設定ファイル“dstest1_pgie_config_isac_sim.txt”を作成します。
下記ファイルをコピーして修正します.
- https://github.com/NVIDIA-AI-IOT/ros2_deepstream/blob/main/config_files/dstest1_pgie_config.txt
cp /dev_ws/src/ros2_deepstream/config_files/dstest1_pgie_config.txt /dev_ws/src/ros2_deepstream/config_files/dstest1_pgie_config_isaac_sim.txt
“/dev_ws/src/ros2_deepstream/config_files/dstest1_pgie_config_isaac_sim.txt”のモデルとラベルファイルのパス部分を修正します.
修正前
修正後
キャリブレーションファイルの修正
キャリブレーションファイルの修正をします.
今回は接口8量子化をしていないので、コメントアウトします。
修正前
修正後
输出ノード名を修正します。TaoではOutputノード名はet ltファイルフォーマットに変換する際に下記のようにログが出るので、確認できます.TAO
2021–08–23 04:46:41,100 [INFO] iva.common.export.keras_exporter: Using input nodes: [‘input_1’]
修正前
修正後
Isaac Simのシミュレーションを深流で分析
下記のコードをベースに修正します.
- https://github.com/NVIDIA-AI-IOT/ros2_deepstream/blob/main/single_stream_pkg/single_stream_pkg/single_stream_class.py
下記部分を修正してラベルファイルを読み込めるようにします.
- https://github.com/NVIDIA-AI-IOT/ros2_deepstream/blob/bc642536161b155298effc877886c8914085f9b5/single_stream_pkg/single_stream_pkg/single_stream_class.py#L54
“/dev_ws/src/ros2_deepstream/single_stream_pkg/single_stream_pkg/single_stream_class.py”を修正します.
先程、作成したラベルファイル“OBJECT_LABEL_ISAAC_SIM.txt”を読み込むように修正します。
修正前
修正後
同様に、作成した設定ファイル“dstest1_pgie_config_isac_sim.txt”を読み込むように修正します。
- https://github.com/NVIDIA-AI-IOT/ros2_deepstream/blob/bc642536161b155298effc877886c8914085f9b5/single_stream_pkg/single_stream_pkg/single_stream_class.py#L331
修正前
修正後
下記コマンドでビルドします.
cd /dev_ws
下記コマンドで单流を動作します
ros2 run single_stream_pkg single_stream — ros-args -p input_source:=”/dev/video0"
下記のようにDeepStreamでの分析結果が確認できます.分类と对象检测用の画面が2つ表示されますが、下記のように結果が確認できるのは对象检测用の画面になります。
分析結果はRosのトピックで送信されています.
ワークステーション側でRosのトピックをサブスクライブします.
下記の文档文件を作成し、ビルドを行います。
下記コマンドでDockerをビルドします.sudoは码头にsudoなしで動作する設定をしていれば必要ありません
sudo docker build -f Dockerfile -t ros2_deepstream_ws .
下記コマンドでDockerコンテナにアクセスします.
sudo docker run — rm — net=host -it ros2_deepstream_ws:latest bash
Rosのトピックをサブスクライブします
mkdir -p ~/ros2_example_ws/src
上手く動作すれば下記のようにログが確認できます.
[vision_msgs.msg.Detection2D(header=std_msgs.msg.Header(stamp=builtin_interfaces.msg.Time(sec=0, nanosec=0), frame_id=’’), results=[vision_msgs.msg.ObjectHypothesisWithPose(id=’cardbox’, score=0.4701283872127533, pose=geometry_msgs.msg.PoseWithCovariance(pose=geometry_msgs.msg.Pose(position=geometry_msgs.msg.Point(x=0.0, y=0.0, z=0.0), orientation=geometry_msgs.msg.Quaternion(x=0.0, y=0.0, z=0.0, w=1.0)), covariance=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
これでTAO工具包で学習したモデルをJetson上のDeepStreamで解析した結果をROSのトピックで送信、受信することができました.
艾萨克·西姆とDeepStreamを活用して他のシーンでも適用して頂けると幸いです。
原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2021/10/09/isaac-sim%e3%81%a8%e6%b7%b1%e6%b5%81%e3%82%92ros%e9%80%a3%e6%90%ba%e3%81%a7%e3%81%a4%e3%81%aa%e3%81%92%e3%81%a6%e5%88%86%e6%9e%90%e3%82%92%e8%a1%8c%e3%81%86-2/