赞
踩
创建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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。