时间旅行(Python)

**目标:**学习有关tf2高级时间旅行功能的知识。

教程级别: 中级

时间: 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
../../../_images/turtlesim_delay1.png

现在你应该注意到,你的乌龟在像这个截图中一样无法控制地四处移动。让我们试着理解背后的原因。

  1. 在我们的代码中,我们向tf2提出了以下问题:“相对于5秒前的``turtle2``,``carrot1``的姿势是什么?” 这意味着我们控制第二只乌龟的位置是基于它5秒钟前的位置以及第一个胡萝卜5秒钟前的位置。

  2. 然而,我们真正想要问的是:“相对于当前``turtle2``的位置,``carrot1``在5秒钟前的姿势是什么?”

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接受六个参数:

  1. 目标帧

  2. 要进行转换的时间

  3. 源帧

  4. 评估源帧的时间

  5. 在这种情况下,``world``帧是随时间不变的帧

  6. 等待目标帧可用的时间

总结一下,在后台,tf2会进行以下操作:它会计算从``carrot1``到``world``的变换。在``world``帧中,tf2会在过去到现在的时间上进行移动。而在当前时间,tf2会计算从``world``到``turtle2``的变换。

检查结果

让我们再次运行模拟,这次使用高级的时间旅行API:

ros2 launch learning_tf2_py turtle_tf2_fixed_frame_demo.launch.py
../../../_images/turtlesim_delay2.png

是的,第二只乌龟被定向到了第一根胡萝卜5秒前的位置!

总结

在本教程中,您已经看到了tf2的一项高级功能。您了解到tf2可以对数据进行时间转换,并学习了如何在turtlesim示例中进行转换。通过使用高级的``lookup_transform_full()``API,tf2允许您在时间上进行回溯,并在乌龟的旧姿势和当前姿势之间进行帧转换。