ROSのTFとは?簡単に説明(サンプルコード付き)

はじめに

ROSの便利機能にして基本機能、TF(トランスフォーム)について出来るだけ難しい言葉を使わずに説明していきたいと思います。

TFとは?

TF(transform)とは「ある座標系」と「他の座標系」の位置関係を表すものです。
座標系は部品と部品の位置関係のように変化しないものでもいいですし、部屋のある一点から見たロボットの位置のように常に変化するものでも良いです。
例として次のようなロボットを考えてみます。

車輪ロボットとセンサ

このとき、ロボットの重心位置においた座標系からセンサの座標系に行くには「右に20cm、上に10cm」等と表現できます。これが「TF」です。

TFの特徴

複数のTFをつなげることが出来る

TFは「あるもの」から「他のもの」への位置関係を表すものですが、普通ロボットなり自動車なりは沢山の部品で出来ています。それらを1つの基準点(たとえば上の図のロボット座標系)からすべて表すのは大変です。
そこで、TFを数珠つなぎに書くことで、関係を分かりやすくすることが出来ます。例えば先程のロボットなら次のような座標系が作れそうです。

ロボットの座標系

座標系の名前は「frame(フレーム)」と呼びます。「map」フレームは常に動かない座標系です。ロボットなら部屋のある点、自動車なら道路などがこれにあたります。
黄色の線は「あるフレーム」から「他のフレーム」へのTFがある事を示しています。元になるフレームを「parent frame(親フレーム)」または単に「frame」、目的のフレームを「child frame(子フレーム)」と呼びます。

つながっているTF同士の位置関係は自動計算される

繋がっている2つのフレーム間のTFは、ROSが自動で計算してくれます。任意の位置関係をいつでも取得することが可能です。

※逆に、途中で切れていると目的のフレームが表せなくなります

一定時間経つと捨てられる

これは重要な特徴なのですが、TFは一度誰かが発信して一定時間経つと無効になります。ずっと表示させたければすべてのTFを常に発信し続ける必要があります。

静的TFと動的TF

TFには例えばロボットのセンサの位置関係のように永久に変わらないものと、部屋からみたロボットの位置のように変わり続けるものがあります。前者を静的TF、後者を動的TFと言います。

TFを発信する

静的TFを発信するコードを書いてみます。最も簡単なのは次のようなlaunchファイルを作ることです。

「<node」 から 「/>」までがTFを発信するプログラムを実行する部分です。それぞれの引数の意味は次のとおりです。

引数値の例備考
pkg“tf” (固定)パッケージの名前
type“static_transform_publisher” (固定)プログラムの名前
name“(好きな名前)”実行時の名前
args(例)”0.2 0 0.1 0 0 0 robot sensor 10″x方向、y方向、z方向、ヨー、ピッチ、ロール、親フレーム、子フレーム、発信の間隔[Hz]

nameが同じプログラムを同時に作るとエラーになります。これを自分のパッケージ→lanchフォルダの中に入れて実行すると、argsで指定したTFが発信されます。

発信されているTFをrvizで見てみましょう。rvizを起動して、左下部あたりにある「Add」をクリック、「By display type」から「TF」を追加して下さい。

静的TFが表示された!

2つの座標軸が表示されていれば成功です!
rvizの左側の「Fixed Frame」を「robot」や「sensor」に切り替えることで、どのフレームを中心に据えるか選ぶ事が出来ます。lanchファイルで複数のプログラムを起動すれば、TFの数珠つなぎも簡単に実現できます。

しかし、これだと常に同じTFしか発信できません。
次回は常に変化する位置関係の発信方法をご紹介したいと思います。

ROS初心者の方はまずはこちらの本がオススメです。

動的TFの書き方>>

「ROSのTFとは?簡単に説明(サンプルコード付き)」への2件のフィードバック

  1. 指摘が間違っていたらすみません。
    static_transform_publisherの引数ですが、yaw pitch rollの順だと思います。

    1. その通りです、間違っていました。該当箇所を修正しました。
      ご指摘ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。