ROS tf.transform не может найти кадр, который действительно существует (можно отследить с помощью rosrun tf tf_echo) - PullRequest
0 голосов
/ 08 февраля 2019

Кто-то испытал с 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]

Я могувидите, что рамка не только существует, но и существует эффективное преобразование, доступное между map и base_link?

. Я совершенно не понимаю такого странного поведения.Любая помощь будет очень приветствоваться.Действительно, программа работает на моем ноутбуке, но не на Intel 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;
}

1 Ответ

0 голосов
/ 09 февраля 2019

Вы пытаетесь выполнить преобразование сразу после того, как создали свой слушатель 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";
}
...