ROS与Python入门教程-TF-了解tf和时间
ROS与Python入门教程-TF-了解tf和时间
说明
- 介绍使用waitForTransform函数去等待变换在tf树中生效。
- 介绍获取特定时间的变换。
tf and Time(TF和时间)
- TF会保持更新TF的参考系的树结构,这个结构会随时间而改变。
- TF会存放长达10秒的各种变换的时间快照。
- 利用lookupTransform() 获取最新的变换,而不知道什么时候变换被记录的
- 编辑nodes/turtle_tf_listener.py,改变调用方式。
try:
now = rospy.Time.now()
(trans,rot) = listener.lookupTransform("/turtle2", "/carrot1", now)
except (tf.LookupException, tf.ConnectivityException):
- 运行会失败,提示如:
Traceback (most recent call last):
File "~/ros/pkgs/wg-ros-pkg-trunk/sandbox/learning_tf/nodes/turtle_tf_listener.py", line 25, in <module>
(trans,rot) = listener.lookupTransform('/turtle2', '/carrot1', now)
tf.ExtrapolationException: Extrapolation Too Far in the future: target_time is 1253830476.460, but the closest tf data is at 1253830476.435 which is 0.024 seconds away.Extrapolation Too Far in the future: target_time is 1253830476.460, but the closest tf data is at 1253830476.459 which is 0.001 seconds away.Extrapolation Too Far from single value: target_time is 1253830476.460, but the closest tf data is at 1253830476.459 which is 0.001 seconds away. See http://pr.willowgarage.com/pr-docs/ros-packages/tf/html/faq.html for more info. When trying to transform between /carrot1 and /turtle2. See http://www.ros.org/wiki/tf#Frequently_Asked_Questions
- 如果是electric版本,提示:
Traceback (most recent call last):
File "/home/rosGreat/ROS_tutorial/learning_tf/nodes/turtle_tf_listener.py", line 28, in <module>
(trans,rot) = listener.lookupTransform('/turtle2', '/carrot1', now)
tf.ExtrapolationException: Lookup would require extrapolation into the future. Requested time 1319591145.491288900 but the latest data is at time 1319591145.490932941, when looking up transform from frame [/carrot1] to frame [/turtle2]
- 那是为什么?每个监听器有一个缓冲区,它存储所有的坐标转换来自不同的广播电台。当一个广播器发出一个变换,它需要一段时间才转换进入缓冲区(通常是几毫秒)。因此,当你请求一个坐标变换“now”的时候,你应该等待几毫秒直到信息到达。
Wait for transforms(等待变换)
- 示例代码:
listener.waitForTransform("/turtle2", "/carrot1", rospy.Time(), rospy.Duration(4.0))
while not rospy.is_shutdown():
try:
now = rospy.Time.now()
listener.waitForTransform("/turtle2", "/carrot1", now, rospy.Duration(4.0))
(trans,rot) = listener.lookupTransform("/turtle2", "/carrot1", now)
waitForTransform()有四个参数:
- /turtle2,等待父坐标系广播
- /carrot1,到子坐标系的变换
- rospy.Time(),这个时间的变换
- rospy.Duration(4.0),等待最长的时间段
waitForTransform() 实际上会阻塞,直到两个坐标系变换开始。(通常是几毫秒)
为什么调用两次? 一开始产生turtle2时候 ,在第一次调用waitForTransform()前,TF可能还没有更新。第一次调用waitForTransform()就会等待,直到/turtle2坐标系开始广播。第二次调用waitForTransform()用Now参数才能获取到值。
检查结果
现在,你应该能够简单地用箭头键驱动第一只乌龟(确保你的终端窗口是活动的,而不是你的模拟器窗口),你会看到第二只海龟跟随第一只乌龟!
所以,你注意到在海龟的行为上没有明显的区别。这是因为实际的时序差异只有几毫秒。但为什么我们从时间使这种变化Time(0)到now()?只是教你关于缓冲区和与它相关的时间延迟。对于真正的使用时间的情况下,它往往是使用Time(0)。
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号