turtle_tf_message_filter msgcallback function is never called

asked 2018-04-21 22:11:03 -0500

linglingweiling gravatar image

Hi, I'm a green hand.And learning tf, but I meet a trouble. Please help me!

I am I'm following from this page tf/Tutorials/Stamped datatypes with tf::MessageFilter ,but meet the msgcallback never called. Here is my code:


#include "ros/ros.h"
#include "tf/transform_listener.h"
#include "tf/message_filter.h"
#include "message_filters/subscriber.h"

class PoseDrawer
{
    public: 
        PoseDrawer() : tf_() , target_frame_("turtle1")
        {   
             ROS_INFO("PoseDrawer construct starting!");

             point_sub_.subscribe(nh_, "turtle_point_stamped", 10);

             tf_filter_ = new tf::MessageFilter<geometry_msgs::PointStamped>(point_sub_, tf_, target_frame_, 10);

             try
             {
                   ROS_INFO("try starting!");

                   //The wrong, msgCallback is never called!!!! And others ware OK!
                   tf_filter_->registerCallback( boost::bind(&PoseDrawer::msgCallback, this, _1));

                   ROS_INFO("try ending!");
             }
             catch(tf::TransformException &ex)
             {
                   ROS_ERROR("%s",ex.what());
             }

            ROS_INFO("PoseDrawer construct end");

        };

        virtual ~PoseDrawer()
        {
              ROS_INFO("PoseDrawer destory starting!");
        };

    private:
        message_filters::Subscriber<geometry_msgs::PointStamped> point_sub_;

        tf::TransformListener tf_;

        tf::MessageFilter<geometry_msgs::PointStamped> * tf_filter_;

        ros::NodeHandle nh_;

        std::string target_frame_;

        //Callback to register with tf::MessageFilter to
        // be called when transforms are available
        void msgCallback(const boost::shared_ptr<const geometry_msgs::PointStamped>& point_ptr)
        {
              ROS_INFO("msgCallback is listening!");

              geometry_msgs::PointStamped point_out;

              try
              {   
                    tf_.transformPoint(target_frame_, *point_ptr, point_out);

                    printf("point of turtle 3 in frame of turtle 1 Position(x:%f y:%f z:%f)\n",
                               point_out.point.x,
                               point_out.point.y,
                               point_out.point.z);
               }
               catch (tf::TransformException &ex)
               {
                   printf("Failure %s\n", ex.what());
               }
          };

          int main(int argc, char ** argv)
          {
            ros::init(argc, argv, "pose_drawer"); //Init ROS
            PoseDrawer pd; //Construct class
            ros::spin(); // Run until interupted 
          };
};

First,launch a launch file when I finished in Writing a tf broadcaster (C++) ,Writing a tf listener (C++), tf/TutorialsAdding a frame (C++)

 $ roslaunch learning_tf start_demo.launch

Then ,run the file , it call me that:

$ rosrun learning_tf turtle_tf_message_filte

[ INFO] [1522254522.667447695]: PoseDrawer construct starting!
[ INFO] [1522254522.669954462]: try starting!
[ INFO] [1522254522.669980229]: try ending!
[ INFO] [1522254522.669992621]: PoseDrawer construct end

And I am sure msgCallback function is never called! But I don't know how to solve this trouble. Please help me !

edit retag flag offensive close merge delete