警告
您正在阅读的 ROS 2 文档版本已达到 EOL(生命周期结束),不再受官方支持。如果您想了解最新信息,请访问 Jazzy.
时间旅行(Python)
目标 了解 tf2 的高级时间旅行功能。
辅导水平: 中级
时间 10 分钟
背景介绍
在上一教程中,我们讨论了 TF2 和时间的基础知识.本教程将让我们更进一步,揭示一个强大的 tf2 技巧:时间旅行。简而言之,tf2 库的主要功能之一就是能够在时间和空间上转换数据。
tf2 的时空旅行功能可用于各种任务,例如长时间监控机器人的姿势,或者制造一个跟随者机器人,跟随领导者的 "脚步"。我们将利用时空旅行功能,回溯过去查找变换并编程 乌龟2
落后 5 秒 胡萝卜1
.
时间旅行
首先,让我们回到上一个教程结束的地方 利用时间.前往您的 学习_tf2_py
包装
现在,我们不再让第二只乌龟去胡萝卜现在所在的位置,而是让第二只乌龟去 5 秒钟前第一只胡萝卜所在的位置。编辑 lookup_transform()
调入 turtle_tf2_listener.py
文件到
当 = 自我.获取时钟().现在() - rclpy.时间.持续时间(秒钟=5.0)
变速器 = 自我.tf_buffer.查找变换(
至框架关系,
从帧关系,
当,
超时=rclpy.会期.持续时间(秒钟=0.05))
现在,如果你运行这个程序,在最初的 5 秒钟里,第二只乌龟不知道该去哪里,因为我们还没有 5 秒钟的胡萝卜姿势历史记录。但这 5 秒钟之后会发生什么呢?让我们试一试:
ros2 launch learning_tf2_py turtle_tf2_fixed_frame_demo.launch.py

现在你应该注意到,你的乌龟正在不受控制地到处乱跑,就像这张截图一样。让我们来了解一下这种行为背后的原因。
在我们的代码中,我们向 tf2 提出了以下问题:"的姿势是什么?
胡萝卜1
5 秒前,相对于乌龟2
5秒前?"。这意味着我们要根据第二只乌龟 5 秒前的位置以及第一根胡萝卜 5 秒前的位置来控制它。然而,我们真正想问的是"...... "的姿势是什么?
胡萝卜1
5 秒前,相对于当前位置的乌龟2
?".
lookup_transform() 的高级 API
为了向 tf2 提出这个特殊问题,我们将使用高级应用程序接口(API),它能让我们明确说明何时获取指定的转换。我们可以通过调用 lookup_transform_full()
方法,并添加额外参数。您现在的代码看起来会是这样
当 = 自我.获取时钟().现在() - rclpy.时间.持续时间(秒钟=5.0)
变速器 = 自我.tf_buffer.全文查找(
target_frame=至框架关系,
目标时间=rclpy.时间.时间(),
源帧=从帧关系,
源时间=当,
固定帧='世界';,
超时=rclpy.会期.持续时间(秒钟=0.05))
的高级应用程序接口 lookup_transform_full()
需要六个参数:
目标框架
转变为
来源框架
评估源帧的时间
不随时间变化的帧,在本例中为
世界
画框等待目标帧可用的时间
总之,tf2 会在后台执行以下操作。在过去,它会从 胡萝卜1
到 世界
.在 世界
帧,tf2 从过去穿越到现在。而在当前时间,tf2 会计算从 世界
到 乌龟2
.
检查结果
让我们再次运行模拟,这次使用高级时空旅行应用程序接口:
ros2 launch learning_tf2_py turtle_tf2_fixed_frame_demo.launch.py

是的,第二只乌龟被引向 5 秒钟前第一只胡萝卜所在的位置!
摘要
在本教程中,您看到了 tf2 的高级功能之一。您了解到 tf2 可以及时转换数据,并学习了如何通过海龟模拟示例实现这一功能。 lookup_transform_full()
应用程序接口。