ROSのtfは非常に便利で、複数のエンコーダが時間差を出しながら出してくる情報を適切にまとめ上げてくれる座標変換、座標管理ツールです。ROSとうまく溶け合っておりtfなくしてROSを使うことはできません。

本題ですが、tf関連で便利なコマンドをまとめておきます。

tfで固定的な座標を定期的に出すコマンド

tfで動的な値をセンサから出すだけでなく、どうしても固定的に出したいtfがあるかと思います。そんな時に使えるのが、static_transform_publisherです。ロボットに固定的に把持させたものの位置の座標とかを出したりするときに使用します。

こちらはピッチ角等で決める方法とクオータニオンで指定する方法の二つの方法があります。

tfは有効な期限が決まっているので、定期的に出す必要があり、どの程度の頻度でpublishするかのパラメータもあります。

ピッチ角指定

static_transform_publisher x y z yaw pitch roll frame_id child_frame_id period_in_ms

上記のperiod_in_msに何msごとに出すかを指定してください。通常は100msと指定して10hzほどになるようにしますが、変わらないのでもう少し頻度を落としても問題ないかと思います。頻度の多い動的な座標の場合、座標がカクカク動くことになってしまうので10hzでも遅いかもしれません。

もう一つの記述の仕方は

クオータニオン指定

static_transform_publisher x y z qx qy qz qw frame_id child_frame_id  period_in_ms

frame_idが親側で上記指定するのはframeid->child_frame_idの座標変換を指定することになります。

上記どちらでも結果は変わらないので、好きな方を選択すればよいかと思います。

今のtf全体がどうなっているのか可視化するコマンド

これも本当によく使います。たまにtfがぐちゃぐちゃになることでロボットが想定しないような動きをするときがありますが、view_framesでpdfを出すことで現状を可視化することができます。主にデバッグ用途になりますね。

以下のようなpdfがframes.pdfという名前で出力されます。

dclneaiqh6k_view_frames

よくあるハマリどころとして、あくまで最新を表示するだけなので、複数のtf Publisherと混合してしまっている場合はその最新の方のみが表示されてしまい特定するのが難しいです。その場合はtf_monitorコマンドを使って原因を調べる必要があります。

またtfでハマリやすいのは複数の親がある子供を持つ時です。常にtfはツリー状になっているべきであるため、そのような持ち方は本来できません。すなわち子に対して親は常に一つでなくてはなりません。そういった場合は、親子関係を逆転するなどして対応する必要があります。

特定の座標間のTFのみechoして表示する

デバッグ関連でもう一つ使うのがtf_echoです。これはかなりシンプルなコマンドで、常に出されている特定のtfの値を表示し続けます.結構な量が出てきますので、ご注意.

時間と座標変換が表示されますが、どのNodeが出したかは確認できません。その時はtf_monitorで確認することができるのでそちらを活用してください。

おわりに

tfは本当に便利.それに伴って必要なコマンドも知っておくとなおのことの便利なので、まとめときました。デバッグが難しいのが難点ですけどね。。。