< >
Home » ROS与C++入门教程 » ROS与C++入门教程-tf-Time travel(时间穿梭)

ROS与C++入门教程-tf-Time travel(时间穿梭)

ROS与C++入门教程-tf-Time travel(时间穿梭)

说明:

  • 介绍tf的高级时间穿梭功能

Time travel

  • 利用上一个教程的文件。
  • 打开src/turtle_tf_listener.cpp,找到25-30,如下:
  try{
    ros::Time now = ros::Time::now();
    listener.waitForTransform("/turtle2", "/turtle1",
                              now, ros::Duration(1.0));
    listener.lookupTransform("/turtle2", "/turtle1",
                             now, transform);
  • 现在,不是让turtle2去到turtle1当前时间的地方,而让turtle2去turtle1是5秒前的地方:
try{
    ros::Time past = ros::Time::now() - ros::Duration(5.0);
    listener.waitForTransform("/turtle2", "/turtle1",
                              past, ros::Duration(1.0));
    listener.lookupTransform("/turtle2", "/turtle1",
                             past, transform);
  • 编译运行:
$ make  or  catkin_make
$ roslaunch learning_tf start_demo.launch
  • 你会期望看到什么? 在第一个5秒钟,第二只乌龟不知道去哪里,因为我们还没有第一只乌龟5秒的历史。

  • 但是这5秒后呢?效果图:
    请输入图片描述

  • 类似截图,你的海龟是不可控制? 那么发生了什么?

  • 我们问TF:相对于/turtle2 5秒前,/turtle1 5秒前的姿势是什么?

  • 这意味着我们控制/turtle2基于5秒前的位置以及/turtle1在5秒前的位置。

  • 那应该问:相对于/turtle2目前的位置,/turtle1 5秒前的姿势是什么?

高级API

  • 回答上面问题,依赖高级API,示例代码:
  try{
    ros::Time now = ros::Time::now();
    ros::Time past = now - ros::Duration(5.0);
    listener.waitForTransform("/turtle2", now,
                              "/turtle1", past,
                              "/world", ros::Duration(1.0));
    listener.lookupTransform("/turtle2", now,
                             "/turtle1", past,
                             "/world", transform);
  • 这个lookupTransform()API,有六个参数:

      1. 变换从坐标系turtle2
      1. 在now时间
      1. 到turtle1坐标系
      1. 在past时间
      1. 指定不随时间改变的坐标系,这里是world
      1. 变换结果保存的变量
  • waitForTransform()跟lookupTransform()一样有6个相应参数。

  • 效果图示:
    请输入图片描述

  • 这个图显示了tf在后台做什么。

  • 在past时间,它计算从turtle1到world坐标系的变换。

  • 在world坐标系,tf时间从past到now。

  • 在now时间,tf计算从world到turtle2坐标系的变换。

检查结果:

  • 编译运行:
$ catkin_make
$ roslaunch learning_tf start_demo.launch
  • 效果:turtle2是指向turtle1 5秒前的地方!

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ROS与C++入门教程