时间旅行(C++) [5924]
**目标:**学习有关tf2高级时间旅行功能的知识。 [5925]
教程级别: 中级 [16770]
时间: 10分钟 [16421]
背景 [16410]
在前面的教程中,我们讨论了:doc:tf2和时间的基础知识。本教程将带我们迈出一步,并介绍一个强大的tf2技巧:时间旅行。简而言之,tf2库的一个关键功能是它能够在时间和空间上对数据进行转换。 [5926]
这个tf2时间旅行功能在各种任务中都很有用,比如长时间监测机器人的姿态或构建一个会跟随领导者“步伐”的跟随机器人。我们将利用这个时间旅行功能,在时间上回溯并编程“turtle2”在“carrot1”之后追踪5秒钟。 [5927]
时间旅行 [5928]
现在,不再让第二只乌龟去当前胡萝卜所在的位置,而是让第二只乌龟去第一个胡萝卜5秒钟前所在的位置。在``turtle_tf2_listener.cpp``文件中编辑``lookupTransform()``调用: [5930]
rclcpp::Time when = this->get_clock()->now() - rclcpp::Duration(5, 0);
t = tf_buffer_->lookupTransform(
toFrameRel,
fromFrameRel,
when,
50ms);
如果现在运行这段代码,在前5秒钟内,第二只乌龟将不知道该去哪里,因为我们还没有5秒钟的胡萝卜位置历史记录。但是在这5秒钟之后会发生什么呢?让我们试一试: [5931]
ros2 launch learning_tf2_cpp turtle_tf2_fixed_frame_demo.launch.py
![../../../_images/turtlesim_delay1.png](../../../_images/turtlesim_delay1.png)
现在你应该注意到,你的乌龟在像这个截图中一样无法控制地四处移动。让我们试着理解背后的原因。 [5932]
高级API用于查找变换(lookupTransform()) [5935]
为了询问tf2这个特定问题,我们将使用一个高级API,使我们能够明确地指定何时获取指定的转换。这是通过调用``lookupTransform()``方法并使用附加参数来实现的。你的代码现在应该是这样的: [5936]
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);
``lookupTransform()``的高级API接受六个参数: [5937]
总结一下,在后台,tf2会进行以下操作:它会计算从``carrot1``到``world``的变换。在``world``帧中,tf2会在过去到现在的时间上进行移动。而在当前时间,tf2会计算从``world``到``turtle2``的变换。 [5944]