ros_tf2_sampleのREADME

前置き

ROSのTFを扱う(理解)するのに手こずったので,私みたいな人でも触って分かるサンプルを作った.
まだ未完成なので,よろしく.
ぶっちゃけ,ソースコードを見れば早いと思う.


前提

以下の環境で作ったので,試す人はこちらを確認しよう.

  • ROS Melodic
    • rosはros-melodic-desktop-fullを入れた.
  • Ubuntu 18.04

導入

初心者のために,導入するところから説明する.
とりあえず,コピペすればよろしい.

cd ~/catkin_ws/src
git clone https://github.com/masausagi/ros_tf2_sample.git

その後,コンパイルする.

cd ~/catkin_ws
catkin_make

エラー文が出たら,適宜対処しよう.
基本的にはエラー文をgoogleで検索する.
わからなかったら,issue飛ばしてくれてもいい.日本語でOK.


使うためのTF知識

このサンプルでは,TFを使うことのみに焦点を当てる.
だから,本当の知識は得られないので注意すること.

まず,TFが扱うのは『フレームID』,そして,フレームIDの親子関係である.

フレームIDとは,色々なデータ(点群とかロボットの位置とか)を表す座標系の名前.

フレームIDの親子関係とは,Aフレームに乗っかって,Bフレームがあるというイメージ.
親子関係のことを,ツリー構造と言ったりする.
例を示す.Aが親で,Bが子供とする.
AにBが乗っかってる感じをイメージ(抱っこみたいな)

ここでAは,地図から見て(0,0)から(1,0)に移動した.
このとき,Bも地図から見て(0,0)から(1,0)に移動しているのだ.(分かる?)
『地図から見て』というのが重要.

じゃあ,このとき,『Aから見て』Bはどう映るか?
というと,Aしか移動してないので,Bは動いていないということになる.

この『○から見て〜〜』の関係を,TFで表せる.

フレーム同士は相対位置で記述できるので,使い勝手がいい.
今回のサンプルで分かってくれると嬉しい.


サンプル1:TF関係を配信する

TFで,フレームID同士の関係を記述し,配信することで,扱うことができるようになる.

ここで,簡単にTFで遊べるソースを用意したのでぜひ遊んでほしい.

rosrunでパラメータを設定することで,色々と遊べるようにしている

  • pframe (文字列) : 親のフレームIDを指定
  • cframe (文字列) : 子のフレームIDを指定
  • x (小数) : 親から見た子の位置X
  • y (小数) : 親から見た子の位置Y
  • z (小数) : 親から見た子の位置Z
  • qx (小数) : 親から見た子の傾きX
  • qy (小数) : 親から見た子の傾きY
  • qz (小数) : 親から見た子の傾きZ

実行方法

まず,roscoreを立ち上げていない人は立ち上げる

roscore

そのあと,sample1_tf2_connectionを立ち上げる

rosrun ros_tf2_sample sample1_tf2_connection _x:=0 _y:=0 _z:=0

別のターミナルを開き,RVIZを起動する

rosrun rviz rviz -f map

左下のADDから,TFをセットすると,以下のような画面が出る

フレーム同士が重なって表示される.

いじってみよう①

このサンプルを利用して,子供のフレームIDを別の場所に移動してみよう.

一度開いたRVIZとrosrunを閉じて(roscoreはそのまま)以下を実行

rosrun ros_tf2_sample sample1_tf2_connection _x:=0.5 _y:=0 _z:=0 

RVIZを再度起動

rosrun rviz rviz -f map

mapとrobotが別れて見やすくなった.

TF関係を追加しちゃう

このサンプルを利用して,フレームIDの親子関係を複雑にしちゃう.

以下の例では,こんなTF関係を作成してみる.
map → robot
map → objects robot → camera

一度開いたRVIZとrosrunを閉じて(roscoreはそのまま)以下を実行
一つずつターミナルを開こう

rosrun ros_tf2_sample sample1_tf2_connection _pframe:=map _cframe:=robot _x:=0.5 _y:=0 _z:=0
rosrun ros_tf2_sample sample1_tf2_connection _pframe:=map _cframe:=objects _x:=0 _y:=0.5 _z:=0
rosrun ros_tf2_sample sample1_tf2_connection _pframe:=robot _cframe:=camera _x:=0 _y:=0.5 _z:=0

RVIZを再度起動

rosrun rviz rviz -f map

このときのTF関係は以下のところで見れる.

mapを原点として,objectsとrobotのフレームの位置関係を記述できる.
また,robotを原点として,cameraの位置関係を記述できる.

つまり,便利.


サンプル2:TFを動かす

ロボットとかを実際に移動させるときは,TFを利用して動かす.
先程のTFは静的なもので,基本的に動かさないことを前提としていた.

今回は,動かすことに焦点を当てる.

使い方

以下のコマンドでOK その後,いつものRVIZ

rosrun ros_tf2_sample samle2_tf2_moving_by_keyboard _qframe:=map _cframe:=robot
rosrun rviz rviz -f map

キーボードでWASDで,上左下右に対応するようにrobotが移動する.