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 SLAM と Isaac 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 Segmentation、Isaac ROS DNN Inference、Isaac 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>