1、ROS包消息/服务模式与要点

从功能上看,ROS包是信息交互和处理的基本单元。根据信息的交互和处理方式,ROS包有以下两大类:

消息发布者与订阅者

服务器与客户端

对于消息模式的包,信息的提供者主动,信息的使用者被动:信息使用者接收到消息后执行回调函数处理信息,即处理信息的回调函数由信息发布者触发;

对于服务模式的包,信息的提供者被动,信息的使用者主动:信息使用者需要时向信息提供者查询,提供者收到查询参数后,调用回调函数计算结果然后给予应答,即处理信息的回调函数由服务的查询者(信息使用者)触发;

要点如下:

1.1 消息发布与订阅

消息的定义方法:

消息定义于包目录的msg/xxx.msg中

定义消息的包可以与发布者/订阅者的包不一样

在消息定义包的package.xml中加上build_depend和run_depend约束项

在消息定义包的CMakeLists.txt中设置好find_package(), catkin_package(), add_message_files(), generate_messages()

消息的发布

完成节点初始化 ros::init()

创建节点句柄 ros::NodeHandle

调用NodeHandle的advertise方法创建消息发布者

调用消息发布者的publish方法发布消息

消息的订阅

创建订阅到消息后需要执行的回调函数

完成节点初始化 ros::init()

创建节点句柄 ros::NodeHandle

调用NodeHandle的subscribe方法创建消息订阅者并绑定回调函数

ros::spin()

消息发布和订阅的命令行工具

通过命令行发布和订阅消息,不用通过ROS节点,测试的时候非常方便:

1. rosmsg show [message type] 显示消息的数据格式

2. rostopic echo /topic_name 显示特定topic接收到的消息

3. rostopic pub <topic-name> <topic-type> [data...] 向特定的topic发送消息

1.2 服务器与客户端

服务的定义方法:

服务定义于包目录的srv/xxx.srv中

定义服务的包可以与服务器/客户端的包不一样

在消息定义包的CMakeLists.txt中设置好find_package(), add_service_files(), generate_messages()

服务器

创建处理服务数据的回调函数

完成节点初始化 ros::init()

创建节点句柄 ros::NodeHandle

调用节点句柄的advertiseService函数启动服务

ros::spin()

客户端

完成节点初始化 ros::init()

创建节点句柄 ros::NodeHandle

调用节点句柄的serviceClient函数创建客户端对象client,通过服务名称绑定服务

申明服务类型的对象(srv),并将srv.request部分赋初值

调用client的call(srv)函数调用服务

服务执行成功后,通过srv.response取得服务器的应答结果

命令行工具

rosservice call <service-name> [service-args]调用特定服务

1.3 需要注意的细节

消息/服务模式的节点实现时要include消息/服务对应的头文件

上述头文件需要先编译消息定义包来生成,因此需要在消息/服务使用者对应的CMakeLists.txt中加上add_dependencies()约束,否则会出现找不到头文件的现象

信息交互中的被动方,即消息模式的消息订阅者或服务模式的服务器在都要调用ros::spin(),该函数确保回调能够发生。

ROS消息vs服务的更多相关文章

  1. ROS学习笔记9-创建ros消息和服务

    该节内容主要来自于官方文档的两个小节:1.使用rosed来编辑2.创建ros消息的服务 先来看rosed: rosedrosed命令是rosbash的一部分,使用rosed可以直接编辑包中的一个文件, ...

  2. (十)创建ROS消息和ROS服务

    ROS总教程(中文版) 110.创建ROS消息和ROS服务

  3. ROS知识(5)----消息与服务的示例

    ROS中已经定义了较多的标准类型的消息,你可以用在这些标准类型的消息上再自定义自己的消息类型.这个在复杂数据传输很有用,例如节点和服务器进行交互时,就可能用到传输多个参数到服务器,并返回相应的结果.为 ...

  4. Ros学习——创建ROS消息和ROS服务

    1.rosed rosed 是 rosbash 的一部分.利用它可以直接通过package名来获取到待编辑的文件而无需指定该文件的存储路径了. rosed默认的编辑器是vim.修改其他的,打开~/.b ...

  5. ROS Learning-012 beginner_Tutorials (编程) 创建自定义的ROS消息和ROS服务

    ROS Indigo beginner_Tutorials-11 创建自定义的ROS消息和ROS服务 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubunt ...

  6. 创建ros消息时出现:Unable to load msg [planning/Num]: Cannot locate message [Num]: unknown pack.....

    创建ros消息可参考创建ROS消息和ROS服务. 按照这个教程进行创建的过程中出现了如下错误: Unable to load msg [msgs/locate]: Cannot locate mess ...

  7. NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例

    一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器 ...

  8. Redis作为消息队列服务场景应用案例

    NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例   一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更 ...

  9. 【转】NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例

    一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器 ...

随机推荐

  1. 链表逆序,java实现

    package com.cskaoyan.linkedlist; //反转数组 public class LinkedListDemo2 { public static Node reverse(No ...

  2. Hyper-V + CentOS7 安装教程(视频)

    (双击全屏播放) 一.前言 为什么选择Hyper-V? windowns自带,免费 基础环境 二.虚拟机配置 下载CentOS7镜像 https://www.centos.org/download/ ...

  3. webpack4 css modules

    demo 代码点此,webpack4 中通过 css-loader 开启 css 模块化, 开始前先做点准备工作. 不了解 css 模块化的,可以前往查看github_css_modules. ##准 ...

  4. SimpleTagSupport 获取request、session

    开发jsp系统时,我们经常会用到tag来写java的逻辑代码,一般会继承两个类,一个是SimpleTagSupport,另一个是TagSupport,由于TagSupport书写配置比较复杂(我个人才 ...

  5. sparkSQL中的example学习(2)

    UserDefinedUntypedAggregate.scala(默认返回类型为空,不能更改) import org.apache.spark.sql.{Row, SparkSession} imp ...

  6. python从入门到放弃之进程

    在理解进程之前我们先了解一下什么是进程的概念吧 以下就是我总结的一些基本的进程概念 进程就是正在运行的程序,它是操作系统中,资源分配的最小单位(通俗易懂点也就是电脑给程序分配的一定内存操作空间).资源 ...

  7. K8s容器编排

    K8s容器编排 Kubernetes(k8s)具有完备的集群管理能力: 包括多层次的安全防护和准入机制 多租户应用支撑能力 透明的服务注册和服务发现机制 内建智能负载均衡器 强大的故障发现和自我修复能 ...

  8. Error: EACCES: permission denied, mkdir

    今天在全局安装飞冰的时候,出现标题的错误 想到是权限不够的问题,其实飞冰官网也有解决的办法,就是更改npm的默认路径.我之前就是用了更改默认路径的方法,然后后来又恢复了默认路径,所以还是用默认路径加权 ...

  9. Skyshop.Detail Maps

    Secondary Maps(Detail Maps) & Detail Mask 增加模型细节,而不需要使用单张的超大贴图. 应用:增加皮肤细节,比如毛孔:砖墙添加细小的裂缝和青苔:大型金属 ...

  10. 201871010101-陈来弟《面向对象程序设计(java)》第十六周学习总结

    实验十四  应用程序归档与线程初步 实验时间 2019-12-12 第一部分:基础知识 1. 程序与进程: 进程是指一个具有一定独立功能的程序关于某个数据集合的一次运行活动.电脑中时会有很多单独运行的 ...