首先,需要把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("\n");
        }
 
 
    }
 
 
}
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);