ROS基本通信機(jī)制有以下三種實(shí)現(xiàn)策略
-話題通信(發(fā)布訂閱模式)
-服務(wù)通信(請求相應(yīng)模式)
-參數(shù)服務(wù)器(參數(shù)共享模式)
話題通信
概念:以發(fā)布訂閱的方式實(shí)現(xiàn)不同節(jié)點(diǎn)之間的數(shù)據(jù)交互的通信模式
作用:適用于不斷更新言疗,邏輯處理少的數(shù)據(jù)傳輸場景
主要流程
使用的協(xié)議:RPC和TCP晴圾;
注意:
- 步驟0和步驟1之間沒有順序關(guān)系
- talker和listener可以有多個
- talker和listener建立連接后可以關(guān)閉
- 話題通信已封裝可直接調(diào)用
應(yīng)用時的關(guān)注點(diǎn)
- 話題設(shè)置
- 發(fā)布者實(shí)現(xiàn)
- 訂閱者實(shí)現(xiàn)
- 消息載體
C++實(shí)現(xiàn)話題通信
發(fā)布方(publish)
*在src目錄下創(chuàng)建.cpp文件 publish.cpp
#include "ros/ros.h"
#include "std_msgs/Stream"
#include <sstream>
int main(int argc, char* argv[])
{
setlocale(LC_ALL,"");//使程序支持中文輸出
ros::init(argc, argv, "publisher");//初始化ROS結(jié)點(diǎn)
ros::NodeHandle nh;//創(chuàng)建結(jié)點(diǎn)句柄
ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10);//創(chuàng)建發(fā)布方,創(chuàng)建話題為"chatter"噪奄,同時設(shè)置緩沖隊(duì)列的最大容納數(shù)為10.
std_msg::string msg;//創(chuàng)建發(fā)布內(nèi)容
ros::Rate rate(10);//創(chuàng)建發(fā)布頻率死姚,為每秒十次;
int count = 0;
while(ros::ok())
{
std::stringstream ss;//創(chuàng)建ss流用來存儲將要拼接的發(fā)布內(nèi)容
ss<<"發(fā)送的內(nèi)容為:Hello [" <<count <<"]";//拼接發(fā)送的內(nèi)容
msg.data = ss.str();//此處將ss中拼接的發(fā)布內(nèi)容存到msg的data空間里
pub.publish(msg);//發(fā)布內(nèi)容;
ROS_INFO("發(fā)送的內(nèi)容為:%s 勤篮,編號為:%d",ss.str().c_str());//輸出日志
count++;
rate.sleep();//控制發(fā)送頻率
ros::SpinOnce();//回調(diào)函數(shù)知允,因?yàn)榇a中沒有用到回調(diào)函數(shù)的地方所以此語句可省略。
}
return 0;
}
修改CMakeLists.txt文件叙谨,并編譯運(yùn)行 publish
image.png
訂閱方(subscribe)
同樣在src目錄下創(chuàng)建 subscribe.cpp 文件
編寫訂閱方程序
#include "ros/ros.h"
#include "std_msgs/Stream"
#include <sstream>
void doMSG(const std_msgs::String::ConstPtr &msg)
{
ROS_INFO("獲取到的訊息為:%s",msg->data.c_str());
}
int main(int argc, char* argv[])
{
setlocale(LC_ALL,"");//使程序支持中文輸出
ros::init(argc, argv, "subscriber");//初始化ROS節(jié)點(diǎn)
ros::NodeHandle nh;//創(chuàng)建節(jié)點(diǎn)句柄
ros::Subscriber sub = nh.subscrib("chatter",10,doMSG);//其中話題名稱必須與發(fā)布方相匹配温鸽,否則無法接收到相關(guān)的訊息,10為最大隊(duì)列手负,doMSG為回調(diào)函數(shù)
//回調(diào)函數(shù)在訂閱方為必需函數(shù)涤垫,用來重復(fù)處理所收到的訊息,需單獨(dú)定義竟终。
ros::spin();//回調(diào)函數(shù)處理
return 0;
}
修改CMakeLists.txt文件蝠猬,并編譯運(yùn)行 subscribe