ROS2 + Nav2でRealsense使ったとき

症状

Nav2でLocalcostmapだけなぜか更新が止まる(最初から出ないわけではなく,1回から数回更新されるものの止まる).

Local Costmap not update

解決策

OSのRecive Bufferサイズを大きくする!

原因調査

ROS2 GalacticでNav2を使用して移動体を制御したく色々やってきたところ,なぜか,RealsesneのDepthのPointcloudをつかってLocalCostmapを作ると更新が止まるという現象にぶつかった.

よくある実装と違うところは,
Jetson使ってる関係でROS2 Galactic
Costmap作るのに,GlobalはシングルラインLIDAR,LocalはRealsense(D455)を使っている点.

いろいろ調べてみると,同じような現象にぶつかっている例がちらほら

  • 未解決

https://answers.ros.org/question/404402/local-costmap-not-updating-in-nav2/

  • シミュレータなのにUse_simtimeがFalse

https://github.com/ros-planning/navigation2/issues/3034

  • 設定ミス

https://answers.ros.org/question/366732/no-local-costmap/

  • ミドルウエアのFastDDS(FastRTPS)の問題だからCycloneDDSに変更せよ

https://forums.developer.nvidia.com/t/local-cost-map-is-not-displayed-on-rviz-in-navigation2-tutorial-in-isaac-ros-mission-client-library/242220/7

の大体4パターンがあるようでした.

でFastDDSの問題を指摘しているパターンが一番多かったのですが,GalacticはCycloneDDSがデフォルトなので,それもない.

  • ROS2でよくあるQoS設定違い?かと思い,色々試す→ 変わらず
  • 解像度高すぎて処理負荷が高すぎる?と思い,Realsenseの解像度を変えたり,Nav2の更新レートを落としたり → 変わらず

と色々やってみたのですがどれも最初数回LocalCostmapが更新されて止まったり,1回だけ更新されて止まったり,を繰り返していました.でもなぜか,LocalCostmapをシングルラインLiDARに変えた時はちゃんと動き続けてる...特にエラーも出ないし,完全な壁にぶつかってしまったのですが,ふと情報システムでのトラブルがおきるといえば,送信元,受信先,通信路という3つある,というのを「情報」の講義資料を作っていて思い出しました.そうか通信路...

そこで,CycloneDDSを色々調べてみるとありましたよ.こんな素敵な記述が.

Performance recommendations

With large samples (100s of kilobytes), excessive latency can be caused by running out of space in the OS-level receive buffer. For this reason, on Linux, we recommend increasing the buffer size:

  • Temporarily (until reboot): sudo sysctl -w net.core.rmem_max=8388608 net.core.rmem_default=8388608
  • Permanently: echo "net.core.rmem_max=8388608\nnet.core.rmem_default=8388608\n" | sudo tee /etc/sysctl.d/60-cyclonedds.conf
https://github.com/ros2/rmw_cyclonedds/tree/galactic

Depth画像はそれなりに大きいし,今後のことも考えて,と思って,このコマンド通りにBufferサイズを大きくしてみたら...

LocalCostmapが更新され続けてる!
トイレに行ってもコンビニに行っても更新されてる!やはり大事なのは基礎!教養!

というわけで解決!

Leave a comment