えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

サクッとデバッグしたい時に使える "ros2 topic echo" テクニックまとめ

みなさんは、 ros2 topic echo をしていますか?

めっちゃしていますよね?なんならprintデバッグの代わり使ってますよね!(?)


そんな ros2 topic echo ですが、いくつかオプションがあり、結構これだけでデバッグが完結したりします。

--help で表示すればすぐに分かるのですが、そもそも発想から抜け落ちていつもsubscriberを書いてしまうのでメモします。

意外とこれ言及している人少ない気がする…


動作環境

  • ROS 2 Humble (Ubuntu22.04)
  • turtlesim_node

turltesim_nodeから出る /turtle1/pose を表示しています。

デフォルト表示


1. --csv

これのために記事を書いていると言っても過言ではないですが、めっちゃ使えます。

ros2 topic echo /turtle1/pose --csv

やっていることはとても単純で、本来yamlライクな出力になっているものをcsvに直してsubscribeします。

これの大変便利なところとして、csvとして保存がすぐできるというところがあります。

ros2 topic echo /turtle1/pose --csv > output.csv

を実行するだけでcsvファイルが完成します。

2. --raw

バイナリに直してくれます。ただし、文字列として出力されるので注意。

--raw オプションは、--csv オプションと組み合わせられます。

3. --field

これもとても使い勝手が良いオプションです。 トピック内容の一部だけ取得できます。

複数選択はできないようで、最後に指定されたフィールドが出力されます。

ros2 topic echo /turtle1/pose --field x

csvオプションもつけられます。

4. --filter

ちょっとトリッキーな使い方になりますが、--filter というオプションもあります。

これは、元々ROS 1にあったオプションですが、Humbleになってようやく実装されたものです。

ros2 topic echo /turtle1/pose --filter 'abs(m.x-5.5)<2'

上の式でやっていることは、データの内のxフィールドに対して5.5を引いた後の絶対値が2より小さい時真(出力)としています。

これをcsvとしてグラフに出力すると以下のようになります。

グラフでは、x軸220付近と560付近で一気にCとDに値が飛んでいます。Bの値(xフィールド)が一定値以上ではカットされていることも分かります。


使い方は、 --filter <filter対象のPython式> で、Pythonの条件式が真になったら出力するというものです。

タイムスタンプが残るもので外れ値が気になる場合は使うと良いでしょう。

また、 --field に影響を受けて、メッセージの最上層が --field で指定したフィールドになります。

例えば、 --field x としたときは次のようになります。

ros2 topic echo /turtle1/pose --field x --filter 'abs(m-5.5)<2'

そのため、「yの条件でxの値のみを出力」はできなさそうです。



そもそも値の取得関連は、rqt_plotなどの便利ツールが標準で用意されていたりするので、グラフ化についてはそちらのほうがもっと手軽だと思います。

データをさくっと保存したり実演したりしたいときに地味に役立つと思います。