时间穿梭带tf2 (C++) [待校准@8545]

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

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

时间: 10分钟 [Alyssa@7452]

背景

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

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

时间穿梭 [待校准@8549]

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

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

rclcpp::Time when = this->get_clock()->now() - rclcpp::Duration(5, 0);
transformStamped = tf_buffer_->lookupTransform(
    toFrameRel,
    fromFrameRel,
    when,
    50ms);

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

ros2 launch learning_tf2_cpp 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]

用于查找转换的高级API () [待校准@8556]

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

rclcpp::Time now = this->get_clock()->now();
rclcpp::Time when = now - rclcpp::Duration(5, 0);
transformStamped = tf_buffer_->lookupTransform(
    toFrameRel,
    now,
    fromFrameRel,
    when,
    "world",
    50ms);

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

  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_cpp turtle_tf2_fixed_frame_demo.launch.py
../../_images/turtlesim_delay2.png

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

总结

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