发布方:
#include "ros/ros.h"
#include "communication/person.h" // 包含自定义msg的头文件
int main(int argc,char *argv[])
{
setlocale(LC_ALL,""); // 解决发送中文乱码问题
ros::init(argc,argv,"personpub"); //节点初始化,节点名
ros::NodeHandle nh; //创建句柄类对象
ros::Publisher pub= nh.advertise<communication::person>("person",10); //指定发布者发布的类型(泛型),发布者的话题,缓存队列
//编写发布逻辑并发布数据:
communication::person person ; //创建发布数据的对象
person.name = "张三";
person.age = 18;
person.height = 1.72;
ros::Rate rate(10); //设置发布频率,创建Rate对象,有参构造函数设置对象发布频率为10hz
ros::Duration(3).sleep(); //延迟三妙,防止未注册就发送数据,导致数据丢失
while (ros::ok()) //只要节点存在,循环就继续
{
pub.publish(person);
person.age+=1; //修改数据发送
//ROS_INFO("发布的消息为姓名:%s,年龄:%d,身高:%.2f",person.name.c_str(),person.age,person.height); //编辑输出日志
rate.sleep(); //让对象按频率延迟
}
return 0;
}
接收方:
#include "ros/ros.h"
#include "communication/person.h" // 包含自定义massages的头文件
void doperson(const communication::person::ConstPtr &person) //编写回调函数,用于处理接收的数据 ,每订阅到一条数据都会执行一下它(指针常量指针 指向与指向的指都不可变)
{
ROS_INFO("发布的消息为姓名:%s,年龄:%d,身高:%.2f",person->name.c_str(),person->age,person->height); //对接收到的数据就做打印输出
}
int main(int argc,char *argv[])
{
ROS_INFO("jhfdikfhedio");
setlocale(LC_ALL,""); // 解决接收中文乱码问题
ros::init(argc,argv,"personsub"); //节点初始化,节点名
ros::NodeHandle nh; //创建句柄类对象
ros::Subscriber sub= nh.subscribe("person",10,doperson); //指定接受者的话题,队列,以及接收后的回调函数,将接收到的数据传入回调函数 回调函数:由外部时机控制等待调用的函数
ros::spin(); //死循环检测回调函数是否存在并执行回调函数
return 0;
}