文章目录

  • spin() 和 spinOnce() 区别及详解
    • spin()
    • spinOnce()

spin() 和 spinOnce() 区别及详解

ROS消息回调处理函数。通常会出现在ROS的主循环中,程序需要不断调用ros::spin() 或 ros::spinOnce(),两者区别在于前者调用后不会再返回,也就是你的主程序到这儿就不往下执行了,而后者在调用后还可以继续执行之后的程序。

如果你的程序写了相关的消息订阅函数,那么程序在执行过程中,除了主程序以外,ROS还会自动在后台按照你规定的格式,接受订阅的消息,但是所接到的消息并不是立刻就被处理,而是必须要等到ros::spin()或ros::spinOnce()执行的时候才被调用,这就是消息回到函数的原理

ros::spin()函数一般不会出现在循环中,因为程序执行到spin()后就不调用其他语句了,也就是说该循环没有任何意义,还有就是spin()函数后面一定不能有其他语句(return 0 除外),有也是白搭,不会执行的。ros::spinOnce()的用法相对来说很灵活,但往往需要考虑调用消息的时机,调用频率,以及消息池的大小,这些都要根据现实情况协调好,不然会造成数据丢包或者延迟的错误。

spin()

ros::spin()函数用起来比较简单,一般都在主程序的最后,加入该语句就可。例子如下:

  • 发送端:
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>int main(int argc, char **argv)
{ros::init(argc, argv, "talker");ros::NodeHandle n;ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);ros::Rate loop_rate(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();++count;}return 0;
}
  • 接收端:
#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(),每次调用1000个数据。* 当用户输入Ctrl+C或者ROS主进程关闭时退出,*/ros::spin();return 0;
}

spinOnce()

1 对于有些传输特别快的消息,尤其需要注意合理控制消息池大小和ros::spinOnce()执行频率; 比如消息送达频率为10Hz, ros::spinOnce()的调用频率为5Hz,那么消息池的大小就一定要大于2,才能保证数据不丢失,无延迟。

/**接收端**/
#include "ros/ros.h"
#include "std_msgs/String.h"void chatterCallback(const std_msgs::String::ConstPtr& msg)
{/*...TODO...*/
}int main(int argc, char **argv)
{ros::init(argc, argv, "listener");ros::NodeHandle n;ros::Subscriber sub = n.subscribe("chatter", 2, chatterCallback);ros::Rate loop_rate(5);while (ros::ok()){/*...TODO...*/ ros::spinOnce();loop_rate.sleep();}return 0;
}

2 ros::spinOnce()用法很灵活,也很广泛,具体情况需要具体分析。但是对于用户自定义的周期性的函数,最好和ros::spinOnce并列执行,不太建议放在回调函数中;

/*...TODO...*/
ros::Rate loop_rate(100);while (ros::ok())
{/*...TODO...*/user_handle_events_timeout(...);ros::spinOnce();                 loop_rate.sleep();
}

【ROS】C++编程相关推荐

  1. ROS学习【2】-----ubuntu16.04中进行ROS通信编程(话题编程)

    ROS通信编程-----话题编程 作为嵌入式系统应用开发的重要支柱之一的ROS,是我们学习嵌入式开发的第一步,既要学习ROS,我们就得知道ROS怎么使用,今天,林君学长带大家开始学习ROS的第一步:R ...

  2. 【Robot学习 5 】ROS通信编程 待更新。。。

    https://blog.csdn.net/weixin_39036700/article/details/81660828 ROS通信编程--话题编程 如何运行文件 rosrun learning_ ...

  3. 【一学就会的ROS基础入门教程 】03-1 ROS基础编程:ROS工作空间的创建、话题topic的发布与接收、以及话题消息的自定义使用

    [一学就会的ROS基础入门教程 ]03-1 ROS基础编程:ROS工作空间的创建.话题topic的发布与接收.以及话题消息的自定义使用 文前白话 1.创建工作空间与功能包 关于工作空间的介绍 创建开发 ...

  4. ros机器人编程实践(15.2)- 使用科大讯飞语音控制turtlebot导航

    一.前言 接上一篇博客:ros机器人编程实践(15.1)- 使用科大讯飞语音控制turtlebot导航 二.使用科大讯飞语音SDK 对着上一篇博客中科大讯飞的安装教程,创建了robot_voice的基 ...

  5. ROS python编程

    ROS python编程 ROS 初始化ROS环境 创建ROS节点 使用Python创建多个Marker ROS 由于python中包含大量的库,这里将ros与python结合进行编程. 初始化ROS ...

  6. ROS机器人编程学习(一)——机器人软件平台

    前言: 今天是2020年9月1日,Slender博客正式启用!从新的学年开始从头记录每一阶段的学习进程,有时间的话也会把以往的学习内容整理放上来. 今天开始从头学习<ROS机器人编程>(哦 ...

  7. ROS机器人编程:原理与应用(A Systematic Approach to Learning Robot Programming with ROS 中文译版)

    ROS机器人编程:原理与应用 (A Systematic Approach to Learning Robot Programming with ROS) 英文原版书下载链接:https://shar ...

  8. 【机器人操作系统】ROS话题编程

    文章目录 自定义消息的实现过程及说明 一.功能包的创建 二.自定义话题消息 (1)创建自定义消息文件步骤 (2)添加编译选项步骤 三.创建发布者 四.创建订阅者 五.添加编译选项 六.编译运行 (1) ...

  9. ros高效编程第七章

    7.4.3 7.5 抓取和放置 场景规划 两种方式:三维感知,通过rgd 通过编程加入物体. 他这里其实就是在rviz中通过编程手动加入了几个物体,位置刚好与gazebo的对应上了,与点云信息也同时对 ...

  10. 机器人操作系统ROS动作编程

    目录 一.什么是动作通讯模型 二.创建工作区间 1.创建功能包 2.编译功能包 三.动作编程 1.定义action文件 2.创建.cpp文件 3.编译及运行 四.分布式通讯 1.主机 2.从机 3.运 ...

最新文章

  1. 机器学习和洗衣机的关系?
  2. Python使用matplotlib可视化人口金字塔图、人口金字塔显示不同性别不同年龄段的人口数,是了解人口组成的最优可视化方法、人口金字塔图可以用来表示按体积排序的群体的分布、形成漏斗结构
  3. PostgreSQL 10.1 手册_部分 III. 服务器管理_第 19 章 服务器配置_19.8. 错误报告和日志...
  4. 成功解决Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问。: 'f:\\program files\\p
  5. 计算机网络拓扑结构的选择规则,赖工为您讲解计算机网络的拓扑结构
  6. Elasticsearch 快速入门
  7. 真实诠释程序员日常的二十四张图【你中了几个】
  8. mongodb分布式集群搭建手记
  9. javascript-常用内置对象-随堂
  10. 排除“使用主题 css 文件要求页上有标头控件。(例如 head runat=server /)”错误...
  11. vue hot true 不起作用_Vue + Flask 小知识(二)
  12. linux元组和列表的区别,列表,元组,集合
  13. 力压今日头条成 App Store 榜第一,个税 App 惊爆 62 例木马病毒!
  14. Nginx平滑添加模块
  15. 收集的一些discuz插件常用插件分享给大家了
  16. PIN码-使用与解决办法
  17. 中国内蒙古医企在“吴哥国际医院”开展“千人一对一国际医疗捐助”
  18. xxx.so has text relocations. This is wasting memory and is a security risk. Please fix
  19. 基于appinventor与EasyDL物体检测API的物体检测app
  20. 虚拟机文件过多,如何删除?vmdk文件能删除吗?

热门文章

  1. mui短信验证html,mui登录界面(验证)
  2. 阿里云linux服务器安装ssh(从登录的坑开始,心酸)
  3. 人脸识别ROC曲线绘制1--生成人脸feature文本
  4. 机器人轨迹规划(熊友伦)
  5. Typora文字变红
  6. 在html里ff3d3d是什么颜色,HTML颜色参考
  7. 如何在 Windows 10 中安装 WSL2 的 Linux 子系统
  8. 英语八大句子成分之一 - 状语
  9. 剑指 Offer 05. 替换空格(完整代码)
  10. Mac终端输出重定向到剪切板