2023年9月3日日曜日

microrosのdockerのagentで発生するNotEnoughMemoryExceptionはコンテナ更新で解決することがある


背景

microrosとはros2でマイコンと通信する環境を提供してくれるミドルウェアです。
ubuntu22.04でrollingを動かしてESP32にWiFi経由で接続を試みたところエラーが出て対応に時間を取られましたが、マイコンと通信するコンテナを更新したら解決ました。
エラーと関連情報を備忘録として記事に残します。

問題: NotEnoughMemoryExceptionが出る

下記コマンド実行後にros2 topic listで一覧表示しようとするとagentで下記のエラーが発生しました。
docker run -it --rm -v /dev:/dev -v /dev/shm:/dev/shm --privileged --net=host microros/micro-ros-agent:$ROS_DISTRO udp4 --port 8888
terminate called after throwing an instance of 'eprosima::fastcdr::exception::NotEnoughMemoryException'
what(): Not enough memory in the buffer stream
[ros2run]: Aborted

対応: コンテナが古かったので更新

いろいろ試したところ、dockerのコンテナが14ヶ月前のものでubuntuにインストールされているrollingと齟齬が発生しているのが原因でした。
ということで下記コマンドでpullしなおしたコンテナを使えばエラー無く動きました。
docker pull microros/micro-ros-agent:$ROS_DISTRO

1.7GBのコンテナが更新後は502MBと容量削減されていました。
なお、microrosのコンテナは各distributionの最新版だけがダウンロード可能なようで、container idがea344502d8afの古いコンテナは再ダウンロードできないため不具合再現は不能でした。
(hashの省略版でないsha256を確保していればダウンロードできるのかもしれませんが、それを確認せず更新したので後の祭りです。)

おわり

半年前の記事のコードでもエラーが発生して戸惑いましたが、ビルドしたagentだと問題なく動いたのでコンテナが古いのではないかと疑い更新したら見事動きました。
半日ほど時間を取られましたが問題を解決できて良かったです。

参考

rollingでは解決済みの問題ですが、過去にはNotEnoughMemoryExceptionが発生する別の問題があったようです。
ROS2でFast-DDSの設定を変更する

microrosのgithubページに情報が無かったので、NotEnoughMemoryExceptionについて言及しているページにコメントを残しました
QoS / middleware configuration: modifying buffer stream size #23

0 件のコメント :