Isaac SimでNvbloxを動かす
Nvbloxとはロボットからのセンサ情報を使用して3D空間をリアルタイムで再構築することのできるパッケージです。ここではCarterロボを使用して倉庫環境をrviz上に再構成しています。このNvbloxパッケージは最低限Depthカメラと自己位置(センサ姿勢)情報があれば動かすことができます。なお、自己位置推定にはnavigation2パッケージを使用します。
Nvbloxについて
もともとNvidiaが提供しているNvbloxというものがあって、それをIsaac Simで使用できるようにしたものが以下のものです。
こちらが本体になります。
Nvbloxをビルドする
Nvbloxとその関連パッケージをビルドします。ビルドは例によってdocker内で行います。このあたりの手順はここと共通ですので適宜自身の環境に合わせてください。
まずは必要なパッケージをgithubよりcloneしてきます。
$ mkdir -p ~/workspaces/isaac_ros-dev/catkin_ws_ros2/src
$ cd ~/workspaces/isaac_ros-dev/catkin_ws_ros2/src
$ git clone --recurse-submodules https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_common.git
$ cd ~/workspaces/isaac_ros-dev/catkin_ws_ros2/src
$ git clone --recurse-submodules https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_nvblox.git
$ cd isaac_ros_nvblox
$ git lfs pull
dockerを起動します。引数を指定しなければ、~/workspeces/isaac_ros-dev/
がdocker内にマウントされます。
$ ~/workspaces/isaac_ros-dev/ros_ws/src/isaac_ros_common/scripts/run_dev.sh
docker内で以下のコマンドを実行してNvbloxをビルドします。
$ cd /workspaces/isaac_ros-dev/catkin_ws_ros2
$ rosdep install -i -r --from-paths src --rosdistro foxy -y --skip-keys "libopencv-dev libopencv-contrib-dev libopencv-imgproc-dev python-opencv python3-opencv"
$ colcon build --packages-up-to nvblox_nav2 nvblox_ros nvblox_msgs nvblox_rviz_plugin
実行してみる
端末を2つ使用します。1つはIsaac Sim起動用で、もう1つはdocker起動用です。
まず最初の端末で以下のコマンドを実行し、Isaac Simを起動します(Isaac Simのインストール先などは各自環境に合わせてください)。起動すると倉庫内にcarterロボが配置された環境が読み込まれます。
$ cd ~/.local/share/ov/pkg/isaac_sim-2021.2.1
$ ./python.sh ~/workspaces/isaac_ros-dev/ros_ws/src/isaac_ros_nvblox/nvblox_isaac_sim/omniverse_scripts/carter_warehouse.py
Isaac Simが起動したところ
もう一方の端末でNvbloxを起動するためのdockerを起動します。ですが、通常通り起動するとこの後で実行するコマンドでエラーになってしまうところがあるので、Dockerfileの一部を修正します。具体的には、Nvbloxを起動する際に、同時にROS2のNavigation2パッケージも起動するのですが、Navigation2パッケージが見つからないというエラーが発生するのでdocker起動時にインストールするようにします。
該当するファイルはisaac_ros_common/docker/Dockerfile.x86_64.base
で以下に示すROS2インストール部分にNavigation2を追加します。
…
RUN apt-get update && apt-get install -y \
python3-colcon-common-extensions \
python3-rosdep \
python3-vcstool \
ros-foxy-camera-calibration-parsers \
ros-foxy-camera-info-manager \
ros-foxy-desktop \
ros-foxy-launch-testing-ament-cmake \
ros-foxy-rqt* \
ros-foxy-turtlesim \
ros-foxy-v4l2-camera \
ros-foxy-realsense2-camera \
ros-foxy-vision-msgs \
ros-foxy-pcl-conversions \
ros-foxy-sensor-msgs-py \
ros-foxy-stereo-image-proc \
ros-foxy-pcl-ros \
ros-foxy-navigation2 \ ←追加
ros-foxy-nav2-bringup \ ←追加
&& rm -rf /var/lib/apt/lists/*
…
ビルド時同様、dockerを起動します。
$ ~/workspaces/isaac_ros-dev/catkin_ws_ros2/src/isaac_ros_common/scripts/run_dev.sh
docker内でNvbloxとnavigation2を起動します。
$ source /workspace/isaac_ros-dev/catkin_ws_ros2/install/setup.bash
$ ros2 launch nvblox_nav2 carter_sim.launch.py
コマンドを実行するとrviz2が起動します。
起動直後の状態
navigation2が起動しているので"2D Goal Pose"でロボットを動かすことができます。
"2D Goal Pose"を選択して移動させたい場所を指定
ロボットが移動すると、それに伴ってrviz2内の空間が拡張されていきます(再構成)。
空間内を塗りつぶしていくイメージ
一通り動かした結果
備考
ちなみにこれを実験したのは5月上旬だったのですが、どうも4月の後半にnvidiaのPGPキーの更新があったみたいです。このため、古いキーを使用していた場合、docker起動時にpgpのエラーが発生し必要なパッケージがインストールされません(該当エラーのforum投稿)。
解決するには、isaac_ros_common/docker/Dockerfile.x86_64.baseに以下の行を追加します(上記Navigation2を追加した際に同時に追加しました)。
RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub
まとめ
今回はNvbloxを使用してIsaac Sim内の空間を再構成してみましたが、再構成したものをどのように使用するかはよくわかりませんでした。rviz上で表示されているmeshをSDFファイルなどに変換できると便利だと思うのですが…(もしかしたらできるのかもしれませんがよく調べていません)。
Discussion