Jetson NX Xavier で ROS2のRtabmapをビルドする
Jetson NX Xavier に JetPack5.x系で環境構築した場合、OSがUbuntu20.04になるので、ROS2環境構築時には「foxy」を選択する。
その上でROS2のWorkspace(ex. ~/ros2_ws)にrtabmapとrtabmap_rosのリポジトリをcloneするが、そのときに使うブランチは、rtabmap側はfoxy-develop、rtabmap_rosのほうは0.21.1-foxyにする。
そうすることで、rtabmap_rosのビルド時に要求されるrtabmapのライブラリのバージョンが合う。
rtabmap_rosのGithubのページに書かれているビルド方法でビルドしようとするが、途中でメモリ不足でOSがフリーズする。
export MAKEFLAGS="-j6"
となっているが、
export MAKEFLAGS="-j1"
にする必要があった。
Intel Realsense D455を使って、RGBDとしてrtabmapに取り込もうとするも、上記ビルド方法ではrgbdとしてうまく取り込んでくれない。
なので、一旦、librealsenseをGithubに書いてあるJetsonでビルドする方式を参考に BUILD_WITH_CUDA=trueフラグを指定してビルドし、また、realsense-rosをソースビルドする。
バージョンは両方とも0.21.1-foxyとした。
その上で、rtabmapとrtabmap-rosをソースビルドのものを使うのを諦め、パッケージインストールのものを使うことにする。
sudo apt install ros-foxy-rtabmap ros-foxy-rtabmap-*
その上で、rtabmap_rosに含まれているrtabmap_demos/launch/turtlebot3_rgbd_sync.launch.py を参考に、gazebo上のturtlebot3(waffle)を起動、かつ、rtabmap.launch.pyを上記launch.pyファイルのヘッダコメント部を参考に実行してみる。
注意点として、ヘッダ部には model.sdfを編集して、カメラの定義をRGBDにしなければならない。
実行コマンドのサンプルは以下のものを使用。まずはgazeboを起動
$ export TURTLEBOT3_MODEL=waffle
$ ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
次にrtabmapを起動
ros2 launch rtabmap_launch rtabmap.launch.py visual_odometry:=false frame_id:=base_footprint subscribe_scan:=true approx_sync:=true approx_rgbd_sync:=false odom_topic:=/odom args:="-d --RGBD/NeighborLinkRefining true --Reg/Strategy 1 --Reg/Force3DoF true --Grid/RangeMin 0.2" use_sim_time:=true rgbd_sync:=true rgb_topic:=/camera/image_raw depth_topic:=/camera/depth/image_raw camera_info_topic:=/camera/camera_info qos:=2
これで、rtabmapがエラーなくmapを生成してくれるのであれば、次は実機のD455を使うため、起動中のnodeを一旦全て停止する。
実機の場合Ralsense D455起動方法(D435系統も同じで動作するはず)
ros2 launch realsense2_camera rs_launch.py camera_name:=camera unite_imu_method:=linear_interpolation depth_width:=640 depth_height:=480 depth_fps:=30.0 color_width:=640 color_height:=480 color_fps:=30.0 enable_infra1:=false enable_infra2:=false enable_gyro:=true enable_accel:=true linear_accel_cov:=1.0 initial_reset:=true align_depth:=true enable_sync:=true
rtabmapは次のようにして起動する。gazebo用の起動コマンドとは違うパラメータがあるので注意。
具体的には、LiDARがないので、subscribe_scan:=false。
odom_topicは実機の台車があれば、そのままで良い。(但しない場合は、visual_odometry:=trueにする必要あり。)
実環境になるので、use_sim_time:=falseとすること。
Realsenseの場合は、カメラトピックが変わるので、適宜修正する。
/camera/image_raw -> /camera/color/image_raw
/camera/depth/image_raw -> /camera/depth/image_rect_raw
/camera/camera_info -> /camera/color/camera_info
frame_id:=base_footprintについては、動かそうとするロボット環境に依存して変更する必要あり。urdfやxacroを使っていなければ、直接camera_linkに繋いでも良いかもしれない(検証していない)つまり、frame_id:=camera_link とする。(もしくは、tfでbase_footprintとcamera_linkを繋ぐ)
Intel Realsense D455起動用launchファイルにはalign_depth:=true指定しているので、/camera/aligned_depth_to_color/image_raw トピックがpublishされているが、今回のrtabmap側がsubscribeしているdepthトピックは/camera/depth/image_rawにしているため、実質使っていない。
余分なトピックをpublishしているのかもしれないので、ここは後日検証することにする。
Rtabmapがpublishしているmapトピックについて。デフォルトのlaunchファイルで起動すると、/rtabmap/mapとなるため、これをrelayし、Nav2パッケージがsubscribeしている/mapトピックにしたいと考えたが、foxyにはtopic_toolsパッケージが存在せず、うまくremapが効かない。
Nav2側の設定を書き換えることも検討したが、デフォルトの設定からの変更箇所が多いため、rtabmap側の起動時に、namespaceを「なし」にするとことで、そもそもpublishするトピックを/mapにすることで解決することにした。
launchの起動パラメータに
namespace:=/
を指定することでnamespaceを「なし」にすることができた。