Note: このチュートリアルはあなたが ROS でプログラムをコンパイルできることを前提にしています.ここ ROS tutorials を参考にしてみて下さい. |
Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags. |
tf のイントロ
Description: このチュートリアルは tf が何をしてくれるかを教えてくれます. turtlesim を用いたマルチロボットの例で tf の素晴らしさが分かるでしょう.さらには tf_echo ,view_frames 及び rviz の使い方も知ることもできます.Keywords: transforms, coordinate frames
Tutorial Level: BEGINNER
Next Tutorial: tf の broadcaster の書き方 (Python) (C++)
Select which version of this tutorial you want: Show EOL distros:
Select which buildsystem you are using:
デモのコンパイル
依存性を解決してデモパッケージをコンパイルしましょう.
$ rosdep install turtle_tf rviz
$ rosdep install turtle_tf rviz $ rosmake turtle_tf rviz
デモの実行
turtle_tf のチュートリアルのパッケージをコンパイルし終えたのでデモの実行に移りましょう.
$ roslaunch turtle_tf turtle_tf_demo.launch
2匹の亀とともに turtlesim が始動するでしょう.
(プロセスが終わってしまうようなら、この回避方法を利用できます.)
一旦、turtlesimが始まると、矢印キーを用いて、turtlesimの中の中央の亀を動かすことができます。roslaunchを実行したターミナルのウィンドウにフォーカスが合うようにしてください
あなたが操作している亀を、絶えず追いかけるように動くもう一つの亀を見ることができます。
何が起きているか
このデモは、tfのライブラリを用いて、3つの座標系フレームを作っています。:ワールドフレーム、turtle1フレーム、そして、turtle2フレームです。このチュートリアルでは、tf broadcasterを用いて、turtle座標系フレームを配信し、tf listenerを用いてturtleフレームの中の違いを計算し、一方の亀が操作している亀を追従するようにしています。
tf ツール
さて、このデモをするのにどのようにtfが使われているかを見ていきましょう。tfツールは、このシーンの後ろでtfが何をしているのかを見せてくれます。
ビューフレーム(view_frames)を使う
view_framesはROS上にtfによってブロードキャストされているフレームの図表を作成します。
$ rosrun tf view_frames
$ rosrun tf view_frames
$ view_frames
$ rosrun tf view_frames
以下のようなものが見えるでしょう:
Transform Listener initing Listening to /tf for 5.000000 seconds Done Listening dot - Graphviz version 2.16 (Fri Feb 8 12:52:03 UTC 2008) Detected dot version 2.16 frames.pdf generated
ここで、tf listenerはROS上にブロードキャストされているフレームを取得し、どのようにframeが接続されているかのツリーを作成しています。そのツリーを表示するには:
$ evince frames.pdf
これで、tfからブロードキャストされている3つのフレームを見ることができます。:the world, turtle1, と turtle2です。また、この図表から、world はturtle1 と turtle2 の親のフレームであることもわかります。デバッグ目的で、最も古いものや最新のフレームの変換を受け取った時間や、どのぐらいの速さでtfのフレームがtfから配信されているかの診断情報をview_framesが報告してくれます。
tf_echoを使う
tf_echo は、ROS上にブロードキャストされている2つのフレーム間の変換を表示します。
使い方:
rosrun tf tf_echo [reference_frame] [target_frame]
さて、turtle1フレームに対するturtle2フレームの変換について見てみましょう。以下の式に等しいでしょう。
latex error! exitcode was 1 (signal 0), transscript follows: This is pdfTeX, Version 3.14159265-2.6-1.40.19 (TeX Live 2018) (preloaded format=latex) kpathsea: Running mktexfmt latex.fmt mktexfmt: mktexfmt is using the following fmtutil.cnf files (in precedence order): mktexfmt: /usr/share/texlive/texmf-dist/web2c/fmtutil.cnf mktexfmt: mktexfmt is using the following fmtutil.cnf file for writing changes: mktexfmt: /usr/share/httpd/.texlive2018/texmf-config/web2c/fmtutil.cnf /usr/bin/mktexfmt: mkdir(/usr/share/httpd/.texlive2018/) failed: Permission denied I can't find the format file `latex.fmt'!:
$ rosrun tf tf_echo turtle1 turtle2
ROSのブロードキャストされたフレームをtf_echolistenerが取得して、変換の様子を見ることができるでしょう。
At time 1412783918.429 - Translation: [-0.164, 0.547, 0.000] - Rotation: in Quaternion [0.000, 0.000, -0.597, 0.802] in RPY [0.000, 0.000, -1.279] At time 1412783919.421 - Translation: [-0.099, 0.329, 0.000] - Rotation: in Quaternion [0.000, 0.000, -0.597, 0.802] in RPY [0.000, 0.000, -1.279] At time 1412783920.429 - Translation: [-0.059, 0.196, 0.000] - Rotation: in Quaternion [0.000, 0.000, -0.597, 0.802] in RPY [0.000, 0.000, -1.279] At time 1412783921.437 - Translation: [-0.035, 0.117, 0.000] - Rotation: in Quaternion [0.000, 0.000, -0.597, 0.802] in RPY [0.000, 0.000, -1.279] At time 1412783922.429 - Translation: [-0.021, 0.070, 0.000] - Rotation: in Quaternion [0.000, 0.000, -0.597, 0.802] in RPY [0.000, 0.000, -1.279]
亀を動かすと、2つの亀が関連して動くように変換が変化するのを確認できるでしょう。
rviz と tf
rvizは、tfフレームを検査するのに便利な可視化ツールです。rvizを使ってturtleフレームを見てみましょう。-dオプションをつけて、turtle_tfの設定ファイルを読み込ませつつrvizを起動します。:
$ rosrun rviz rviz -d `rospack find turtle_tf`/rviz/turtle_rviz.rviz
$ rosrun rviz rviz -d `rospack find turtle_tf`/rviz/turtle_rviz.vcg
サイドバーの中に、tfによってブロードキャストされたフレームが見えるでしょう。亀を動かしてみれば、rvizでもフレームが動いているのが見えます。
これでturtle_tf_demoをテストすることができました。次は、このデモのbroadcaster (Python) (C++)の書き方について見てみましょう。