根据博文https://www.cnblogs.com/liu-fa/p/5925381.html,理解spin()和spinOnce():

先上根据博文修改为自己的测试代码,

消息发送端代码talker.cpp:

#include<ros/ros.h>
#include "std_msgs/String.h"
#include <sstream>int main(int argc,char **argv)
{ros::init(argc,argv,"hello_ros");ros::NodeHandle n;ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);//定义消息池最大容量为可以接收 1000个消息ros::Rate loop_rate(10); //定义发送频率为10Hz(1秒发10次)int count = 0;while (ros::ok()){std_msgs::String msg;std::stringstream ss;ss << "hello world " << count;msg.data = ss.str();ROS_INFO("%s", msg.data.c_str());/*** 向 Topic: chatter 发送消息, 发送频率为10Hz(1秒发10次),消息池最大容量1000。*/chatter_pub.publish(msg);loop_rate.sleep();//发送一次的周期是0.1s,所以在这里需要sleep++count;}return 0;
}

消息接收端代码listener.cpp:

#include "ros/ros.h"
#include "std_msgs/String.h"void chatterCallback(const std_msgs::String::ConstPtr& msg)
{ROS_INFO("I heard: [%s]", msg->data.c_str());
}int main(int argc, char **argv)
{ros::init(argc, argv, "listener");ros::NodeHandle n;ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);/*** ros::spin() 将会进入循环, 一直调用回调函数chatterCallback(),* 如果去掉语句ros::spin(),则chatterCallback函数不会被调用。* 当用户输入Ctrl+C或者ROS主进程关闭时退出,*///int i = 0;
// ros::spin(); //ros::Rate loop_rate(5);while(ros::ok()){ros::spinOnce();loop_rate.sleep();
/*if(i>10000000)   //验证ros::spinOnce()被调用后,还可以执行在其以下语句,而如果是调//用spin()语句,则不会执行以下语句{i = 0;ROS_INFO("----I love u");}i++;
*/}return 0;
}

1 、函数意义

首先,这两个函数学名叫ROS消息回调处理函数。它俩通常会出现在ROS的主循环中,程序需要不断调用ros::spin() 或 ros::spinOnce(),两者区别在于前者调用后不会再返回,也就是你的主程序到这儿就不往下执行了,而后者在调用后还可以继续执行之后的程序——》通过上述 listener.cpp 代码验证。

回调函数必须要等到ros::spin()或ros::spinOnce()执行的时候才被调用,这就是消息回到函数的原理。——》如果去掉这两句,通过打印信息,可知 回调函数不会执行。

2、区别

(1)就像上面说的,ros::spin() 在调用后不会再返回,也就是你的主程序到这儿就不往下执行了,而 ros::spinOnce() 后者在调用后还可以继续执行之后的程序。

(2)其实看函数名也能理解个差不多,spin()是一直调用被调用,直到ctrl+c;

ros::spinOnce() 是,如果还想再调用,就需要加上循环语句 while(ros::ok())。

3、对于ros::spinOnce(),有些传输特别快的消息,尤其需要注意合理控制消息池大小和ros::spinOnce()执行频率;

比如:消息发送频率为10Hz,那么 当ros::spinOnce()的调用频率为5Hz,那么接收端消息池的大小就一定要大于2,才能保证数据不丢失,无延迟。

spin()和spinOnce()相关推荐

  1. ROSNOTE : ros::spin() / ros::spinOnce() /rospy.spin()

    如果写了消息订阅函数,那一定要写ros::spin() 或者ros::spinOnce(),不然是得不到另一边发出的消息或者信息 #include "ros/ros.h" #inc ...

  2. 一文搞懂ROS2的spin_some, spin和ROS的spinOnce

    目录 写在前面 1. ROS里的spin和spinOnce 1.1 回调机制浅析 1.2 为什么订阅话题时要指定queue_size? 1.3 设置queue_size的小技巧 1.4 spin和sp ...

  3. ROS学习(十四):ROS Spinning

    ROS 单线程与多线程 Spinning roscpp 不为应用程序指定具体的线程模型. 允许回调函数调用任意数量的线程 必须要调用线程,否则订阅.服务等回调将永远不会被调用 常见的解决方案是,在主函 ...

  4. [转] ROS-I simple_message 源码分析:MessageManager

    转载说明: 感谢简书原作者play_robot的分享! 著作权归原作者所有,如有侵权,请联系我删除,谢谢! 原文地址: https://www.jianshu.com/p/af9adf450dad 文 ...

  5. 由浅到深理解ROS(8)-线程管理

    转自 单线程Spinning ros::spin()是最简单的单线程自旋, 它会一直调用直到结束 用法:  ros::spin(); 另一个单线程spinning是ros::spinOnce(),它定 ...

  6. 【ROS】C++编程

    文章目录 spin() 和 spinOnce() 区别及详解 spin() spinOnce() spin() 和 spinOnce() 区别及详解 ROS消息回调处理函数.通常会出现在ROS的主循环 ...

  7. ROS单线程与多线程处理

    ROS wiki:http://wiki.ros.org/ ROS API:https://docs.ros.org/en/api/roscpp/html/index.html ROS单线程与多线程处 ...

  8. ROS中处理回调数据

    1. 使用回调函数 ROS中回调函数的主要作用是用来处理被调用的数据,所以需要注意回调函数外是无法处理这些数据的. 1.1 循环监控.调用回调函数 ros::spin()与ros::spinOnce( ...

  9. ROS——roscpp

    从本章开始,我们就要正式的接触ROS编程了.在之前的章节,你了解到用命令行启动ROS程序.发送指令消息,或使用可视化界面来调试机器人.你可能很想知道,这些工具到底是如何实现这些功能的.起始这些工具本质 ...

最新文章

  1. 探索 COVID-19 新冠数据来学习 Pandas
  2. 大数据量传输时配置WCF的注意事项
  3. [ARM-assembly]-ARMV8的exclusive和inexclusive的介绍
  4. 蓝桥杯-8-1因式分解(java)
  5. java安装和环境配置
  6. IEnumerable和IEnumerator详解
  7. 查找数组连成环形的和最大的连续子数组
  8. JS字符转为json对象
  9. 2017.9.28 lca 失败总结
  10. 小D课堂 - 零基础入门SpringBoot2.X到实战_第11节 Logback日志框架介绍和SpringBoot整合实战_45、SpringBoot2.x日志讲解和Logback配置实战...
  11. PLC+智能网关,实现HTTP+JSON/XML+POST/GET请求与解析
  12. DHI Mike 后处理工具——污染带面积、长度、宽度统计工具
  13. matlab 逻辑矩阵方格图,均匀设计表的MATLAB实现.pdf
  14. 【python爬虫】动漫之家漫画下载(scrapy)
  15. 《暗时间》中提到的一些书籍整理
  16. 代理服务器不等于路由器【芝麻代理】
  17. C语言:输出奇数和偶数的个数
  18. HJ3 明明的随机数
  19. 洛谷.3733.[HAOI2017]八纵八横(线性基 线段树分治 bitset)
  20. 小程序后台开发sdk

热门文章

  1. 牛客练习赛52 B Galahad (树状数组)
  2. wordpress博客构建
  3. 《工程伦理》网课第十章课后习题答案
  4. 会声会影编辑html,会声会影视频声音编辑
  5. Framer 指南:从设计到编程、组件及其它
  6. DELPHI BULK INSERT
  7. Java精品项目源码第109期精美风在线音乐网站
  8. 四种不同单源最短路径算法性能比较
  9. python--剑指offer--14- I. 剪绳子
  10. python调用ssh-paramikoparamiko-expect