Simulation / Modeling / Design

Isaac ROS Nvblox と Realsense を活用した実環境でのコスト マップ作成

Reading Time: 4 minutes

Isaac ROS Nvblox の仕組み

詳細については、「Isaac ROS Nvblox と Isaac Sim を活用したシミュレーション環境でのコスト マップ作成」をご覧ください。本ブログでは Isaac ROS Nvblox と Real Sense を連携する方法をご紹介します。

システム要件

v0.30.0-dp のバージョンを対象として検証しています。

使用するハードウェアとソフトウェアの要件は下記リンクになります。

対応している Realsense は D455 と D435i になります。

Realsense camera Firmware のバージョンは 5.13.0.50 にしてください。

Realsense セットアップ

下記のリンク先の Realsense の動作はサポートされています。

librealsense” のソース コードをクローンします。udev rules を適用します。一時的に Real sense カメラは外しておいてください。

# Clone source code from Real Sense & Isaac ROS Github.
# Here is the expected source tree.
#   tmp/
#       |-librealsense/


cd /tmp && \
git clone https://github.com/IntelRealSense/librealsense && \
cd librealsense && \
./scripts/setup_udev_rules.sh

isaac_ros_common” と “realsense-ros” の 4.51.1 のソース コードをクローンします。

# Clone source code from Real Sense & Isaac ROS Github.
# Here is the expected source tree.
#   ~/workspaces/isaac_ros-dev/src/
#       |-isaac_ros_common/
#       |-realsense-ros/


mkdir -p ~/workspaces/isaac_ros-dev/src/
cd ~/workspaces/isaac_ros-dev/src/
git clone -b v0.30.0-dp --recurse-submodules https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_common 
git clone https://github.com/IntelRealSense/realsense-ros.git -b 4.51.1

Docker コンテナーを起動する前に Realsense を接続します。
librealsense” を含めてコンテナーでビルドするように設定するため、isaac_common/scripts ディレクトリに .isaac_common-config ファイルを作成します。

# Configure the container created by isaac_ros_common/scripts/run_dev.sh to include librealsense. Create the .isaac_ros_common-config file in the isaac_ros_common/scripts directory:

export ISAAC_ROS_WS=$HOME/workspaces/isaac_ros-dev/
cd ${ISAAC_ROS_WS}/src/isaac_ros_common/scripts && \
  touch .isaac_ros_common-config && \
  echo CONFIG_IMAGE_KEY=ros2_humble.realsense > .isaac_ros_common-config

Docker コンテナーを Launch します。これにより、Dockerfile.realsense を使用したコンテナー イメージが、そのレイヤー ステージの 1 つとして再ビルドされます。再ビルド時には若干の時間がかかります。

# Launch the Docker container

export ISAAC_ROS_WS=$HOME/workspaces/isaac_ros-dev/
cd ${ISAAC_ROS_WS}/src/isaac_ros_common && \
  ./scripts/run_dev.sh ${ISAAC_ROS_WS}

コンテナー イメージが再ビルドされ、コンテナー内に入ったら、realsense-viewer を実行して、Realsense カメラが接続されていることを確認します。

# Once container image is rebuilt and you are inside the container, you can run realsense-viewer to check that the RealSense camera is connected.

realsense-viewer

3D と Streo Module を選択して、Realsenseが動作していることを確認します。

Host system setup

ROS 2 のメッセージ配信は、QoS プロファイルを少し修正しないと、高負荷時に信頼性が低いことが分かっています。 (特にスペックが低いマシン)。そのため以下を実行してください。

sudo sysctl -w net.core.rmem_max=8388608 net.core.rmem_default=8388608

しかし、上記コマンドは一時的にこれらのパラメーターを設定するだけになります。恒久的に設定するには、以下を実行します:

echo -e "net.core.rmem_max=8388608\nnet.core.rmem_default=8388608\n" | sudo tee /etc/sysctl.d/60-cyclonedds.conf

Docker setup

Github ページから Isaac ROS のソース コードをクローンします。

# Clone source code from Isaac ROS Github.
# Here is the expected source tree.
#   ~/workspaces/isaac_ros-dev/src/
#       |-isaac_ros_common/
#       +-isaac_ros_nvblox/


mkdir -p ~/workspaces/isaac_ros-dev/src/
cd ~/workspaces/isaac_ros-dev/src/
git clone -b v0.30.0-dp --recurse-submodules https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_common.git
cd isaac_ros_common
git lfs pull

# Clone source code
cd ~/workspaces/isaac_ros-dev/src/

# use ‘v0.30.0-dp’ branch instead of ‘main(default)’.
git clone -b v0.30.0-dp --recurse-submodules https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_nvblox
cd isaac_ros_nvblox
git lfs pull

realsense_splitter パッケージの COLCON_IGNORE ファイルの git トラッキングを停止し、削除します。

cd ~/workspaces/isaac_ros-dev/src/isaac_ros_nvblox/nvblox_examples/realsense_splitter && \
  git update-index --assume-unchanged COLCON_IGNORE && \
  rm COLCON_IGNORE

Github ページから Isaac ROS Visual SLAMIsaac ROS NITROS のソース コードをクローンします。

# Clone source code from Isaac ROS Github.
# Here is the expected source tree.
#   ~/workspaces/isaac_ros-dev/src/
#       |-isaac_ros_common/
#       |-isaac_ros_nvblox/
#       |-isaac_ros_visual_slam/
#       +-isaac_ros_nitros/

cd ~/workspaces/isaac_ros-dev/src/
git clone -b v0.30.0-dp https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_visual_slam.git
cd isaac_ros_visual_slam
git lfs pull

# Clone source code
cd ~/workspaces/isaac_ros-dev/src/

# use ‘v0.30.0-dp’ branch instead of ‘main(default)’.
git clone -b v0.30.0-dp https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_nitros.git
cd isaac_ros_nitros
git lfs pull

ROS2 コンテナー イメージを Build/Run します。

# Build/Run a ROS2 container
cd ~/workspaces/isaac_ros-dev/src/isaac_ros_common/
./scripts/run_dev.sh

ROS2 コンテナーが起動したら、ROS2 ワークスペースに必要な ROS2 の依存関係をインストール/ビルドする必要があります。ビルドするのに 10 分程度かかります。Docker コンテナー内で以下のコマンドを入力します。

# Inside the container, install package-specific dependencies via rosdep:
cd /workspaces/isaac_ros-dev/ && \
  rosdep install -i -r --from-paths src --rosdistro humble -y --skip-keys "libopencv-dev libopencv-contrib-dev libopencv-imgproc-dev python-opencv python3-opencv nvblox"

# Install the dependencies for your ROS workspace
cd /workspaces/isaac_ros-dev

# Build code
colcon build --symlink-install

# Source the ros_ws
source /workspaces/isaac_ros-dev/install/setup.bash

Realsense Nvblox

Example with Realsense Live Data のために、ROS2 コンテナー内に 2 つのターミナルが必要になる場合があります。各ターミナルに以下のコマンドを入力してください。

Terminal 1~4:

# Build/Run a ROS2 container
# if you haven’t built a ROS2 container image, the script may take some time to build a container image.
cd ~/workspaces/isaac_ros-dev/src/isaac_ros_common/
./scripts/run_dev.sh

ROS2 のコンテナー ターミナルを 2 つ開くと、ターミナル 1~2 で上記コマンドで Docker コンテナーに入って下記コマンドを入力できるようになります。

Terminal 1:  realsense-viewer を実行して、Realsense カメラが接続されていることを確認することができます。

cd /workspaces/isaac_ros-dev/
source /workspaces/isaac_ros-dev/install/setup.bash
realsense-viewer

Terminal 2: realsense-viewer の起動が成功したら、realsense-viewer を閉じて起動ファイルを実行し、サンプルをスピンアップします。

cd /workspaces/isaac_ros-dev/
source /workspaces/isaac_ros-dev/install/setup.bash
ros2 launch nvblox_examples_bringup realsense_example.launch.py

Human Reconstruction with Realsense

このチュートリアルでは、nvblox で realsense データを使ってダイナミックな人物再構成を行う方法を説明します。もし、Human Reconstruction が裏でどのように機能しているかを知りたい場合は、技術的な詳細を参照してください。(Note: 終了時に Docker コンテナー ターミナルを閉じないこと)

  • Rviz ウィンドウを閉じます。
  • ターミナル 2 の終了コマンド (ctrl + c)
  • ターミナル 1 の終了コマンド (ctrl + c)

Github ページから Isaac ROS Image SegmentationIsaac ROS DNN InferenceIsaac ROS Image Pipelineの コードをクローンします。

# Clone source code from Isaac ROS Github.
# Here is the expected source tree.
#   ~/workspaces/isaac_ros-dev/src/
#       |-isaac_ros_common/
#       |-isaac_ros_nvblox/
#       |-isaac_ros_visual_slam/
#       |-isaac_ros_nitros/
#       |-isaac_ros_image_segmentation/
#       |-isaac_ros_dnn_inference/
#       +-isaac_ros_image_pipeline/

mkdir -p ~/workspaces/isaac_ros-dev/src/
cd ~/workspaces/isaac_ros-dev/src/
git clone -b v0.30.0-dp https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_image_segmentation
cd isaac_ros_image_segmentation
git lfs pull

# Change directory
cd ~/workspaces/isaac_ros-dev/src/

# use ‘v0.30.0-dp’ branch instead of ‘main(default)’.
git clone -b v0.30.0-dp https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_dnn_inference.git
cd isaac_ros_dnn_inference
git lfs pull

# Change directory
cd ~/workspaces/isaac_ros-dev/src/

# use ‘v0.30.0-dp’ branch instead of ‘main(default)’.
git clone -b v0.30.0-dp https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_image_pipeline.git
cd isaac_ros_image_pipeline
git lfs pull

ROS2 コンテナー イメージを Build/Run します。

# Build/Run a ROS2 container
cd ~/workspaces/isaac_ros-dev/src/isaac_ros_common/
./scripts/run_dev.sh

Docker コンテナー内で以下のコマンドを入力します。PeopleSemSegNet ETLT ファイルと int8 推論モード キャッシュ ファイルをダウンロードしてください

mkdir -p /workspaces/isaac_ros-dev/models/peoplesemsegnet/1
cd /workspaces/isaac_ros-dev/models/peoplesemsegnet
wget 'https://api.ngc.nvidia.com/v2/models/nvidia/tao/peoplesemsegnet/versions/deployable_quantized_vanilla_unet_v2.0/files/peoplesemsegnet_vanilla_unet_dynamic_etlt_int8.cache'
wget 'https://api.ngc.nvidia.com/v2/models/nvidia/tao/peoplesemsegnet/versions/deployable_quantized_vanilla_unet_v2.0/files/peoplesemsegnet_vanilla_unet_dynamic_etlt_int8_fp16.etlt'

ETLT ファイルを TensorRT のプラン ファイルに変換します。構築環境によりますが、8 分程度時間がかかります。

/opt/nvidia/tao/tao-converter -k tlt_encode -d 3,544,960 -p input_1:0,1x3x544x960,1x3x544x960,1x3x544x960 -t int8 -c peoplesemsegnet_vanilla_unet_dynamic_etlt_int8.cache -e /workspaces/isaac_ros-dev/models/peoplesemsegnet/1/model.plan -o argmax_1 peoplesemsegnet_vanilla_unet_dynamic_etlt_int8_fp16.etlt

以下の内容で、/workspaces/isaac_ros-dev/models/peoplesemsegnet/config.pbtxt という triton 設定ファイルを作成してください:

name: "peoplesemsegnet"
platform: "tensorrt_plan"
max_batch_size: 0
input [
  {
    name: "input_1:0"
    data_type: TYPE_FP32
    dims: [ 1, 3, 544, 960 ]
  }
]
output [
  {
    name: "argmax_1"
    data_type: TYPE_INT32
    dims: [ 1, 544, 960, 1 ]
  }
]
version_policy: {
  specific {
    versions: [ 1 ]
  }
}

ROS2 コンテナーが起動したら、ROS2 ワークスペースに必要な ROS2 の依存関係をインストール/ビルドする必要があります。Docker コンテナー内で以下のコマンドを入力します。

# Install the dependencies for your ROS workspace
cd /workspaces/isaac_ros-dev

# Build code
colcon build --symlink-install

# Source the ros_ws
source /workspaces/isaac_ros-dev/install/setup.bash

Example with Realsense Live Data のために、Docker コンテナー内に 3~4 つのターミナルが必要になる場合があります。各ターミナルに以下のコマンドを入力してください。

Terminal 1~4:

# Build/Run a ROS2 container
# if you haven’t built a ROS2 container image, the script may take some time to build a container image.
cd ~/workspaces/isaac_ros-dev/src/isaac_ros_common/
./scripts/run_dev.sh

Docker のコンテナー ターミナルを 3 つ開くと、ターミナル 1~3 で上記コマンドでコンテナーに入って下記コマンドを入力できるようになります。

Terminal 1: 以下の launch ファイルを実行して、人物検出用の ROS ノードを起動させます

cd /workspaces/isaac_ros-dev/
source install/setup.bash
ros2 launch isaac_ros_unet isaac_ros_unet_triton.launch.py model_name:=peoplesemsegnet model_repository_paths:=['/workspaces/isaac_ros-dev/models'] input_binding_names:=['input_1:0'] output_binding_names:=['argmax_1'] network_output_type:='argmax'

Terminal 2: Realsense が起動するか確認します。3D と Streo Module を選択します。Realsense が動作しない場合は再起動をしてください。

cd /workspaces/isaac_ros-dev/
source install/setup.bash
realsense-viewer

Terminal 3: realsense-viewer の起動が成功したら、realsense-viewer を閉じて、RViz2 が立ち上がり、下記のような動作が確認できます。起動には時間がかかります。

cd /workspaces/isaac_ros-dev/
source install/setup.bash
ros2 launch nvblox_examples_bringup realsense_humans_example.launch.py

Realsense Recorded Data

以下の手順で、準備してください。

  • Rviz ウィンドウを閉じます。
  • Realsense Viewer を閉じます。
  • ターミナル 1 の終了コマンド (ctrl + c)
  • ターミナル 3 の終了コマンド (ctrl + c)

Terminal 1: 以下の launch ファイルを実行して、人物検出用の ROS ノードを起動させます。

cd /workspaces/isaac_ros-dev/
source install/setup.bash
ros2 launch isaac_ros_unet isaac_ros_unet_triton.launch.py model_name:=peoplesemsegnet model_repository_paths:=['/workspaces/isaac_ros-dev/models'] input_binding_names:=['input_1:0'] output_binding_names:=['argmax_1'] network_output_type:='argmax'

Terminal 2: Realsense から得られる入力を rosbag として保存処理をします。Realsense を動かして部屋の情報を rosbag として取得します。rosbag2_2023_05_10-10_38_34 のような形式で rosbag が保存されます。一定のデータを取得できたら [Ctrl + C] で終了します。

ros2 launch nvblox_examples_bringup record_realsense.launch.py

Terminal 3: 保存された rosbag から Nvblox 処理を行います。path_to_recorded_bag に先ほど保存した rosbag のパスを指定します。

ros2 launch nvblox_examples_bringup realsense_humans_example.launch.py from_bag:=True bag_path:=<path_to_recorded_bag>

Tags