ROS tf.transform 找不到实际存在的帧(可以用 rosrun tf tf_echo 追踪)

fab*_*ice 7 ros ubuntu-16.04

有人经历过 ROS 的以下行为吗? tf.lookupTransform("map", "base_link", ros::Time(0), transform);

告诉你:"base_link" passed to lookupTransform argument target_frame does not exist但如果我输入:

rosrun tf tf_echo base_link map
At time 1549633095.937
- Translation: [-0.005, 0.020, -0.129]
- Rotation: in Quaternion [0.033, 0.063, 0.002, 0.997]
            in RPY (radian) [0.066, 0.127, 0.009]
Run Code Online (Sandbox Code Playgroud)

我可以看到框架不仅存在,而且在map和之间存在有效的转换base_link

我对这种奇怪的行为一无所知。任何帮助将非常受欢迎。该程序确实在我的笔记本电脑上运行,但在英特尔 NUC 上不起作用。

下面给出了完整的一段代码(实际上我在创建 costmap_2d::costmap2DROS 期间出现了分段错误,看起来是因为 tf.transform 失败):

 #include <ros/ros.h>
 #include <tf/transform_listener.h>
 #include <costmap_2d/costmap_2d_ros.h>

 int main(int argc, char **argv) {

    ros::init(argc, argv, "hector_exploration_node");

    ros::NodeHandle nh;

    tf::TransformListener tf;

    tf::StampedTransform transform;

    try{

            tf.lookupTransform("/base_link", "/map", ros::Time(0), transform);
            std::cout << "transform exist\n";
    }
    catch (tf::TransformException ex){
            ROS_ERROR("%s",ex.what());
            ros::Duration(1.0).sleep();
     }

    std::cout << "before costmap\n";
    costmap_2d::Costmap2DROS costmap("global_costmap", tf);
    costmap.start();        
    ros::Rate rate(10);

    while (ros::ok()) 
            ros::spin();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Tik*_*ik0 6

您尝试在创建 tf 侦听器后立即执行转换,这通常是一种不好的做法,原因如下: 侦听器的缓冲区包含有关最近转换的所有信息,实际上是空的。因此,任何查找缓冲区的变换都找不到它需要的帧。最好在创建侦听器后等待一段时间,以便缓冲区填满。但 tf 不仅仅是睡觉,它还有自己的实现来等待你要求的帧:waitForTransform。可以按照此处的说明使用。因此,您只需try按如下方式扩展您的块:

try{
        tf.waitForTransform("/base_link", "/map", ros::Time(0), ros::Duration(3.0));
        tf.lookupTransform("/base_link", "/map", ros::Time(0), transform);
        std::cout << "transform exist\n";
}
Run Code Online (Sandbox Code Playgroud)