症状
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に変更せよ
の大体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:
https://github.com/ros2/rmw_cyclonedds/tree/galactic
- 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
Depth画像はそれなりに大きいし,今後のことも考えて,と思って,このコマンド通りにBufferサイズを大きくしてみたら...
LocalCostmapが更新され続けてる!
トイレに行ってもコンビニに行っても更新されてる!やはり大事なのは基礎!教養!
というわけで解決!