浅析TF树中ros::Time(0)和ros::Time::now()

在处理ROS TF树时遇到错误,由于请求坐标变换时使用ros::Time::now(),导致与缓冲区数据不匹配。分析表明,应使用ros::Time(0)来获取缓冲区中最新的TF数据,或者加入延时等待函数。总结了ros::Time(0)和ros::Time::now()的差异及其在TF坐标变换中的应用。

问题产生:

最近在跑一个程序时,需要采集TF树中两个坐标的坐标变换,但是在运用过程中,通过下面语句进行坐标采集时,出现如下报错:

语句:

tf_transform = tf_buffer.lookupTransform(desired_camera_frame, current_camera_frame, ros::Time(0), ros::Duration(0));

这里我想获取坐标desired_camera_frame和current_camera_frame的坐标变换。

报错信息:

[ERROR] [1619773238.770668534]: Lookup would require extrapolation into the past.  Requested time 1619773238.270257792 but the earliest data is at time 1619773238.276599648, when looking up transform from frame [camera_color_optical_frame] to frame [desired_cam_frame]

在这里插入图片描述

问题分析:

可以看到我们获取信息的时间与数据最早的时间并不匹配。
因为每个监听器都有一个缓冲区,存储来自不同TF广播的所有坐标转换。当广播者发送转换时,转换进入缓冲区需要一段时间(通常是几毫秒)。所以,当您在“现在”请求帧转换时,从缓冲区提取不到当前的发布变换,您应该等待几毫秒,等待该信息

ROS里,你想问的可能是`ros::Time(0)``ros::Time::now()`的区别。 `ros::Time(0)`表示使用缓冲中最新的tf数据。在调用`lookupTransform`这类函数时,传入`ros::Time(0)`,就会获取tf中最新存储的两个坐标系之间的变换关系,而不考虑当前的实际时间 [^2]。 `ros::Time::now()`表示当前系统时间的时间戳,它返回的是调用该函数时刻的精确时间。当在`lookupTransform`等函数中使用`ros::Time::now()`时,意味着要获取在当前这个精确时刻两个坐标系之间的变换关系。不过,由于tf数据的发布接收存在一定延迟,使用`ros::Time::now()`可能会因为数据还未更新而导致查询失败,所以通常需要结合`waitForTransform`函数来等待变换信息更新 [^1][^2]。 以下是简单的代码示例: ```cpp #include <ros/ros.h> #include <tf/transform_listener.h> int main(int argc, char** argv) { ros::init(argc, argv, "tf_example"); ros::NodeHandle nh; tf::TransformListener listener; // 使用ros::Time(0) tf::StampedTransform transform_zero; try { listener.lookupTransform("/target_frame", "/source_frame", ros::Time(0), transform_zero); } catch (tf::TransformException &ex) { ROS_ERROR("%s", ex.what()); } // 使用ros::Time::now() ros::Time now = ros::Time::now(); tf::StampedTransform transform_now; try { listener.waitForTransform("/target_frame", "/source_frame", now, ros::Duration(1.0)); listener.lookupTransform("/target_frame", "/source_frame", now, transform_now); } catch (tf::TransformException &ex) { ROS_ERROR("%s", ex.what()); } return 0; } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值