赞
踩
目标:了解 tf2 的高级时间旅行功能。
教程级别:中间
时间:10分钟
内容
在上一教程中,我们讨论了 tf2 和时间的基础知识。本教程将把我们更进一步,并揭示一个强大的tf2技巧:时间旅行。简而言之,tf2库的一个关键特征是它能够在时间和空间中转换数据。
这个tf2时间旅行功能可用于各种任务,例如长时间监视机器人的姿势或构建将遵循领导者“步骤”的跟随机器人。我们将使用该时间旅行功能查找时光倒流,并程序跟踪5秒。turtle2
carrot1
首先,让我们回到上一教程“使用时间”中结束的位置。转到您的包裹。learning_tf2_cpp
现在,我们不是让第二只去机器人现在的位置,而是让第二只去5秒前第一只机器人的地方。将文件中的调用编辑为lookupTransform()
turtle_tf2_listener.cpp
rclcpp::Time when = this->get_clock()->now() - rclcpp::Duration(5, 0);
transformStamped = tf_buffer_->lookupTransform(
toFrameRel,
fromFrameRel,
when,
50ms);
现在,如果你运行这个,在前5秒,第二只将不知道去哪里,因为我们还没有机器人姿势的5秒历史。但是在这5秒钟之后会发生什么呢?让我们试一试:
ros2 launch learning_tf2_cpp turtle_tf2_fixed_frame_demo.launch.py
您现在应该注意到您的正在不受控制地行驶,就像此屏幕截图中一样。让我们试着理解这种行为背后的原因。
在我们的代码中,我们向tf2提出了以下问题:“相对于5秒前,5秒前的姿势是什么?这意味着我们正在根据5秒前的位置以及5秒前第一只机器人的位置来控制第二只。carrot1
turtle2
但是,我们真正想问的是:“相对于当前位置,5秒前的姿势是什么?carrot1
turtle2
为了向 tf2 提出该特定问题,我们将使用一个高级 API,该 API 使我们能够明确地说出何时获取指定的转换。这是通过使用其他参数调用该方法来完成的。您的代码现在将如下所示:lookupTransform()
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);
的高级 API 采用六个参数:lookupTransform()
目标帧第二个机器人
第二个机器人当前时间
源帧第一个机器人
评估源帧的时间第一个机器人5秒前的时间
不随时间变化的帧,在本例中为帧world
等待目标帧变为可用所需的时间
总而言之,tf2 在后台执行以下操作。过去,它计算从 到 的转换。在帧中,tf2 时间从过去到现在。在当前时间,tf2 计算从 到 的转换。carrot1
world
world
world
turtle2
让我们再次运行模拟,这次使用高级时间旅行 API:
ros2 launch learning_tf2_cpp turtle_tf2_fixed_frame_demo.launch.py
是的,第二只被引导到5秒前第一只机器人的地方!
在本教程中,您已经看到了 tf2 的高级功能之一。您了解到 tf2 可以及时转换数据,并通过 turtlesim 示例学习了如何执行此操作。tf2允许您使用高级API回到过去,并在海龟的旧姿势和当前姿势之间进行帧转换。lookupTransform()
参考:
Traveling in time (C++) — ROS 2 Documentation: Rolling documentation
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。