ROS中关于topic和service的运用场合

2023-05-16

本文的翻译来自,ROS answers 官方的问答区  2014/7/30   点击打开链接

topics seem like the best way for storing "states" of the robot (stateful). so that we can monitor all states/components of the robots like position, temperature, voltage, etc. that makes sense to me.

however, i also see a lot of people using topics as a way to send instructions/commands to the robots (like the topic /head_pan_joint/command for sending commands to servos, like /cmd_vel for sending movement instructions to mobile base, etc). in this case, it doesn't make sense to me.

it seems to me that this should be designed as a service (stateless). if you want to send a command to servo, create a service at the servo level that can be called upon. if you want to send a command to mobile base, create a service at the mobile base that can be called upon.

what are the advantages of designing things like /cmd_vel and /head_pan_joint/command as topics? what are the disadvantages of desigining them as services?

thanks.

answers

From the data receiver's perspective, topics are fire and forget communication, and are asynchronous by default - that is why callbacks need to be setup at receiving nodes.

Services are synchronous - data is requested, and then the receiver blocks until the data is received. While potentially this could be used for commands (with the data representing success and failure), the blocking nature makes this awkward in most use cases.

Basic commands, with no feedback required, are implemented using topics for their simplicity. Commands that require feedback/state tracking, and take a non-trivial time to complete, are implemented using actionlib.

Take a look at move_base in the navigation stack - a 'client' requesting the robot move would likely want to know the robot's progress throughout the move action, but would not want to halt operation (block) while waiting, hence actionlib. For a fire-and-forget movement command, the move_base_simple topic exists, but here you would have no idea if the robot ever successfully moves or not, and is not suitable for the complexities of most high-level planners.

thanks paul. really appreciated it. following your explaination, it seems like actionlib and topics can handle pretty much everything. why do we even need to use services? can you give me a couple of real-world use cases that we must use services vs. topics / actionlib?

d  (Jul 31 '14)

Say one node is maintaining some giant datastore and another node needs to retrieve a small subset of that data. Actionlib is a lot of boilerplate and overhead when all you need a simple request - response. Bare topics give you no control over the contents of the data. Service API gives you a nice middle ground.

paulbovbel  (Jul 31 '14)
    从数据接收者这边来看,topic 这边是断开联系的,并且默认是异步接收的(收、发不同时)——这也是为什么callback函数(响应函数)需要在接收端的node这边启动的原因。
    比较而言service是同步收发的——请求数据,响应它直到数据被对方接受到。有时候这也可以用来发送指令(传回的消息可以代表动作成功还是失败),

==========================================================================

ROS/Patterns/Communication - ROS Wiki

Topics

处理连续数据流,topic是一种多对多的形式,一个Node可以订阅多个Topic,可以publish到多个topic上。

topic中的数据只要准备好了,就可以被callback——回调函数调用。而发送端的topic的发送时机由publisher自己决定。

Service

用于那些快速停止的程序,如查询一个node 的状态,或是做数学运算,比如机械臂的运动学反解IK(inverse kinematic)。它不应当被用于那些需要长时间运行的进程中,特别是有异常处理的子进程。绝不应该用于状态的变化。

Actions它由三部分组成:目标goal、反馈feedback和结果result。它和service和topic有相同也有不同,重要的是它可以中途取消。而且相比于service能够提供长久稳定的反馈,service是一问一答型。

用于离散的行为,如让小车前进一段时间,并在运行过程中提供反馈。

它最主要的特点就是运行过程中可以被中断,中断通常是靠Action server来实现。比如《ROS by Example》书中想让小车走1米,运行过程中需要不断检测是否走了1米,走到了就中断它,让它停下来。

即使在同一个Action Server上运行不同的两个action goal, 它们的状态也能够利用各自的ID被区分开来。

像视觉处理等需要较多时间来启动或终止的程序也是利用action来实现的一个不错的例子。

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

ROS中关于topic和service的运用场合 的相关文章

  • 应用程序未打开时,GCM 消息未发送?

    最近我在我的应用程序上实现了 GCM 我按照这个网站上的教程代码进行操作 http javapapers com android google cloud messaging gcm for android and push notific
  • PRIME ng 确认服务的 Angular 单元测试

    首先 我是角度单元测试的新手 我想对以下从数据中删除记录的方法进行单元测试 方法是 Confirm Button for deletion confirm name string id any this confirmationServic
  • 在 Play 应用程序中启动时调用服务

    我有一个 Play 2 4 应用程序 尝试在应用程序启动时启动每周任务 当前的建议是在急切注入的类的构造函数中执行此操作 Guice 但是 我的任务需要访问服务 如何将该服务注入到我的任务中而不出现错误 Error injecting co
  • 如果Service在另一个进程中,如何绑定它?

    显现
  • Angular2 - 多个依赖的顺序 http api 调用

    我正在构建一个 Angular2 应用程序 其中一个组件需要进行多个 API 调用 这些调用依赖于之前的调用 我目前有一项服务可以调用 API 来获取电视节目列表 对于每个节目 我需要多次调用不同的 API 来逐步检查该结构 以确定该节目是
  • Grails 在 Service 类中获取 Session 和 Management

    我对 Grails 会话有疑问 我正在考虑为我的会话处理提供一个服务类 所以我创建了一个名为 SessionService 的类 在 grails app services grails 下 class SessionService sta
  • Android相机无法从后台服务拍照

    我已经实现了一项从后台线程拍照的服务 但照片永远不会在我的任何设备上拍摄 这是代码 下面记录输出 public class PhotoCaptureService extends Service private static final S
  • 作为后台进程/服务运行命令

    我有一个 Shell 命令 我想在后台运行 并且我读到这可以通过添加后缀来完成 到导致它作为后台进程运行的命令 但我需要一些更多的功能 并且想知道如何去做 我希望每次系统重新启动时该命令都在后台启动并运行 我希望能够像人们一样在需要时启动和
  • 如何通过 Angular 6 中的服务将对象发送到不相关的组件?

    所以我是 Angular 的新手 我正在尝试使用服务将对象从组件 1 发送到组件 2 当我将结果记录到 component2 中的控制台时 它没有给我对象的更新值 这可能是因为服务在第二个组件中重新初始化 你能帮忙解决这个问题吗 这是我的代
  • OSGi 应用程序设计 - 我是否滥用服务框架? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在我们正在开发的应用程序中 我有一个供数据提供程序组件实现的通用接口 并且我将这些提供程序作为服务连接起来 我的一位同事建议 最好只创建一项可以
  • Spring框架中的DAO和Service层到底是什么?

    Spring框架中的DAO和Service层到底是什么 我正在寻找理论答案 就 Spring 而言 没有区别 按照惯例 您可以使用以下方式标记 DAO 类 Repository和服务 Service 前者还进行一些持久层异常转换 既然您在理
  • 使用 powershell 从远程服务器获取服务状态

    如何获取需要用户名和密码登录的远程计算机的服务状态 我正在尝试使用以下代码找到解决方案 serviceStatus get service ComputerName machineName Name service 默认语法为get ser
  • aSmack 即服务

    基本上我有一个运行整个项目的主类 该代码运行完美 尽管一旦应用程序失去焦点 它就会变得不活动 我想知道如何将其变成一项服务 一个会在启动时启动的 该应用程序将是一个用于通知的单向消息系统 IE 桌面客户端 gt Openfire 服务器 g
  • 无法从 AsyncTask 启动服务

    我正在尝试从 AsyncTask 启动服务 但看不到它的启动 我还在清单文件中添加了服务 这里是代码 protected Integer doInBackground Void values throws InterruptedExcept
  • 存储库和服务层之间的区别

    我查看了一些相关的问题 但仍然没有看到存储库和服务层之间有太大区别 所以给出的例子我想它应该看起来像这样 如果不是请告诉我为什么 public interface ProductRepository extends CrudReposito
  • android widget 和 localservice 绑定

    我编写播放器 它的主要活动是运行本地服务 我找不到如何将本地服务绑定到小部件 当我尝试像在活动中一样绑定它时 它失败了 请帮助我 添加 1 何时可以联系后台服务 http www developer com ws data article
  • Silverlight WCF服务跨域问题

    我有一个 silverlight 应用程序 托管在 Intranet mydomain net 和一个 WCF 服务 webservices mydomain net 我需要跨站点策略文件吗 如果是这样 只允许从 Intranet mydo
  • SC创建binpath错误

    我正在尝试在 PowerShell 中运行以下命令 sc create StrongSwan binpath C Users Kanishk Desktop Strong Strong stronswan strongswan 5 6 3
  • 服务作为 SOA 中的中介

    我知道什么是 通常的 中介设计模式 维基百科中有一些描述 http en wikipedia org wiki Mediator pattern http en wikipedia org wiki Mediator pattern 在我的
  • 使用taskkill停止Windows服务

    我需要帮助来使用 C 终止 Windows 服务 现在要终止该服务 请使用以下选项 从命令 sc queryex ServiceName 发现后PID服务的 taskkill pid 1234 exemple f 为了便于阅读 但如果您明白

随机推荐

  • MySQL ERROR 1698 (28000) 错误

    之前MySQL服务端本机上使用密码登陆root账号是没有问题的 xff0c 但是今天不知道是因为动了哪里 xff0c 登陆失败并有这个错误代码 xff1a mysql u root p Enter password ERROR 1698 2
  • Gunicorn-配置详解

    在之前的文章中有记录WSGI容器的作用 xff0c 以及我们知道常见的容器就只有的uWSGI和Gunicorn xff0c 在之前的文章中有记录他们的特性及优缺点 xff0c 在这就不在多做描述 接下来将着重记录一下Gunicorn的一些配
  • YOLOv7升级换代:EfficientNet骨干网络助力更精准目标检测

    目录 一 EfficientNet骨干网络1 EfficientNet架构2 EfficientNet在目标检测中的应用3 EfficientNet分辨率的缩放4 EfficientNet深度与宽度的缩放 二 YOLOv7结构1 YOLOv
  • Python-获取图片的大小

    了解过Pillow的都知道 xff0c Pillow是一个非常强大的图片处理器 xff0c 这篇文章主要记录一下Pillow对图片信息的获取 xff1a 安装Pillow pip span class hljs keyword instal
  • lsnrctl command not found

    在linux安装完oracle时 当你遇到lsnrctl command not found等问题都不能用时 会有几种情况 1 首先你先查看下环境变量里面有没有加入oracle的配置 执行 echo ORACLE HOME 没有的话 你执行
  • Ubuntu 18.04-安装图文教程

    Ubuntu xff08 友帮拓 优般图 乌班图 xff09 是一个以桌面应用为主的开源GNU Linux操作系统 xff0c Ubuntu 是基于Debian GNU Linux xff0c 支持x86 amd64 xff08 即x64
  • Docker-DockerFile的使用

    在使用DockerFile定制镜像之前 xff0c 我们先来了解一下镜像的构成 xff1a 镜像是容器的基础 xff0c 每次执行docker run命令的时候都会指定哪个镜像作为容器运行的基础 在之前的栗子中 xff0c 我们使用的镜像都
  • Python-标准库calendar的使用

    此模块允许你输出类似Unix cal程序的日历 xff0c 并提供与日历相关的其他有用功能 值得注意的是 xff0c 默认情况下 xff0c 这些日历将星期一作为一周的第一天 xff0c 将星期日作为一周的最后一天 欧洲惯例 不过 xff0
  • Docker MySql报2059错误: Authentication plugin 'caching_sha2_password' cannot be loaded

    最近在使用Docker安装和配置MySql xff0c 按照正常的步骤来安装和配置MySQL xff0c 可配置完成后登录MySQL客户端出现了2059错误 xff0c 于是上各种博客 技术论坛寻求相关的问题解决办法 xff0c 可是仍然找
  • 套接字与文件

    在Linux中 xff0c 所有套接字都是文件 xff0c 操作系统并不区分套接字和文件 xff0c 因此对二者可以使用相同的读写函数
  • MySQL中find_in_set函数的使用

    1 语法 FIND IN SET str strlist xff08 1 xff09 str 要查询的字符串 xff08 2 xff09 strlist 字段名 xff1b 参数以 分隔 如 1 2 6 8 查询字段 strlist 中包含
  • C文件创建并写入文件

    创建并写入文件 u003Cstdio h gt nint main n n t 创建一个名为data txt的文件 n tFILE pFile 61 fopen 34 data txt 34 34 w 34 n tif pFile 61 6
  • 关于海康摄像头的摘要认证

    最近在做一个项目时候要用到摄像头人脸抓拍 xff0c 人脸识别等功能 xff0c 原本使用海康的SDK就可以解决的 xff0c 但是我们项目是在arm平台下开发的 xff0c 而海康的SDK不支持arm平台 xff0c 无奈联系的海康的技术
  • 华为OD机试真题2023(JAVA)

    目录 华为OD机试是什么 xff1f 华为OD面试流程 xff1f 华为OD机试通过率高吗 xff1f 华为OD薪资待遇 xff1f 华为OD晋升空间 xff1f 大家好 xff0c 我是哪吒 本专栏包含了最新最全的华为OD机试真题 xff
  • ARM的快速上下文切换(FCSE)

    一 FCSE的原理 通常情况下 xff0c 如果两个进程占用的虚拟地址空间由重叠 xff0c 系统在这两个进程之间进行切换时 xff0c 必须进行虚拟地址到物理地址的重映射 而虚拟地址到物理地址的重映射涉及到重建MMU中的页表 xff0c
  • 使用PyQt5/PySide2编写一个极简的音乐播放器

    文章目录 一 创建UI界面二 获取网络歌曲三 创建和链接信号槽 疫情肆虐 xff0c 憋在家实在无聊 xff0c 索性写点东西 xff0c 于是就有了这个极极极极极简的音乐播放器 这个极极极简的音乐播放器类似于 阅后即焚 的软件 xff0c
  • Android zxing二维码扫描 扫描框适应各种分辨率

    public synchronized Rect getFramingRect if framingRect 61 61 null if camera 61 61 null return null Point screenResolutio
  • 实战:MySQL Sending data导致查询很慢的问题详细分析

    这两天帮忙定位一个mysql查询很慢的问题 xff0c 定位过程综合各种方法 理论 工具 xff0c 很有代表性 xff0c 分享给大家作为新年礼物 xff1a xff09 问题现象 使用sphinx支持倒排索引 xff0c 但sphinx
  • TypeScript入门到入土(3)webpack打包ts代码

    上一节我们讲了ts的编译选项 xff0c 这一节我们介绍利用webpack打包我们的ts代码 前文链接 xff1a TypeScript入门到入土 xff08 2 xff09 小杨爱编程的博客 CSDN博客 ts 的安装以及ts中类型 xf
  • ROS中关于topic和service的运用场合

    本文的翻译来自 ROS answers 官方的问答区 2014 7 30 点击打开链接 topics seem like the best way for storing 34 states 34 of the robot stateful