2009年12月31日木曜日

tfと時間について学ぶ(C++)

今回もC++でtfの勉強です。
つらいのでサクッと終わらせたいです。

http://www.ros.org/wiki/tf/Tutorials/tf%20and%20Time%20(C%2B%2B)


前回のつづきで
$ roscd learning_tf
します。
で、
src/turtle_tf_listener.cppのtryの中を以下のように編集します。


try{
    listener.lookupTransform("/turtle2", "/turtle1",  
                             ros::Time::now(), transform);
変わったのは、carrot1をturtle1に戻したこと、ros::Time(0)をros::Time::now()にしたこと。
ではmakeして実行してみます。
$ make
$ roslaunch learning_tf start_demo.launch

 [ERROR] 1262237846.011536000: You requested a transform that is 0.085 miliseconds in the past, 
but the most recent transform in the tf buffer is 35.950 miliseconds old.
 When trying to transform between /turtle1 and /turtle2.

というエラーがでまくります。そんな最近のデータはないよ。というメッセージですね。
now()のデータはまだできていないので、少し待つ必要があります。

実はtfにはこの待つためのインタフェースが用意されており、
以下のようにして使います。src/turtle_tf_listener.cppを編集してください。
try{
    ros::Time now = ros::Time::now();
    listener.waitForTransform("/turtle2", "/turtle1",
                              now, ros::Duration(3.0));
    listener.lookupTransform("/turtle2", "/turtle1",
                             now, transform);
ros::Duration(3.0)はタイムアウトを指定しています。
このwaitにより指定した時刻(now)のデータ(/turtle2から見た/turtle1の座標系)からがくるまで実行がブロックされます。

ではmake&launchしましょう。

  $ make
  $ roslaunch learning_tf start_demo.launch
[ERROR] 1262238458.663194000: You requested a transform that is 3.003 seconds in the past, 
but the tf buffer only has a history of 2.720 seconds.
 When trying to transform between /turtle1 and /turtle2.
まだ一回だけエラーがでます。
これは亀が生まれる前にtfをリクエストされたためです。
これは仕方ないみたいです。

では次回へ続きます。

0 件のコメント:

コメントを投稿