ros spinonce机制

创建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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值