(1)基本概念
ROS中的话题是节点之间通讯最基本的方式,节点向一个话题发布消息,订阅这个话题的节点就可以接收到消息。
在本例中,我们创建一个发布消息的节点,发布的消息的类型是整数,该话题的名称我们命名为/numbers。
发布消息的节点:
#include "ros/ros.h"
#include "std_msgs/Int32.h" // 标准消息里面的32bit整型,
#include <iostream>
int main(int argc,char **argv)
{
ros::init(argc,argv,"demo_topic_publisher"); // 节点名称 demo_topic_publisher
ros::NodeHandle node_obj; // 用来和节点管理器通讯的工具,每个节点都要有
// 创建了一个名称为 number_publisher 的发布器对象,尖括号里面是模板实例,表明这个节点发送32位整数消息,
// 源括号里面是构造参数,话题的名称是 /number ,话题里面容量是10 ,表示接受10个消息之后,再进入消息,最前面的消息就会被清除
ros::Publisher number_publisher = node_obj.advertise<std_msgs::Int32>("/numbers",10);
ros::Rate loop_rate(10);// 发布频率,10表示每秒种发布10次
int number_count = 0;
while(ros::ok())
{
std_msgs::Int32 msg; // 创建一个消息对象
msg.data = number_count;// 将一个整数赋值给消息里面的成员
ROS_INFO("%d",msg.data); // 打印一条消息到终端
number_publisher(msg); // 使用发送器发送一条消息
ros::spinOnce(); // 监听,执行消息处理函数
loop_rate.sleep(); // 延时,控制每秒10次的发送频率
++number_count;
}
return 0;
}
订阅消息的节点:
#include "ros/ros.h"
#include "std_msgs/Int32.h"
#include <iostream>
void number_callback(const std_msgs::Int32::ConstPtr &msg) // 回调函数,用来处理消息
{
ROS_INFO("Received [%d]",msg->data);
}
int main(int argc,char **argv)
{
ros::init(argc,argv,"demo_topic_subscriber"); // 创建一个节点,名称为demo_topic_subscriber
ros::NodeHandle nh;
ros::Subscriber number_subscriber = nh.subscribe("/number",10,number_callback); // 创建一个订阅器,向话题/number订阅消息,消息池容量为10
ros::spin(); // 循环调用回调函数,处理消息
return 0;
}