【问题标题】:Where to see the output data send by publisher?在哪里查看发布者发送的输出数据?
【发布时间】:2018-03-13 08:35:31
【问题描述】:

我在 ROS 上做一个程序,其中发布者是订阅者的回调函数,一切进展顺利,除了我看不到数据打印在哪里。

我写的代码如下图:

    #include <ros/ros.h>
    #include <std_msgs/Int16.h>

    class pubsub
    {
    private:
        ros::NodeHandle nh;
        ros::Publisher pub;
        ros::Subscriber sub;

    public:
        void callback(const std_msgs::Int16::ConstPtr& msg) 
        {
            ROS_INFO("I heard this data: [%d]", msg->data);
            std_msgs::Int16 msg2;
            msg2.data = msg->data;
            ROS_INFO_STREAM(" I got some data");
            pub.publish(msg2);
        }

        pubsub()
        {
            pub = nh.advertise<std_msgs::Int16>("just",100);
            sub = nh.subscribe<std_msgs::Int16>("just",100,&pubsub::callback,this);
        }
    };



int main(int argc, char **argv){
    ros::init(argc,argv,"node");
    pubsub ps;
    ros::spin();
    return 0;
}

程序正在正确编译。执行时,只等待数据并且不向终端提供任何输出。

即使我在运行代码后输入整数,命令 rostopic echo /just 也不显示任何内容。

我哪里出错了?

【问题讨论】:

    标签: c++ ros robotics


    【解决方案1】:

    回调永远不会被调用,因为发布者在回调中。 事实上,你没有发布任何东西。请从 main 或构造函数发布初始消息,然后您将得到您期望的消息循环。

    【讨论】:

      【解决方案2】:

      就像 nayab 的回答中已经描述的那样,如果收到消息,您将发布消息。因为没有发送此主题的消息,所以您永远不会发送消息。您需要将消息发布到其他地方才能接收它。因此,只需将 pub 之类的新方法添加到您的 pubsub 类中。在 main 循环内部,ros::rate 以 10 Hz 为例。不要忘记添加ros::spinOnce() 以允许回调处理。这是改进后的代码:

      #include <ros/ros.h>
      #include <std_msgs/Int16.h>
      
      class pubsub
      {
      private:
          ros::NodeHandle nh;
          ros::Publisher pub;
          ros::Subscriber sub;
      
      public:
          void callback(const std_msgs::Int16::ConstPtr& msg) 
          {
              ROS_INFO("I heard this data: [%d]", msg->data);
          }
      
          void pub(int number)
          {
              std_msgs::Int16 msg;
              msg.data = number;
              ROS_INFO_STREAM("Publishing data");
              pub.publish(msg);
          }
      
          pubsub()
          {
              pub = nh.advertise<std_msgs::Int16>("just",100);
              sub = nh.subscribe<std_msgs::Int16>("just",100,&pubsub::callback,this);
          }
      };
      
      int main(int argc, char **argv)
      {
          ros::init(argc,argv,"node");
          pubsub ps;
      
          ros::Rate r(10);
          int number = 0;
          while (ros::ok())
          {
             ps.pub(number++);
             ros::spinOnce();
             r.sleep();
          }
      
          return 0;
      }
      

      【讨论】:

        【解决方案3】:
        #include <ros/ros.h>
        #include <std_msgs/Int16.h>
        
        class pubsub
        {
        private:
            ros::NodeHandle nh;
            ros::Publisher pub;
            ros::Subscriber sub;
        
        public:
            void callback(const std_msgs::Int16::ConstPtr& msg) 
            {
                ROS_INFO("I heard this data: [%d]", msg->data);
            }
        
            void pub(int number)
            {
                std_msgs::Int16 msg;
                msg.data = number;
                ROS_INFO_STREAM("Publishing data");
                pub.publish(msg);
            }
        
            pubsub()
            {
                pub = nh.advertise<std_msgs::Int16>("just",100);
                sub = nh.subscribe<std_msgs::Int16>("just",100,&pubsub::callback,this);
            }
        };
        
        int main(int argc, char **argv)
        {
            ros::init(argc,argv,"node");
            pubsub ps;
        
            ros::Rate r(10);
            int number = 0;
            while (ros::ok())
            {
               ps.pub(number++);
               ros::spinOnce();
               r.sleep();
            }
        
            return 0;`ahah sala...`enter code here`
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-24
          • 1970-01-01
          • 2020-07-28
          相关资源
          最近更新 更多