spin()和spinOnce()
根据博文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()相关推荐
- ROSNOTE : ros::spin() / ros::spinOnce() /rospy.spin()
如果写了消息订阅函数,那一定要写ros::spin() 或者ros::spinOnce(),不然是得不到另一边发出的消息或者信息 #include "ros/ros.h" #inc ...
- 一文搞懂ROS2的spin_some, spin和ROS的spinOnce
目录 写在前面 1. ROS里的spin和spinOnce 1.1 回调机制浅析 1.2 为什么订阅话题时要指定queue_size? 1.3 设置queue_size的小技巧 1.4 spin和sp ...
- ROS学习(十四):ROS Spinning
ROS 单线程与多线程 Spinning roscpp 不为应用程序指定具体的线程模型. 允许回调函数调用任意数量的线程 必须要调用线程,否则订阅.服务等回调将永远不会被调用 常见的解决方案是,在主函 ...
- [转] ROS-I simple_message 源码分析:MessageManager
转载说明: 感谢简书原作者play_robot的分享! 著作权归原作者所有,如有侵权,请联系我删除,谢谢! 原文地址: https://www.jianshu.com/p/af9adf450dad 文 ...
- 由浅到深理解ROS(8)-线程管理
转自 单线程Spinning ros::spin()是最简单的单线程自旋, 它会一直调用直到结束 用法: ros::spin(); 另一个单线程spinning是ros::spinOnce(),它定 ...
- 【ROS】C++编程
文章目录 spin() 和 spinOnce() 区别及详解 spin() spinOnce() spin() 和 spinOnce() 区别及详解 ROS消息回调处理函数.通常会出现在ROS的主循环 ...
- ROS单线程与多线程处理
ROS wiki:http://wiki.ros.org/ ROS API:https://docs.ros.org/en/api/roscpp/html/index.html ROS单线程与多线程处 ...
- ROS中处理回调数据
1. 使用回调函数 ROS中回调函数的主要作用是用来处理被调用的数据,所以需要注意回调函数外是无法处理这些数据的. 1.1 循环监控.调用回调函数 ros::spin()与ros::spinOnce( ...
- ROS——roscpp
从本章开始,我们就要正式的接触ROS编程了.在之前的章节,你了解到用命令行启动ROS程序.发送指令消息,或使用可视化界面来调试机器人.你可能很想知道,这些工具到底是如何实现这些功能的.起始这些工具本质 ...
最新文章
- 探索 COVID-19 新冠数据来学习 Pandas
- 大数据量传输时配置WCF的注意事项
- [ARM-assembly]-ARMV8的exclusive和inexclusive的介绍
- 蓝桥杯-8-1因式分解(java)
- java安装和环境配置
- IEnumerable和IEnumerator详解
- 查找数组连成环形的和最大的连续子数组
- JS字符转为json对象
- 2017.9.28 lca 失败总结
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第11节 Logback日志框架介绍和SpringBoot整合实战_45、SpringBoot2.x日志讲解和Logback配置实战...
- PLC+智能网关,实现HTTP+JSON/XML+POST/GET请求与解析
- DHI Mike 后处理工具——污染带面积、长度、宽度统计工具
- matlab 逻辑矩阵方格图,均匀设计表的MATLAB实现.pdf
- 【python爬虫】动漫之家漫画下载(scrapy)
- 《暗时间》中提到的一些书籍整理
- 代理服务器不等于路由器【芝麻代理】
- C语言:输出奇数和偶数的个数
- HJ3 明明的随机数
- 洛谷.3733.[HAOI2017]八纵八横(线性基 线段树分治 bitset)
- 小程序后台开发sdk