ROS话题queue_size的含义与设置技巧

2023-05-16

ROS1中发布和订阅话题时,都需要设置queue_size,参考:

roscpp/Overview/Publishers and Subscribers - ROS Wiki

rospy/Overview/Publishers and Subscribers - ROS Wiki

1. 发布话题

# roscpp
ros::Publisher publisher = nh.advertise<std_msgs::String>("topic_name", 10)
# rospy
pub = rospy.Publisher('topic_name', std_msgs.msg.String, queue_size=10)

以上publisher中的10就是queue_size,大小并不太重要,一般设置为超过1就行。

roscpp的publish()是异步的(不阻塞),rospy中的publish()在指定了queue_size后也是异步的(否则默认是同步的)。这意味着publish(msg)并不会阻塞程序。

需要发布的消息msg被publish(msg)后,需要经过序列化(serialize)存入缓冲区(queue),然后缓冲区的消息依次发送。异步模式下,当你“publish消息的速度/频率”比“序列化和发送消息的速度/频率”更快时,缓冲区就会逐渐被填满达到queue_size,然后旧的消息就会被丢弃。这会导致实际发送的消息并不是最新的,而是积压了一个queue之前的。

但事实上,一般话题消息序列化和本地TCP发送所需的时间很短,你publish消息的频率很难超过序列化和发送的处理能力,因此queue_size设置为大概10就行。

如果话题消息内容很大,比如是图像或者点云,那么为了保证发布和订阅的实时性,一般要另外使用nodelet来实现节点间消息传输的零拷贝,即略去了序列化和反序列化过程。

2. 订阅话题

# roscpp
ros::Subscriber sub = nh.subscribe("topic_name", 1, callback, ros::TransportHints().tcpNoDelay())
# rospy
rospy.Subscriber("topic_name", std_msgs.msg.String, callback, queue_size=1)

以上subscriber中的1就是queue_size,大小很重要,需要最新消息的时候queue_size要设置成1,不能遗漏消息时queue_size要设置大一些。

新消息收到后,会触发callback()函数执行,但是callback()函数是我们自己定义的,可能执行所需时间较长,就会阻塞住这个接收线程,之后新来的消息会存入queue中。对于不断传输的实时数据流,如果接收消息的频率大于处理的能力(callback函数运行的最高频率),那么queue中的消息就会积压,满了之后旧消息就会被丢弃。这会导致callback当前处理的消息是队列中积压已久的之前的消息。

对于数据实时性要求高的应用,callback函数要写的尽可能简单,避免执行时间过长。同时queue_size要设置成1。

对于非实时数据流、不能遗漏任何一次消息的情况,比如发送的一些指令话题,queue_size要设置尽可能的大,比如rospy中默认设置成为None,roscpp中设置成0,都意味着queue_size无穷大(危险,尽量不要这么设置)。

还要特别注意,rospy中Subscriber默认queue_size不设置时是None,即队列无穷大,一般需要手动设置为1。而且rospy的Subscriber的queue_size只能设置为1或者None,设置为其他数时并不是依次丢弃旧数据,而是一次性接收queue_size个数据!

参考:rospy.topics.Subscriber

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS话题queue_size的含义与设置技巧 的相关文章

随机推荐

  • 左右值无限分类实现算法[转]

    http www jcwcn com archiver tid 227253 html 一 引言 产品分类 xff0c 多级的树状结构的论坛 xff0c 邮件列表等许多地方我们都会遇到这样的问题 xff1a 如何存储多级结构的数据 xff1
  • 给xmpphp添加了几个常用的方法

    给xmpphp添加给了以下的常用方法 xff1a registerNewUser 注册一个新用户 addRosterContact 发送添加好友的请求 accept friend request 接受好友请求 deleteRosterCon
  • app后端设计(2)--xmpp的使用(2014.01.14更新)

    在app中有时候是需要添加聊天服务 xff0c 在这里谈谈曾经开发聊天服务的经验 xff1a xff08 1 xff09 聊天服务端选的openfire xff0c 这是一个基于xmpp协议的聊天服务器 xff08 XMPP是一种基于XML
  • Nginx Location配置总结

    http blog sina com cn s blog 97688f8e0100zws5 html 语法规则 xff1a location 61 uri 61 开头表示精确匹配 开头表示uri以某个常规字符串开头 xff0c 理解为匹配
  • Nginx 下配置SSL证书的方法

    http www jb51 net article 24629 htm 默认 Nginx 是没有 ssl 模块的 xff0c 而我的 VPS 默认装的是 Nginx 0 7 63 xff0c 顺带把 Nginx 升级到 0 7 64 并且
  • 使用nginx搭建https服务器

    http www cnblogs com tintin1926 archive 2012 07 12 2587311 html 最近在研究nginx xff0c 整好遇到一个需求就是希望服务器与客户端之间传输内容是加密的 xff0c 防止中
  • Nginx与Lua

    http www cnblogs com xd502djj archive 2012 11 20 2779598 html 今天安装lua试试 xff0c 这个从开始装的 xff0c 发现一篇文字 xff0c 字数虽少 xff0c 但是却讲
  • MYSQL的空间查询

    http blog sina com cn s blog a48af8c001018q1p html 本文将向各位介绍如何使用MySql5 x中的空间数据库 xff0c 并展示一下它高效的性能 xff08 前提是正确使用 xff09 本文适
  • APM飞控使用动捕等外部定位

    本文初次写于2023 03 03 xff0c pixhawk飞控应该是刷写了ArduPilot 4 1以上的版本 机载计算机通过WIFI和vrpn ros client获取动捕系统 xff08 vicon或者nokov xff09 的无人机
  • APNS导致消息丢失和发送效率原因

    http blog csdn net tlq1988 article details 9612237 首先说明一下 xff0c 本文只是介绍一些容易被开发者忽视 xff0c 而导致性能低下问题 并不是介绍如何向苹果设备成功发送一条消息 xf
  • 苹果通知推送服务(APNS)一些关键特性摘要

    http ramosli iteye com blog 1940843 前段时间 xff0c 仔细研究了APNS的文档 xff0c 把一些关键的地方记录了下来 xff0c 弄懂这些对于理解APNS的规则 xff0c 至关重要 1 If AP
  • 陌陌架构分享 – Apple Push Notification Service

    http blog latermoon com p 61 878 先描述下基本概念 xff0c 标准的iPhone应用是没有后台运行的 xff0c 要实现实时推送消息到手机 xff0c 需要借助Apple提供的APNS服务 iPhone会和
  • CentOS安装JAVA

    http hermosa young iteye com blog 1798026 每次都要搜索一下太麻烦了 xff0c 留个底 xff0c 方便以后查询 一般情况下 xff0c 我们都要将linux自带的OPENJDK卸载掉 xff0c
  • openfire推送离线聊天信息的插件

    插件说明 在手机的聊天应用中 xff0c 经常出现的一个需求就是把用户的离线消息通过推送系统推送到用户的手机上 xff0c 为了实现这个功能 xff0c 本人就开发了本插件 xff0c 这个openfire 插件是拦截了发给openfire
  • APNs 推送原理及问题

    http bbs csdn net topics 390461996 在 iOS 平台上 xff0c 大部分应用是不允许在后台运行并连接网络的 在应用没有被运行的时候 xff0c 只能通过 Apple Push Notification S
  • app后端设计(3)--短信,邮件,推送服务(2014.12.05更新)

    在app的后端设计中 xff0c 免不了消息的推送 xff0c 短信 xff0c 邮件等服务 xff0c 下面就个人的开发经验谈谈这方面 xff08 1 xff09 最重要的是 xff0c 各种推送一定要放在队列系统中处理 xff0c 不然
  • 解决openfire中发送某些特殊字符会断开xmpp连接的问题

    在openfire中 xff0c 如果发送某些特殊的字符 xff08 例如一些表情符合 xff09 xff0c 会断开xmpp的连接 xff0c 经查 xff0c 是由以下的代码问题引起的 xff1a src java org jiveso
  • ucloud发送短信的php sdk

    在ucloud官方的版本中 xff0c 只有python的sdk可供调用 xff0c 现提供php的sdk发送短信 项目地址 xff1a https github com newjueqi ucloudsms 使用方法 xff1a 1 在c
  • iOS推送:Java服务器端发送表情(绘文字)

    http blog csdn net musou ldns article details 8692520 功能的时候 xff0c 客户要求能够给iphone发送表情图标 xff0c 也就是绘文字 手机环境 xff1a iOS5 iOS6
  • ROS话题queue_size的含义与设置技巧

    ROS1中发布和订阅话题时 xff0c 都需要设置queue size xff0c 参考 xff1a roscpp Overview Publishers and Subscribers ROS Wiki rospy Overview Pu