みなさんは、 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などの便利ツールが標準で用意されていたりするので、グラフ化についてはそちらのほうがもっと手軽だと思います。
データをさくっと保存したり実演したりしたいときに地味に役立つと思います。