问题产生:
最近在跑一个程序时,需要采集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 TF树时遇到错误,由于请求坐标变换时使用ros::Time::now(),导致与缓冲区数据不匹配。分析表明,应使用ros::Time(0)来获取缓冲区中最新的TF数据,或者加入延时等待函数。总结了ros::Time(0)和ros::Time::now()的差异及其在TF坐标变换中的应用。
最低0.47元/天 解锁文章
1984





