创建pub
#include "ros/ros.h" //包含了使用ROS节点的必要文件
#include "std_msgs/Int32.h" //包含了使用的数据类型
#include <sstream>
int main(int argc, char **argv)
{
ros::init(argc, argv, "node_a"); //初始化ROS,节点名命名为node_a,节点名必须保持唯一
ros::NodeHandle n; //实例化节点, 节点进程句柄
ros::Publisher pub = n.advertise<std_msgs::Int32>("str_message", 1000); //告诉系统要发布话题了,话题名为“str_message”,类型为std_msgs::String,缓冲队列为1000。
ros::Rate loop_rate(2); //设置发送数据的频率为10Hz
int count=0;
//ros::ok()返回false会停止运行,进程终止。
while(ros::ok())
{
std_msgs::Int32 msg;
msg.data = count;
count++;
ROS_INFO("node_a is publishing %d", msg.data);
pub.publish(msg); //向话题“str_message”发布消息
ros::spinOnce(); //不是必须,若程序中订阅话题则必须,否则回掉函数不起作用。
loop_rate.sleep(); //按前面设置的10Hz频率将程序挂起
}
return 0;
}
创建sub
#include "ros/ros.h"
#include "std_msgs/Int32.h"
//话题回调函数
void chatterCallback(const std_msgs::Int32::ConstPtr& msg)
{
ROS_INFO("node_b is receiving [%d]", msg->data);
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "node_b"); //初始化ROS,节点命名为node_b,节点名必须唯一。
ros::NodeHandle n; //节点句柄实例化
ros::Subscriber sub = n.subscribe("str_message", 1000, chatterCallback); //向话题“str_message”订阅,一旦发布节点(node_a)在该话题上发布消息,本节点就会调用chatterCallbck函数。
ros::Rate loop_rate(1);
while(ros::ok())
{
ros::spinOnce(); //不是必须,若程序中订阅话题则必须,否则回掉函数不起作用。
loop_rate.sleep(); //按前面设置的10Hz频率将程序挂起
}
return 0;
}
上面发布话题是订阅话题发送速度两倍,结果如下:
可以看到数据全部接收并打印,ros回调函数是由spinonce触发,触发后会将消息队列中的全部数据处理完成后,进行sleep