ros::spin() 或 ros::spinOnce(),ros消息队列理解

本文详细探讨了ROS中的ros::spin()和ros::spinOnce()的区别,以及ROS消息队列的工作原理。ros::spin()会阻塞直到程序结束,而ros::spinOnce()仅执行一次回调后继续执行后续代码。通过实验展示了消息队列的缓冲和处理情况,强调了长时间回调可能导致的数据丢失问题,提醒在设计消息处理时需注意回调函数的执行时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习ROS中曾经不止一次困惑ros::spin() 或 ros::spinOnce()的区别,现在回过头看却是很简单。另外ros消息队列之前也是迷迷糊糊,这次做个实验总结。

一、ros::spin() 或 ros::spinOnce()

这两个都是叫作ROS消息回调处理函数,两者区别在于前者调用后不会再返回,也就是你的主程序到这儿就不往下执行了,而后者在调用后还可以继续执行之后的程序
不知道你们怎么样,我看到这当时觉得懂了,却一直很心虚的。实际理解是:

  1. ros::spin()不会放在循环中,程序执行到这之后不会跳出来,永远执行消息的回调函数!
  2. ros::spinOnce() 绝大多数会在循环里面,然后返回,跳转到下一条语句!
  3. 一次 ros::spinOnce()会执行完所有消息队列中的消息!进入它时,会有个当前消息计数假设当前 5次 ,它会就会执行 5次 消息回调函数。至于消息内容具体就看消息队列的大小,和处理速度了,具体看二、Ros消息队列

二、Ros消息队列

消息队列到底是怎么样的,做个实验:
talker.cpp

//talker node
/*
 * @Descripttion: 
 * @version: 
 * @Author: wjh 
 * @Date: 2021-06-26 10:45:46
 * @LastEditors: Wen JiaHao
 * @LastEditTime: 2021-12-06 15:33:24
 */
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "beginner_tutorials/AddTwoInts.h"
#include <ros/console.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>("chatter1", 10);
  ros::Publisher chatter_pub2 = n.advertise<std_msgs::String>
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值