这个问题可能有几个原因:
-
tf树没有正确更新:你可能需要确保你的tf树已经正确更新,并且"body"帧已经被发布。你可以使用
rosrun tf view_frames
来查看你的tf树。 -
帧名称错误:确保你在调用
lookupTransform
时使用的帧名称与发布的名称完全匹配,包括大小写和任何下划线。 -
tf消息延迟:可能是因为tf消息还没有到达,你可以尝试增加等待tf消息的时间。
-
tf消息没有连续:如果你的tf消息没有连续发布,可能会出现这个问题。你需要确保你的tf消息是连续发布的。
-
tf树的问题:如果你的tf树有问题,例如有循环依赖或者断开的链,也可能会出现这个问题。你需要检查你的tf树是否有这些问题。
在Rviz中我的body已经可以看到了,然后可以排除第二、四、五的情况,所以我猜测可能是tf消息延迟,所以我增加了睡眠时间
Eigen::Matrix4d getTransform(const string target_frame, const string source_frame){
static tf2_ros::Buffer buffer;
static tf2_ros::TransformListener listener(buffer);
// std::chrono::milliseconds dur(200);
std::chrono::milliseconds dur(300);
std::this_thread::sleep_for(dur);
geometry_msgs::TransformStamped tfs;
try
{
/* code */
tfs = buffer.lookupTransform(target_frame, source_frame, ros::Time(0));
}
catch(const std::exception& e)
{
std::cerr << e.what() << '\n';
}
Eigen::Matrix4d T = Eigen::Matrix4d::Identity();
Eigen::Quaterniond q(tfs.transform.rotation.w, tfs.transform.rotation.x,
tfs.transform.rotation.y, tfs.transform.rotation.z);
T.block<3,3>(0,0) = q.toRotationMatrix();
T.block<3,1>(0,3) = Eigen::Vector3d(tfs.transform.translation.x,
tfs.transform.translation.y,
tfs.transform.translation.z);
return T;
}
sleep的时间由原来的200增加到了300,发现body就可以找到了