五 tf / Tutorials / tf and Time (C++)

原文地址:http://wiki.ros.org/tf/Tutorials/tf and Time (C%2B%2B)
Learning about tf and time (C++)
描述:本教程教您使用waitForTransform函数等待tf树中可用的transform。

1 tf and Time

在前面的教程中,我们学习了tf如何跟踪坐标系树。该树随时间变化,并且tf存储每个转换的时间快照(默认情况下最多10秒)。到目前为止,我们使用lookupTransform()函数来访问该tf树中最新的可用transforms,而不知道该转换是在什么时候记录的。本教程将教您如何在特定时间获得transform。
让我们回到添加frame教程的结尾。到您的包中获取教程:

  $ roscd learning_tf

打开文件src/turtle_tf_listener.cpp ,看第25-27行:

   try{
      listener.lookupTransform("/turtle2", "/carrot1",  
                               ros::Time(0), transform);

让我们让turtle2跟在turtle1后面,而不是carrot。将代码更改如下:

   try{
      listener.lookupTransform("/turtle2", "/turtle1",  
                               ros::Time(0), transform);

您还可以看到我们指定的时间等于0。对于tf,时间0表示缓冲区中的“最新可用”transform。现在,更改这一行以在当前时间获得转换,“now()”:

  try{
    listener.lookupTransform("/turtle2", "/turtle1",  
                             ros::Time::now(), transform);

首先,确保您停止了前一个教程中的启动文件(使用ctrl-c)。编译代码,然后再次运行它:

  $ catkin_make
  $ roslaunch learning_tf start_demo.launch

因此,所有突然的lookupTransform()都失败了,重复地告诉您:

[ERROR] [1287871653.885277559]: You requested a transform that is 0.018 miliseconds in the past, but the most recent transform in the tf buffer is 7.681 miliseconds old.                                                 
 When trying to transform between /turtle1 and /turtle2.  
....

为什么会这样?每个listener都有一个缓冲区,用来存储来自不同tf broadcaster的所有坐标transforms。当broadcaster发送transform时,transform进入缓冲区需要一些时间(通常是几毫秒)。因此,当您在时间“现在”请求frame transform时,您应该等待几毫秒以获得该信息。

2 Wait for transforms

tf提供了一个很好的工具,可以等待transform变为可用。让我们看看代码会是什么样子:

  try{
    ros::Time now = ros::Time::now();
    listener.waitForTransform("/turtle2", "/turtle1",
                              now, ros::Duration(3.0));
    listener.lookupTransform("/turtle2", "/turtle1",
                             now, transform);

waitForTransform() takes四个arguments:
(1) Wait for the transform from this frame…
(2) … to this frame,
(3) at this time, and
(4) timeout: don’t wait for longer than this maximum duration
注意:这个例子使用了ros::Time::.()。通常,这将是希望进行transform的数据的时间戳。
因此,waitForTransform()实际上将阻塞,直到两个turtle之间的transform变得可用(这通常需要几毫秒),或者(如果转换不可用)直到超时达到。
首先,确保您停止了前一个教程中的启动文件(使用ctrl-c)。现在编译网络代码,然后再次运行它:

  $ catkin_make
  $ roslaunch learning_tf start_demo.launch

但是等等,您可能仍然会看到错误一次(error msg可能变化):

[ERROR] [1287872014.408401177]: You requested a transform that is 3.009 seconds in the past, but the tf buffer only has a history of 2.688 seconds.                                                                   
 When trying to transform between /turtle1 and /turtle2.

这是因为turtle2需要非零的时间来生成并开始发布tf frame。所以您第一次请求时,/turtle2 frame可能不存在,当请求transform时,transform可能还不存在,并且第一次失败。在第一次transform之后,所有transform都存在,并且turtle的行为如预期。

3 Checking the results

现在,您应该再次能够简单地使用箭头键驱动turtle1(确保您的终端窗口是活动的,而不是您的模拟器窗口),您将看到turtle2跟在turtle1后面!
所以,你注意到turtle的行为没有明显的差异。这是因为实际的定时差只有几毫秒。但是为什么我们要从Time(0)改变到now()?只是为了教您关于tf缓冲区以及与之相关的时间延迟。对于真正的tf用例,通常使用Time(0)是完美的。
现在您已经准备好进入下一个教程,在那里您将学习tf中的time travel。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值