1 组织要发布的数据
在功能包的src目录下,msg文件夹,在msg文件夹下新建msg类型的文件
消息类型格式
string name
uint8 sex
uint8 age
uint8 unknown = 0
uint8 male = 1
uint8 female = 2
.xml配置文件
cmake 配置文件
2.发布方程序
#include "ros/ros.h"
#include "sub_pub/Person.h"
int main(int argc,char*argv[])
{
setlocale(LC_ALL,"");
ros::init(argc,argv,"my_puber");
ros::NodeHandle nh;
ros::Publisher pub=nh.advertise<sub_pub::Person>("mychatter",100);
ros::Rate r(1);
ros::Duration(3).sleep();
int count=0;
sub_pub::Person msg;
std::cin >> msg.name;
msg.age=1;
while(ros::ok)
{
pub.publish(msg);
msg.age+=1;
ROS_INFO("msg_name = %s msg_age= %d ",msg.name.c_str(),msg.age);
r.sleep();
ros::spinOnce();
}
return 0;
}
3.订阅方程序设计
#include "ros/ros.h"
#include "sub_pub/Person.h"/*自定义消息类型的路径*/
void chattercallback(const sub_pub::Person::ConstPtr& msg) /*回调函数 传入一个指针*/
{
ROS_INFO("i heard NAME =%s age= %d",msg->name.c_str(),msg->age);
}
int main(int argc,char *argv[])
{
ros::init(argc,argv,"my_lister"); /*节点初始化*/
ros::NodeHandle n;
ros::Subscriber sub=n.subscribe("mychatter",100,chattercallback); /*订阅节点,话题 缓冲区的消息数 回调函数*/
ros::spin(); /*当函数运行到rosspin,会进入到缓冲区对缓冲区的第一个数据进行处理,调用回调函数处理数据,并且rosspin进入后除非rosshutdown,不然就会一直循环,处理一次缓存中的数据就调用一次回调函数,rosspinonce是进入一次回调函数然后退出*/
return 0;
}
自定义消息类型的发布主要是订阅方和发布方的头文件有所不同,一定要把自定义的消息类型包含到月头文件里去。