1.发布方
二者需要设置相同的话题
//1.包含头文件
#include "ros/ros.h"
#include "std_msgs/String.h" //普通文本类型的消息
#include <sstream>
int main(int argc, char *argv[])
{
//设置编码让中文能够使用
setlocale(LC_ALL,"");
//2.初始化 ROS 节点
// 参数1为参数个数和参数2为参数列表 参数3 是节点名称(必须唯一)
ros::init(argc,argv,"talker");
//3.实例化 ROS 句柄
//n 是全局命名空间 nh 是局部命名空间(目前不清楚有啥用)
ros::NodeHandle nh;//该类封装了 ROS 中的一些常用功能
//4.实例化 发布者 对象
//Publisher advertise(const std::string& topic, uint32_t queue_size, bool latch = false)
//1发布消息使用的话题 2等待发送给订阅者的最大消息数量大于这个数要清除
//如果为 true,该话题发布的最后一条消息将被保存,并且后期当有订阅者连接时会将该消息发送给//订阅者
ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10);
//5.组织被发布的数据,并编写逻辑发布数据
//数据(动态组织)
std_msgs::String msg;
std::string msg_front = "卷死咯"; //消息前缀
//逻辑(一秒10次)
ros::Rate r(1);
while (ros::ok()) //节点不死这个ros::ok就是为1就能一直循环
{
//使用 stringstream 拼接字符串与编号
std::stringstream ss;
ss << msg_front << count;
msg.data = ss.str();
//发布消息
pub.publish(msg);
//加入调试,打印发送的消息
ROS_INFO("发送的消息:%s",msg.data.c_str());
//根据前面制定的发送频率自动休眠 休眠时间 = 1/频率;
r.sleep();
ros::spinOnce();//回调函数只回调一次
}
return 0;
}
2.订阅方
// 1.包含头文件
#include "ros/ros.h"
#include "std_msgs/String.h"
void doMsg(const std_msgs::String::ConstPtr& msg_p){
ROS_INFO("我听见:%s",msg_p->data.c_str());
// ROS_INFO("我听见:%s",(*msg_p).data.c_str());
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
//2.初始化 ROS 节点
ros::init(argc,argv,"listener");
//3.实例化 ROS 句柄
ros::NodeHandle nh;
//4.实例化 订阅者 对象
//1订阅的话题2消息队列长度,超出长度时,头部的消息将被弃用
//3当订阅到一条消息时,需要执行的回调函数4
ros::Subscriber sub = nh.subscribe<std_msgs::String>("chatter",10,doMsg);
// 5.设置循环调用回调函数
ros::spin();//循环读取接收的数据,并调用回调函数处理与上面spinonce不同为多次循环
return 0;
}
3.Cmakelist.txt文件
以前总结过
4.回调函数
spinOnce();回调一次在循环体内,处理所有可用的回调函数
spin();进入循环处理回调