1.通信原理
2.参照第一个文章(1)ROS学习-ros功能包的创建和helloworld_月夜生云的博客-优快云博客创建好ros工作区然后用vscode创建一个功能包。
3.输入以下代码
/*
消息发布方:
循环发布信息:HelloWorld 后缀数字编号*/
#include "ros/ros.h"
#include "std_msgs/String.h" //普通文本类型的消息
#include <sstream>//有字符串拼接的函数
int main(int argc, char *argv[])
{
//设置编码
setlocale(LC_ALL,"");
//初始化ROS节点 注意节点命名要唯一
// 参数1和参数2 后期为节点传值会使用
// 参数3 是节点名称,注意在ROS网络拓扑中唯一
ros::init(argc,argv,"talker");
//实例化 ROS 句柄
ros::NodeHandle nh;
//实例化发布者对象
//<std_msgs::String> 发布的消息类型
//参数1: 要发布到的话题
//参数2: 队列中最大保存的消息数,超出此阀值时,先进的先销毁(时间早的先销毁)
ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10);
//组织被发布的数据,并编写逻辑发布数据
//数据
std_msgs::String msg;
std::string msg_front = "Hello--->"; //消息前缀
int count = 0; //消息计数器
//逻辑(一秒1次)
ros::Rate r(1);
//节点不死
while (ros::ok())
{
//使用 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();
count++;//循环结束前,让 count 自增
//暂无应用
ros::spinOnce();
}
return 0;
}
4.参照1添加配置
5.参照(1)的文章,试着编译运行一下,记得先启动roscore
先ctrl+shift+b编译
可以这样,就证明发布方没问题啦。
6.同理在同一个包下面再建一个cpp文件,创建一个订阅方,参照上面的步骤2-5。
/*
消息订阅方:
订阅话题并打印接收到的消息
*/
#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());
}
int main(int argc, char *argv[])
{
//设置编码
setlocale(LC_ALL,"");
//初始化ROS节点 注意节点命名要唯一
//参数1和参数2 后期为节点传值会使用
//参数3 是节点名称,注意在ROS网络拓扑中唯一
ros::init(argc,argv,"listener");
//实例化 ROS 句柄
ros::NodeHandle nh;
//实例化发布者对象
//<std_msgs::String> 接受的消息类型
//参数1: 要接受到的话题
//参数2: 回调函数,用来处理订阅到的数据
ros::Subscriber sub = nh.subscribe<std_msgs::String>("chatter",10,doMsg);
//设置循环调用回调函数
ros::spin();//循环读取接收的数据,并调用回调函数处理
return 0;
}
7.不要忘了添加配置
8.编译一下看看有没有错。
9.在第五步的基础上再运行这个订阅者节点。
10.可以查看一下节点关系
新开一个终端输入rqt_graph
11.小结:
学习了ros话题通信的模型,用一个简单的例子加深理解,学会一些简单的ros语句,发布者订阅者的实现流程。