• 基于ros---一个完整的实现topic 发布和监听的类和msg的简单使用(使用c++)


    首先,需要把ID_Data.msg拷贝到当前包的msg目录内,当然可以直接新建ID_Data.msg文件在msg目录内其内容只有两行如下:
     int32 id
    int16[8] data 
    然后在CmakeList.txt中添加如下msg编译信息。
     add_message_files(
       [...]
       ID_Data.msg
       [...]
     )
    and make sure follow setup:
    catkin_package(
      ...
      CATKIN_DEPENDS message_runtime ...
      ...)
    这样ros会自动识别msg文件,生成ID_Data.h头文件。若要使用已定义的发布和接收类需要包含如下
    #include "beginner_tutorials/ID_Data.h"//using for notie event
    其中beginner_tutorials是我ID_Data.msg所在的不同的包要做修改,完整的实现的类如下
    class notice_pub_sub
    {
    public:
        boost::function<void (const beginner_tutorials::ID_Data::ConstPtr&)> notice_pub_sub_msgCallbackFun;
    
    
        notice_pub_sub();
        void notice_pub_sub_listener();
        void notice_pub_sub_pulisher(beginner_tutorials::ID_Data id_data);
        void notice_display(beginner_tutorials::ID_Data notice_msg,bool set);
        void notice_sub_spinner(char set);
    
    
    private:
        ros::NodeHandle notice_handle;
        ros::Subscriber notice_subscriber;
        ros::Publisher notice_publisher;
        ros::SubscribeOptions notice_ops;
        ros::AsyncSpinner *notice_spinner;
        ros::CallbackQueue notice_callbackqueue;
        void notice_msgCallback(const beginner_tutorials::ID_Data::ConstPtr &notice_msg);
    };
    
    
    notice_pub_sub::notice_pub_sub()
    {
        notice_pub_sub_msgCallbackFun=boost::bind(&notice_pub_sub::notice_msgCallback,this,_1);
        notice_ops=ros::SubscribeOptions::create<beginner_tutorials::ID_Data>(
                    "/notice",
                    1,
                    notice_pub_sub_msgCallbackFun,
                    ros::VoidPtr(),
                    &notice_callbackqueue
                    );
        notice_subscriber=notice_handle.subscribe(notice_ops);
        notice_spinner=new ros::AsyncSpinner(1,&notice_callbackqueue);
    
    
        notice_publisher=notice_handle.advertise<beginner_tutorials::ID_Data>("/notice",1);
    }
    
    
    void notice_pub_sub::notice_pub_sub_listener()
    {
    
    
    }
    
    
    void notice_pub_sub::notice_pub_sub_pulisher(beginner_tutorials::ID_Data id_data)
    {
        notice_publisher.publish(id_data);
    }
    
    
    void notice_pub_sub::notice_display(beginner_tutorials::ID_Data notice_msg,bool set)
    {
    
    
        if(set)
        {
            printf("REC Notice message,ID: %u,Data: ",notice_msg.id);
            for(char i=0;i<8;i++)
            {
                printf("%u ",notice_msg.data[i]);
                if(i==7) printf("
    ");
            }
    
    
        }
    
    
    }
    void notice_pub_sub::notice_msgCallback(const beginner_tutorials::ID_Data::ConstPtr ¬ice_msg)
    {
    
    
        beginner_tutorials::ID_Data notice_message;
        notice_message.id=0;
        for(char i=0;i<8;i++)notice_message.data[i]=0;
    
    
        notice_message.id=notice_msg->id;
        for(char i=0;i<8;i++)notice_message.data[i]=notice_msg->data[i];
    
    
        notice_pub_sub::notice_display(notice_message,true);//是否显示当前接受到的数据
    
    
        if(notice_message.id==1 && notice_message.data[0]==1)//close flag
        {
            close_hand_flag=true;//个人数据接收的处理,请替换
        }
        if(notice_message.id==1 && notice_message.data[0]==0)//open flag
        {
            open_hand_flag=true;//个人数据接收的处理,请替换
        }
    
    
    }
    
    void notice_pub_sub::notice_sub_spinner(char set)
    {
        if(set==1)
            notice_spinner->start();
        if(set==0)
            notice_spinner->stop();
    }


    使用时先定义类,然后定义数据,注意类的定义不能放在while(ros::ok()){...}循环内,定义完成后,在该片段程序末尾调用notice_test.notice_sub_spinner(1)即可启动回调进程,类似开始在此处处理接受中断,不调用该语句则不会触发notice_msgCallback()中的处理,定义示例如下:
    notice_pub_sub notice_test;
    beginner_tutorials::ID_Data notice_data_pub;//定义数据类型,最后在定义后进行初始化0操作。
    notice_data_pub.id=0;
    for(int i=0;i<8;i++)notice_data_pub.data[i]=0;
    数据的监听处理都在notice_msgCallback()中实现,示例代码中我定义了两个全局标志,使用时应该注意替换我自己的处理逻辑。
    数据发送的过程如下,先填充数据内容,然后调用类成员进行数据广播发送
    notice_data_pub.id=1;
    notice_data_pub.data[0]=2;
    notice_test.notice_pub_sub_pulisher(notice_data_pub);
  • 相关阅读:
    Angular2学习笔记一
    @valid注解
    JPA注解@GeneratedValue
    java8 lambda 表达式
    Lombok的使用
    mybatis-plus的集成与使用
    mybatis之Sql语句构建器
    mybatis之使用注解
    php学习----异常处理(接上篇)
    php学习----错误处理和代码重用
  • 原文地址:https://www.cnblogs.com/siahekai/p/11000801.html
Copyright © 2020-2023  润新知