时间旅行(C++)

目标 了解 tf2 的高级时间旅行功能。

辅导水平: 中级

时间 10 分钟

背景介绍

在上一教程中,我们讨论了 TF2 和时间的基础知识.本教程将让我们更进一步,揭示一个强大的 tf2 技巧:时间旅行。简而言之,tf2 库的主要功能之一就是能够在时间和空间上转换数据。

tf2 的时空旅行功能可用于各种任务,例如长时间监控机器人的姿势,或者制造一个跟随者机器人,跟随领导者的 "脚步"。我们将利用时空旅行功能,回溯过去查找变换并编程 乌龟2 落后 5 秒 胡萝卜1.

时间旅行

首先,让我们回到上一个教程结束的地方 利用时间.前往您的 learning_tf2_cpp 包装

现在,我们不再让第二只乌龟去胡萝卜现在所在的位置,而是让第二只乌龟去 5 秒钟前第一只胡萝卜所在的位置。编辑 lookupTransform() 调入 turtle_tf2_listener.cpp 文件到

rclcpp::时间  = ->;获取时钟()->;现在() - rclcpp::持续时间(5, 0);
尝试 {
    t = tf_buffer_->;查找变换(
        toFrameRel,
        fromFrameRel,
        ,
        50毫秒);
} 捕捉 ( tf2::转换异常 及样品; ) {

现在,如果你运行这个程序,在最初的 5 秒钟里,第二只乌龟不知道该去哪里,因为我们还没有 5 秒钟的胡萝卜姿势历史记录。但这 5 秒钟之后会发生什么呢?那我们就试试看吧:

ros2 launch learning_tf2_cpp turtle_tf2_fixed_frame_demo_launch.py
.././././_images/turtlesim_delay1.png

现在你应该注意到,你的乌龟正在不受控制地到处乱跑,就像这张截图一样。让我们来了解一下这种行为背后的原因。

  1. 在我们的代码中,我们向 tf2 提出了以下问题:"的姿势是什么? 胡萝卜1 5 秒前,相对于 乌龟2 5秒前?"。这意味着我们要根据第二只乌龟 5 秒前的位置以及第一根胡萝卜 5 秒前的位置来控制它。

  2. 然而,我们真正想问的是"...... "的姿势是什么? 胡萝卜1 5 秒前,相对于当前位置的 乌龟2?".

lookupTransform() 的高级 API

为了向 tf2 提出这个特殊问题,我们将使用高级应用程序接口(API),它能让我们明确说明何时获取指定的转换。我们可以通过调用 lookupTransform() 方法,并添加额外参数。您现在的代码看起来会是这样

rclcpp::时间 现在 = ->;获取时钟()->;现在();
rclcpp::时间  = 现在 - rclcpp::持续时间(5, 0);
尝试 {
    t = tf_buffer_->;查找变换(
        toFrameRel,
        现在,
        fromFrameRel,
        ,
        "世界";,
        50毫秒);
} 捕捉 ( tf2::转换异常 及样品; ) {

的高级应用程序接口 lookupTransform() 需要六个参数:

  1. 目标框架

  2. 转变为

  3. 来源框架

  4. 评估源帧的时间

  5. 不随时间变化的帧,在本例中为 世界 画框

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

总之,tf2 会在后台执行以下操作。在过去,它会从 胡萝卜1世界.在 世界 帧,tf2 从过去穿越到现在。而在当前时间,tf2 会计算从 世界乌龟2.

检查结果

构建软件包,然后再次运行模拟,这次使用高级穿越时空应用程序接口:

ros2 launch learning_tf2_cpp turtle_tf2_fixed_frame_demo_launch.py
.././././_images/turtlesim_delay2.png

是的,第二只乌龟被引向 5 秒钟前第一只胡萝卜所在的位置!

摘要

在本教程中,您看到了 tf2 的高级功能之一。您了解到 tf2 可以及时转换数据,并学习了如何通过海龟模拟示例实现这一功能。 lookupTransform() 应用程序接口。