ros2 从零开始31 时间旅行c++

📅 2026/7/13 8:30:48
ros2 从零开始31 时间旅行c++
ros2 从零开始31 时间旅行c前言背景在之前的教程中我们讨论了tf2和时间的基础知识。本教程将进一步深入介绍一个强大的tf2技巧时间旅行。简而言之tf2库的关键特性之一就是它不仅能在空间上变换数据还能在时间上进行变换。这种tf2时间旅行功能可应用于多种任务例如长时间监测机器人的位姿或者构建一个跟随领导者“足迹”的跟随机器人。我们将利用这一时间旅行功能来查找过去的变换并编程让turtle2跟随carrot1延迟5秒。实践本次不另外创建包我们使用《编写静态广播C》。1.时间旅行在learning_tf2_cpp/src目录下打开文件turtle_tf2_listener.cpp,找到使用lookupTransform的地方修改成如下rclcpp::Time when this-get_clock()-now() - rclcpp::Duration(5, 0); t tf_buffer_-lookupTransform( toFrameRel, fromFrameRel, when, 50ms);我们指定时间参数为rclcpp::Time when this-get_clock()-now() - rclcpp::Duration(5, 0); 也就是 当前时间减5秒。现在如果你运行它刚刚开始的5秒 第2只乌龟不知道往哪里移动因为没有5秒前的历史轨迹数据那5秒之后呢 试试吧。编译运行rootbc2bf85b2e4a:~/ros2_ws# ros2 launch learning_tf2_cpp turtle_tf2_demo_launch.xml外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传你也注意到了小乌龟像上图一样不受控制般的乱动。 让我们试图理解发生这种现象的背后原因。在我们的代码中我们向tf2提出了这样一个问题5秒前carrot1相对于5秒前turtle2的位姿是什么这意味着我们控制turtle2乌龟的依据是它5秒前的位置以及carrot1的5秒前的位置。然而我们真正想知道的是5秒前carrot1相对于当前turtle2位置的位姿是什么2 修复该问题为了向tf2提出这个特定的问题我们将使用一个高级API它使我们能够明确指定何时获取特定的变换。这通过调用带有额外参数的lookupTransform()方法来实现。修改如下rclcpp::Time now this-get_clock()-now(); rclcpp::Time when now - rclcpp::Duration(5, 0); t tf_buffer_-lookupTransform( toFrameRel, now, fromFrameRel, when, world, 50ms);高级API的lookupTransform()方法接受六个参数目标坐标系要变换到的时间点源坐标系源坐标系将被评估的时间点不随时间变化的坐标系在本例中为世界坐标系等待目标坐标系可用的时间总的来说tf2在后台执行以下操作在过去它计算从carrot1到世界坐标系的变换。在世界坐标系中tf2从过去时间旅行到现在。在当前时间tf2计算从世界坐标系到turtle2的变换。3 检查结果重新编译运行查看结果。rootbc2bf85b2e4a:~/ros2_ws# ros2 launch learning_tf2_cpp turtle_tf2_demo_launch.xml没错第二只乌龟被引导到了5秒前carrot所在的位置总结在本教程中你已经了解了tf2的高级特性之一。你学到了tf2可以在时间上变换数据并通过turtlesim示例学会了如何实现这一功能。通过使用高级的lookupTransform() APItf2让你能够回到过去在乌龟的旧位姿和当前位姿之间进行坐标系变换。