时间穿梭带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
你现在应该注意到你的乌龟正在不受控制地四处走动,就像这张截图中那样。让我们试着理解这种行为背后的原因。 [待校准@8553]
在我们的代码中,我们问了tf2以下问题: “5秒前
carrot1
相对于5秒前turtle2
的姿势是什么?”。这意味着我们根据5秒前的位置以及5秒前的第一个胡萝卜位置来控制第二个乌龟。 [待校准@8554]然而,我们真正想问的是: “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]
目标帧 [待校准@8559]
转换为 [待校准@8560]
源帧 [待校准@8561]
评估源文件帧的时间 [待校准@8562]
不会随时间变化的帧,在这种情况下为
world
帧 [待校准@8563]等待目标帧可用的时间 [待校准@8564]
总而言之,tf2在后台执行以下操作。在过去,它计算从 carrot1
到 world
的转换。在 world
帧中,tf2时间穿梭从过去到现在。目前,tf2计算了从 world
到 turtle2
的变换。 [待校准@8565]
检查结果 [待校准@8566]
让我们再次运行仿真,这次使用高级时间穿梭API: [待校准@8567]
ros2 launch learning_tf2_cpp turtle_tf2_fixed_frame_demo.launch.py
是的,第二只乌龟被引导到5秒前第一根胡萝卜所在的地方! [待校准@8568]
总结
在本教程中,您已经看到了tf2的高级功能之一。您了解到tf2可以及时转换数据,并通过turtlesim示例了解了如何做到这一点。tf2允许你回到过去,通过使用先进的 lookupTransform()
API在海龟的旧姿势和当前姿势之间进行帧转换。 [待校准@8569]