- 一、话题通信
1.话题理论模型
简单理解就是,Talker发送Topic给ROS Master节点管理员,等待订阅,Listener发送订阅消息,其中包含Talker的Topic,ROS Master根据Topic信息将Talker与Listener配对,Talker与Listener建立通信,Listener即可接收到talker发布的消息。
1)发布方实现
实现主要步骤:初始化节点 、创建节点句柄、创建发布者对象、创建储存发送信息的变量、设置循环发布频率,发布话题。
#include "ros/ros.h"
#include "sstream"
#include "std_msgs/String.h"
int main(int argc, char *argv[])
{
//初始化节点
ros::init(argc,argv,"pub_topic");
//创建节点句柄
ros::NodeHandle nh;
//创建发布者对象
ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",1000);
//设置循环发布频率,10hz,即0.1秒
ros::Rate loop_rate(10);
//创建std_msg::String 类对象,用于储存发送的信息。
std_msgs::String ifs;
int count = 0;
while(ros::ok())
{
std::stringstream ss;
ss << "I love Xiaoming " << count << " forever";
ifs.data = ss.str();
pub.publish(ifs);
ROS_INFO("pub publish the information: %s", ifs.data.c_str() );
loop_rate.sleep();
count ++;
ros::spinOnce();
}
return 0;
}
2)订阅方实现
实现步骤:初始化节点 、创建节点句柄、创建订阅对象、编写回调函数
回调函数:专门用于接收发布信息。
#include "ros/ros.h"
#include "std_msgs/String.h"
void domsg(const std_msgs::String::ConstPtr & Topic)
{
ROS_INFO("sub subscribe information: %s",Topic->data.c_str());
return ;
}
int main(int argc, char *argv[])
{
ros::init(argc,argv,"sub_topic");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe<std_msgs::String>("chatter",1000,domsg);
ros::spin();
return 0;
}
- 二、服务通信