ROS消息vs服务
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服务的更多相关文章
- ROS学习笔记9-创建ros消息和服务
该节内容主要来自于官方文档的两个小节:1.使用rosed来编辑2.创建ros消息的服务 先来看rosed: rosedrosed命令是rosbash的一部分,使用rosed可以直接编辑包中的一个文件, ...
- (十)创建ROS消息和ROS服务
ROS总教程(中文版) 110.创建ROS消息和ROS服务
- ROS知识(5)----消息与服务的示例
ROS中已经定义了较多的标准类型的消息,你可以用在这些标准类型的消息上再自定义自己的消息类型.这个在复杂数据传输很有用,例如节点和服务器进行交互时,就可能用到传输多个参数到服务器,并返回相应的结果.为 ...
- Ros学习——创建ROS消息和ROS服务
1.rosed rosed 是 rosbash 的一部分.利用它可以直接通过package名来获取到待编辑的文件而无需指定该文件的存储路径了. rosed默认的编辑器是vim.修改其他的,打开~/.b ...
- ROS Learning-012 beginner_Tutorials (编程) 创建自定义的ROS消息和ROS服务
ROS Indigo beginner_Tutorials-11 创建自定义的ROS消息和ROS服务 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubunt ...
- 创建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 ...
- NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器 ...
- Redis作为消息队列服务场景应用案例
NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例 一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更 ...
- 【转】NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器 ...
随机推荐
- Fiddler使用简单
一,fiddler简介 1.1,什么是fiddler Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler ...
- windows下编写dll
dll的优点 简单的说,dll有以下几个优点: 1) 节省内存.同一个软件模块,若是以源代码的形式重用,则会被编译到不同的可执行程序中,同时运行这些exe时这些模块的二进制码会被重复加载到内存中.如果 ...
- HTML input属性详谈
value属性 value属性指定输入字段的初始值: <form> 名字:<br> <input type="text" name="you ...
- 2.原生js实现图片懒加载
网上查了很多图片懒加载的内容, 但基本上都是jQuery实现的, 没有说清楚其原理, 所以研究了一下 多的不说, 上代码, 看不明白的建议看下我的上一篇文章<1. 图解浏览器和用户设备的宽高等属 ...
- IOS之UIColor
转自:http://blog.csdn.net/wudizhukk/article/details/8607229 UIColor常见用法,废话少说 直接网上抄来记录下,凭空想还真有点想不起来,最近记 ...
- opencv获得轮廓内的所有坐标
std::vector<std::vector<cv::Point>> fillContour(const std::vector<std::vector<cv:: ...
- VMware10新建虚拟机
1. 新建虚拟机 2. 选择 “典型(推荐)(T)” 安装 3. “稍后安装操作系统”,创建一个空白硬盘 4. 选择 “Linux” 的 “CentOS 64位” 5. 设置 “虚拟机名称” 和 “位 ...
- centos7 扩容
用 df -h, 看到磁盘满了 (注意:如果是二,或者第三次扩容,下面的参数就不一样) fdisk /dev/sda 但是失败了,显示没有多余的分区 可以看到 有个/dev/sda4 是我在这之前刚刚 ...
- vs code中自动添加注释插件koroFileHeader
github链接及教程: https://github.com/OBKoro1/koro1FileHeader 使用方法: 1.安装插件koroFileHeader 2.文件->首选项-> ...
- 在centos8搭建dhcp服务
1.用这两个命令就可以安装成功 yum - y install dhcp yum -y install dhcp-server.x86_64 2.配置文件在 /etc/dhcp/dhcpd.conf ...