Ros

2つのtf /チュートリアル/ tfリスナーの作成(Python)



Two Tf Tutorials Writing Tf Listener



元の住所: http://wiki.ros.org/tf/Tutorials/tfリスナーの作成(Python)

tfリスナーの作成(Python)

説明:このチュートリアルでは、tfを使用して座標系を変換する方法を説明します。
前のチュートリアルでは、tfに対するカメの態度を解放するためにtfブロードキャスターを作成しました。このチュートリアルでは、tfを開始するためのtfリスナーを作成します。



1tfリスナーを作成する方法

まず、ソースファイルを作成しましょう。前のチュートリアルで作成したパッケージに移動します。

$ roscd learning_tf

1.1コード

お気に入りのエディターを起動し、次のコードをnodes /turtle_tf_listener.pyという新しいファイルに貼り付けます。



1 #!/usr/bin/env python 2 import roslib 3 roslib.load_manifest('learning_tf') 4 import rospy 5 import math 6 import tf 7 import geometry_msgs.msg 8 import turtlesim.srv 9 10 if __name__ == '__main__': 11 rospy.init_node('turtle_tf_listener') 12 13 listener = tf.TransformListener() 14 15 rospy.wait_for_service('spawn') 16 spawner = rospy.ServiceProxy('spawn', turtlesim.srv.Spawn) 17 spawner(4, 2, 0, 'turtle2') 18 19 turtle_vel = rospy.Publisher('turtle2/cmd_vel', geometry_msgs.msg.Twist,queue_size=1) 20 21 rate = rospy.Rate(10.0) 22 while not rospy.is_shutdown(): 23 try: 24 (trans,rot) = listener.lookupTransform('/turtle2', '/turtle1', rospy.Time(0)) 25 except (tf.LookupException, tf.ConnectivityException, tf.ExtrapolationException): 26 continue 27 28 angular = 4 * math.atan2(trans[1], trans[0]) 29 linear = 0.5 * math.sqrt(trans[0] ** 2 + trans[1] ** 2) 30 cmd = geometry_msgs.msg.Twist() 31 cmd.linear.x = linear 32 cmd.angular.z = angular 33 turtle_vel.publish(cmd) 34 35 rate.sleep()

ノードを実行可能にすることを忘れないでください:

chmod +x nodes/turtle_tf_listener.py

1.2説明されたコード

それでは、タートルポーズをtfにリリースすることに関連するコードを見てみましょう。

6 import tf

tfパッケージは、変換を受信するタスクを簡素化するのに役立つtf.TransformListenerの実装を提供します。



13 listener = tf.TransformListener()

ここでは、tf.TransformListenerオブジェクトを作成します。リスナーが作成されると、ネットワークを介してtf変換の受信を開始し、最大10秒間それらをバッファリングします。

23 rate = rospy.Rate(10.0) 24 while not rospy.is_shutdown(): 25 try: 26 (trans,rot) = listener.lookupTransform('/turtle2', '/turtle1', rospy.Time(0)) 27 except (tf.LookupException, tf.ConnectivityException, tf.ExtrapolationException): 28 continue

ここで、実際の作業が完了しました。lookupTransformを介してリスナーにクエリを実行し、特定の変換を取得します。これらの議論を見てみましょう:
(1)「/ turtle1」フレームからの変換が必要です…
(2)…「/ turtle2」フレームに。
(3)私たちが変容したい時。 rospy.Time(0)を提供すると、利用可能な最新の変換が得られます。
この関数は2つのリストを返します。 1つ目は、親座標系(x、y、z)に対する子座標系の線形変換であり、2つ目は、親方向から子方向に回転するために必要な(x、y、z、w)クォータニオンです。方向。
これらはすべて、可能性のある例外をキャッチするためにtry-exceptブロックにラップされています。

2リスナーの実行

テキストエディタを使用して、start_demo.launchという名前のスタートアップファイルを開き、次の行を追加します。

...

まず、前のチュートリアルのスタートアップファイルを必ず停止してください(ctrl-cを使用)。これで、完全なタートルデモを開始する準備ができました

$ roslaunch learning_tf start_demo.launch

turtlesimに2匹のカメが見えます。

3結果の確認

それが機能するかどうかを確認するには、矢印キーを使用して最初のタートルを駆動します(シミュレーターウィンドウではなく、ターミナルウィンドウがアクティブになっていることを確認してください)。
turtlesimが起動すると、次のように表示されます。

[ERROR] 1253915565.300572000: Frame id /turtle2 does not exist! When trying to transform between /turtle1 and /turtle2. [ERROR] 1253915565.401172000: Frame id /turtle2 does not exist! When trying to transform between /turtle1 and /turtle2.

これは、turtlesimでスポーンして、tf座標系のブロードキャストを開始するのに少し時間がかかるため、リスナーがturtle2に関するメッセージを受信する前に変換を計算しようとするためです。
これで、次のチュートリアルに進む準備ができました。ここでは、座標系を追加する方法を学習します。