《ROS中级课程》第17课 tf2之Traveling in time(C++)

Traveling in time(C++)

参考资料:https://docs.ros.org/en/iron/Tutorials/Intermediate/Tf2/Time-Travel-With-Tf2-Cpp.html

目标

学习tf2的高级时间旅行特征。

背景

在上一节课程中,我们讨论了tf2和时间的基本内容。这一节,我们会深入探究tf2的功能:时间旅行。简而言之,tf2库的一个关键特点就是它能够在时间和空间上转换数据。

tf2时间旅行特点对各种任务都有用处,如长时间监控机器人的姿态或构建一个跟随机器人(跟随领航机器人的运动)。我们将使用时间旅行功能来查找过去的转换并让海龟turtle2运动到carrot15秒前的位置。

时间旅行

进入功能包learning_tf2_cpp,修改turtle_tf2_listener.cpp。让第二只海龟运动到胡萝卜5秒前的位置,而不是胡萝卜当前位置。

rclcpp::Time when = this->get_clock()->now() - rclcpp::Duration(5, 0);
try {
    t = tf_buffer_->lookupTransform(
        toFrameRel,
        fromFrameRel,
        when,
        50ms);
} catch (const tf2::TransformException & ex) {

然后,编译运行。会发现,在开始的5秒钟,第二只海龟不会运动,因为还没有胡萝卜姿态的5秒历史数据。但5秒后会发生什么?
在这里插入图片描述
可以看到海龟在不受控制的乱跑,背后原因是:

  1. 在代码中,我们询问了tf2这样一个问题:carrot15秒前的姿态是什么,与之关联的turtle25秒前的姿态是什么?这也表明我们正在基于第二只海龟和第一个胡萝卜5秒前的位置来控制第二只海龟。
  2. 但是,我们真正想问的是:carrot15秒前的姿态是什么,与之关联的turtle2当前位置在哪?

lookupTransform()的高级API

为了询问tf2上述第二点的特定问题,我们将使用一个高级API,这使我们能够明确地说明何时获得指定的转换。这可以通过使用lookupTransform()的额外参数来完成。代码修改如下:

rclcpp::Time now = this->get_clock()->now();
rclcpp::Time when = now - rclcpp::Duration(5, 0);
try {
    t = tf_buffer_->lookupTransform(
        toFrameRel,
        now,
        fromFrameRel,
        when,
        "world",
        50ms);
} catch (const tf2::TransformException & ex) {

这个lookupTransform()高级API采用了6个参数:

  1. 目标坐标系target frame
  2. 转换时间
  3. 源坐标系source frame
  4. 源坐标系将被评估的时间点
  5. 不随时间改变的坐标系,本例中是world坐标系
  6. 等待目标坐标系可用的时间

综上所述,tf2在后台完成了以下工作。在过去,它计算从carrot1world的坐标系转换。在world坐标系中,tf2时间从过去到现在。在当前时间,tf2计算从worldturtle2的转换。

检查结果

编译功能包,再次运行仿真,会发现第二只海龟直接运动到胡萝卜5秒前的位置。

ros2 launch learning_tf2_cpp turtle_tf2_fixed_frame_demo_launch.py

在这里插入图片描述

总结

在本课程中,你见识了tf2的一个高级特点。tf2能够及时转换数据,并通过turtlesim示例学习了这一功能。tf2允许你回到过去并使用lookupTransformAPI实现在海龟的旧姿态和当前姿态之间的坐标系转换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值