使用tf::transformPose进行坐标变换时候报错:
[ERROR] [1456669076.279804500]: Lookup would require extrapolation into the future.
Requested time 1456669076.279616253 but the latest data is at time 1456669076.159341977,
when looking up transform from frame …
原始变换代码类似如下:
#include <tf/transform_listener.h>
#include <nav_msgs/Odometry.h>
#include <ros/ros.h>
void odomCallBack(const nav_msgs::Odometry::ConstPtr& odom)
{
// transform from "odom" to "map"
tf::TransformListener listener;
geometry_msgs::PoseStamped pose_odom;
pose_odom.header = odom->header;
pose_odom.pose = odom->pose.pose;
geometry_msgs::PoseStamped pose_map;
try{
// listener.waitForTransform(...); //这里省略这个书写,实际中可能会用到
listener.transformPose("map", pose_odom, pose_map);
}
catch( tf::TransformException ex)
{
ROS_WARN("transfrom exception : %s",ex.what());
return;
}
ROS_INFO_STREAM(pose_map);
}
报错原因是由于tf的会把监听的内容存放到一个缓存中,然后再读取相关的内容,而这个过程可能会有几毫秒的延迟,也就是,tf的监听器并不能监听到“现在”的变换,
更改这个错误需要改变时间戳,不能使用ros::Time::now(),或者传感器给定的默认时间戳,需要使用ros::Time()替换原来的时间戳。
增加下面一行:
pose_odom.header.stamp = ros::Time();
更改后完整程序为:
#include <tf/transform_listener.h>
#include <nav_msgs/Odometry.h>
#include <ros/ros.h>
void odomCallBack(const nav_msgs::Odometry::ConstPtr& odom)
{
// transform from "odom" to "map"
tf::TransformListener listener;
geometry_msgs::PoseStamped pose_odom;
pose_odom.header = odom->header;
pose_odom.header.stamp = ros::Time(); //增加了这行
pose_odom.pose = odom->pose.pose;
geometry_msgs::PoseStamped pose_map;
try{
// listener.waitForTransform(...); //这里省略这个书写,实际中可能会用到
listener.transformPose("map", pose_odom, pose_map);
}
catch( tf::TransformException ex)
{
ROS_WARN("transfrom exception : %s",ex.what());
return;
}
ROS_INFO_STREAM(pose_map);
}
参考:
https://blog.csdn.net/start_from_scratch/article/details/50762293
https://www.cnblogs.com/qyit/p/11418847.html