时间旅行(Python)
教程级别: 中级
时间: 10分钟
背景
在前面的教程中,我们讨论了tf2和时间的基础知识。本教程将进一步介绍一个强大的tf2技巧:时间旅行。简而言之,tf2库的一个关键特性是它能够在时间和空间上对数据进行转换。
这个tf2时间旅行功能在各种任务中都很有用,比如长时间监测机器人的姿态或构建一个会跟随领导者“步伐”的跟随机器人。我们将利用这个时间旅行功能,在时间上回溯并编程“turtle2”在“carrot1”之后追踪5秒钟。
时间旅行
首先,让我们回到上一教程中结束的地方。转到您的``learning_tf2_py``包。
现在,我们不再让第二只乌龟去当前胡萝卜的位置,而是让第二只乌龟去5秒前第一只胡萝卜的位置。在``turtle_tf2_listener.py``文件中编辑``lookup_transform()``的调用为:
when = self.get_clock().now() - rclpy.time.Duration(seconds=5.0)
trans = self.tf_buffer.lookup_transform(
to_frame_rel,
from_frame_rel,
when,
timeout=rclpy.duration.Duration(seconds=0.05))
如果现在运行这段代码,在前5秒钟内,第二只乌龟将不知道该去哪里,因为我们还没有5秒钟的胡萝卜位置历史记录。但是在这5秒钟之后会发生什么呢?让我们试一试:
ros2 launch learning_tf2_py turtle_tf2_fixed_frame_demo.launch.py
现在你应该注意到,你的乌龟在像这个截图中一样无法控制地四处移动。让我们试着理解背后的原因。
lookup_transform()的高级API
要向tf2提出特定的问题,我们将使用一个高级API,该API赋予我们显式指定何时获取指定的转换的能力。通过调用带有额外参数的``lookup_transform_full()``方法来实现。您的代码现在将如下所示:
when = self.get_clock().now() - rclpy.time.Duration(seconds=5.0)
trans = self.tf_buffer.lookup_transform_full(
target_frame=to_frame_rel,
target_time=rclpy.time.Time(),
source_frame=from_frame_rel,
source_time=when,
fixed_frame='world',
timeout=rclpy.duration.Duration(seconds=0.05))
``lookup_transform_full()``的高级API接受六个参数:
目标帧
要进行转换的时间
源帧
评估源帧的时间
在这种情况下,``world``帧是随时间不变的帧
等待目标帧可用的时间
总结一下,在后台,tf2会进行以下操作:它会计算从``carrot1``到``world``的变换。在``world``帧中,tf2会在过去到现在的时间上进行移动。而在当前时间,tf2会计算从``world``到``turtle2``的变换。