TF による座標変換¶
座標変換ライブラリである TF で使用されるターミナルコマンドと C++ コマンドについて見ていきます.
モチベーション¶
実際に自身が動いたり何か他の動きを見たりしなくても便利な 「ロボット」というのはイメージし難いです. 有用な ROS におけるアプリケーションというのは必然的に 部品やロボットリンクまたはツールの位置を 観察する必要のあるコンポーネントを有します. ROS ではこれを行いやすくする 「エコシステム」とライブラリを TF と呼んでいます.
TF は接続されたフレーム間の変換を 時間を遡っても調べることを可能にする基本的なツールです. 例えば「10秒前における A と B の間の変換は何ですか?」 という質問をすることも可能にする便利な道具です.
リファレンス¶
Scan-N-Plan アプリケーション: 演習問題¶
(シミュレートされた)カメラにより取得された部品の姿勢情報は カメラ自体の光学基準フレームとして得られます. ロボットがこのデータを基に何かを行うためには データをロボットの参照フレームに変換する必要があります.
具体的には vision_node 内のサービスコールバックを編集して,
部品姿勢の最新情報を camera_frame
から
サービスコールの base_frame
リクエストフィールドに変換します.
Scan-N-Plan アプリケーション: ガイダンス¶
コアパッケージの依存関係に
tf
を指定してください.- 前の演習のように
package.xml
(1行)とCMakeLists.txt
(2行)を編集します.
- 前の演習のように
vision node にクラスメンバ変数として
tf::TransformListener
オブジェクトを追加します.#include <tf/transform_listener.h> ... tf::TransformListener listener_;
取得された目標物の姿勢を 参照したフレーム("camera_frame")から サービス・リクエスト・フレームに変換するために, 既存の
localizePart
メソッドにコードを追加します.良かれ悪しかれ ROS はさまざまな数学ライブラリを使用します.
geometry_msgs::Pose
の over-the-wire 形式をtf::Transform
オブジェクトに変換する必要があります.tf::Transform cam_to_target; tf::poseMsgToTF(p->pose.pose, cam_to_target);
リスナ・オブジェクトを用いて
request.base_frame
とARMarker
メッセージ(これは "camera_frame" 上にあるはずです) からの参照フレームの間の最新の変換を調べます.tf::StampedTransform req_to_cam; listener_.lookupTransform(req.base_frame, p->header.frame_id, ros::Time(0), req_to_cam);
上で得られた情報を用いて 対象物の姿勢を目標フレームに変換します.
tf::Transform req_to_target; req_to_target = req_to_cam * cam_to_target;
サービス応答で変換された姿勢を返します.
tf::poseTFToMsg(req_to_target, res.pose);
ノードを実行して変換をテストします.
catkin build roslaunch myworkcell_support urdf.launch roslaunch myworkcell_support workcell.launch
workcell.launch
のbase_frame
パラメータを 例えば "table" などに変更して,workcell.launch
ファイルを再起動し, 異なるポーズの結果を見てみてください.完了したら "base_frame" パラメータを "world" に戻してください.