时间穿梭tf2 (Python) [待校准@8570]

Goal目标: Learn了解tf2的高级时间穿梭功能。 [待校准@8546]

Tutorial教程级别: Advanced高级 [待校准@7643]

时间: 10分钟 [Alyssa@7452]

背景

在之前的教程中,我们讨论了 basics of tf2 and time 。本教程将带我们更进一步,展示一个强大的tf2技巧: 时间穿梭。简而言之,tf2库的关键特征之一是它能够在时间和空间上转换数据。 [待校准@8571]

tf2时间穿梭功能可用于各种任务,如长时间监控机器人的姿势或构建跟随领导者 "steps" 的追随者机器人。我们将使用时间穿梭功能查找时间的转换,并将 turtle2 编程为在 carrot1 后5秒。 [待校准@8548]

时间穿梭 [待校准@8549]

首先,让我们回到上一教程 Learning about tf2 and time 的结尾。去你的 learning_tf2_py 包裹。 [待校准@8572]

现在,我们将让第二只乌龟去5秒前第一只胡萝卜的地方,而不是让第二只乌龟去胡萝卜现在所在的地方。编辑 lookup_transform() 调用在 turtle_tf2_listener.py 文件 [待校准@8573]

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=Duration(seconds=0.05))

如果你运行这个,在最初的5秒内,第二只乌龟不知道去哪里,因为我们还没有5秒的胡萝卜姿势的历史。但是这5秒后会发生什么呢?让我们试一试: [待校准@8552]

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

你现在应该注意到你的乌龟正在不受控制地四处走动,就像这张截图中那样。让我们试着理解这种行为背后的原因。 [待校准@8553]

  1. 在我们的代码中,我们问了tf2以下问题: “5秒前 carrot1 相对于5秒前 turtle2 的姿势是什么?”。这意味着我们根据5秒前的位置以及5秒前的第一个胡萝卜位置来控制第二个乌龟。 [待校准@8554]

  2. 然而,我们真正想问的是: “5秒前 carrot1 相对于 turtle2 目前的位置是什么姿势?”。 [待校准@8555]

用于lookup_transform的高级API () [待校准@8574]

要向tf2提出该特定问题,我们将使用高级API,该API使我们能够明确说明何时获取指定的转换。这是通过调用带有附加参数的 lookup_transform_full() 方法来完成的。您的代码现在如下所示: [待校准@8575]

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=Duration(seconds=0.05))

[需手动修复的语法] lookup_transform_full() 的高级API采用六个参数: [待校准@8576]

  1. 目标帧 [待校准@8559]

  2. 转换为 [待校准@8560]

  3. 源帧 [待校准@8561]

  4. 评估源文件帧的时间 [待校准@8562]

  5. 不会随时间变化的帧,在这种情况下为 world[待校准@8563]

  6. 等待目标帧可用的时间 [待校准@8564]

总而言之,tf2在后台执行以下操作。在过去,它计算从 carrot1world 的转换。在 world 帧中,tf2时间穿梭从过去到现在。目前,tf2计算了从 worldturtle2 的变换。 [待校准@8565]

检查结果 [待校准@8566]

让我们再次运行仿真,这次使用高级时间穿梭API: [待校准@8567]

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

是的,第二只乌龟被引导到5秒前第一根胡萝卜所在的地方! [待校准@8568]

总结

在本教程中,您已经看到了tf2的高级功能之一。您了解到tf2可以及时转换数据,并通过turtlesim示例了解了如何做到这一点。tf2允许你回到过去,通过使用先进的 lookup_transform_full() API在海龟的旧姿势和当前姿势之间进行帧转换。 [待校准@8577]