首先,需要把ID_Data.msg拷贝到当前包的msg目录内,当然可以直接新建ID_Data.msg文件在msg目录内其内容只有两行如下:
int32 id
int16[8] data
然后在CmakeList.txt中添加如下msg编译信息。
int16[8] data
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 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 ¬ice_msg);
};
notice_pub_sub::notice_pub_sub()
{
notice_pub_sub_msgCallbackFun=boost::bind(¬ice_pub_sub::notice_msgCallback,this,_1);
notice_ops=ros::SubscribeOptions::create(
"/notice",
1,
notice_pub_sub_msgCallbackFun,
ros::VoidPtr(),
¬ice_callbackqueue
);
notice_subscriber=notice_handle.subscribe(notice_ops);
notice_spinner=new ros::AsyncSpinner(1,¬ice_callbackqueue);
notice_publisher=notice_handle.advertise("/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);