【ROS学习笔记】11.服务数据(srv)的定义与使用
基于B站ROS公开课:【古月居】古月·ROS入门21讲
基于Ubuntu 20.04.1、Noetic版本
修正错误,并详述Python版本部署
文章目录
- 1 模型图
- 2 创建功能包
- 3 自定义服务数据
- 定义srv文件
- 在package.xml中添加功能包依赖
- 在CMakeLists.txt中添加编译选项
- 编译生成语言相关文件
- 4 创建代码并编译运行(C++)
- 创建代码
- 编译
- 运行
- 5 创建代码并编译运行(Python)
- 创建代码
- 编译
- 运行
前面讲了两个Service模式的例子,分别用到了两种服务数据:turtlesim/Spawn和std_srvs/Trigger。
我们可以使用 rossrv show ...
来查看数据结构:
我们可以看到Spawn中的Request部分含坐标信息、朝向角和名称,Response部分含名称。
Trigger中Request部分为空,Response部分含成功Flag、消息内容。
与之前topic种的msg类似,我们也可以用相似的语法自定义服务数据srv
这节我们来自己定义服务数据来满足个性化的需求。
(部分图摘自:b站【古月居】古月·ROS入门21讲)
1 模型图
在第8节我们讲解了话题消息msg的定义与使用,在第8节的例子中我们曾自定义了一个消息类型“Person”以发布个人信息,Publisher发布个人信息,Subscriber接收个人信息。这个例子中,Publisher会不断地发信息,Subscriber不停地接数据,一开动就停不下来了,也是topic模式的缺陷。
本节我们使用Service模式用自定义的服务数据srv来实现,我们希望Request一次才发一次信息来显示。
如图,Client发布显示某个人的信息的Request,通过自定义的服务数据“Person”(learning::Person)来发出去。
Server端收到Request,显示这个人的具体信息,同时发Response向Client反馈显示结果。
ROS Master负责管理节点。
2 创建功能包
本节还是使用上节创建的 learning_service 包来进行代码存放和编译。
3 自定义服务数据
定义srv文件
我们通过自定义srv文件来自定义服务数据。与之前自定义话题数据msg类似。
我们定义srv文件名为:Person.srv
- 在learning_topic的功能包根目录下,新建文件夹 srv
并创建新文件 Person.srv,创建方法为使用touch
命令在当前目录输入:
touch Person.srv
注意Person的"P"要大写。
- 我们把下面代码复制进Person.srv
string name
uint8 sex
uint8 ageuint8 unknown = 0
uint8 male = 1
uint8 female = 2
---
string result
与之前Person.msg不同的是,多了破折号下面这个Response结果,上面的是Request内容。
定义好srv数据接口后,就可以根据这个定义用C++或Python编译。
在package.xml中添加功能包依赖
添加动态生成程序的功能包依赖。
打开package.xml文件,将下面代码拷到文件指定位置:
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
build_depend为编译依赖,这里依赖的是一个会动态产生message的功能包
exer_depend为执行依赖,这里依赖的是一个动态runtime运行的功能包
在CMakeLists.txt中添加编译选项
为什么要添加编译选项:
- 因为在package.xml添加了功能包编译依赖,在CMakeList.txt里的find_package中也要加上对应的部分;
- 需要将定义的Person.srv作为消息接口,针对它做编译;
- 需要指明编译这个消息接口需要哪些ROS已有的包;
有了这两个配置才可将定义的srv编译成不同的程序文件 - 因为在package.xml添加了功能包执行依赖,在CMakeList.txt里的catkin_package中也要加上对应的部分;
代码,复制到图示位置:
find_package( ...... message_generation)add_service_files(FILES Person.srv)
generate_messages(DEPENDENCIES std_msgs)catkin_package( ...... message_runtime)
编译生成语言相关文件
以上完成后,到工作空间根目录,编译:
catkin_make
编译完成后,我们可以在 devel/include/learning_topic/ 下找到这个C++的头文件;
也可以在 devel/lib/python3/dist-packages/learning_topic/mrv 下找到Python的包。
4 创建代码并编译运行(C++)
创建代码
我们创建一个Client代码和一个Server代码,通过程序调用生成的头文件。
(源码:https://github.com/guyuehome/ros_21_tutorials/tree/master/learning_service/src)
用红字标示了自己的注解笔记。
在代码中我们调用了自己编译好的头文件,使用了自定义的Person类和属性。
将代码拷贝到src文件夹下。
编译
先配置CMakeLists.txt编译规则,复习一下规则:
- 设置需要编译的代码和生成的可执行文件;
- 设置链接库;
- 添加依赖项。
将下面代码拷贝到指定位置:
add_executable(person_server src/person_server.cpp)
target_link_libraries(person_server ${catkin_LIBRARIES})
add_dependencies(person_server ${PROJECT_NAME}_gencpp)add_executable(person_client src/person_client.cpp)
target_link_libraries(person_client ${catkin_LIBRARIES})
add_dependencies(person_client ${PROJECT_NAME}_gencpp)
第三项是添加依赖项,因为代码涉及到动态生成,我们需要将可执行文件与动态生成的程序产生依赖关系。
注:这里添加的依赖项用到的是gencpp包,是一个C++用的ROS message 和 service 生成器,以依赖动态生成的cpp文件。
然后编译:
cd ~/catkin_ws
catkin_make
运行
默认已经source,接着运行。
roscore
rosrun learning_service person_server
rosrun learning_service person_client
可以看到运行Server后,启动Client会发一次人物信息,在Server端看到,看到后反馈给Client确认后终止这次发送行为。
先运行Client的话则会一直等待Server端接收,直到Server端启动接收到信息。
5 创建代码并编译运行(Python)
创建代码
我们创建一个Client代码和一个Server代码,通过程序调用自己编译的py库。
(源码:https://github.com/guyuehome/ros_21_tutorials/tree/master/learning_service/scripts)
用红字标示了自己的注解笔记。绿字是Python3的修正。
将代码拷贝到scripts文件夹下。
右击py文件→属性,打开执行权限。
编译
配置CMakeLists.txt编译规则
加上一个关于person_server.py和person_client.py的catkin_install_python方法:
下面代码写到指定位置
然后编译
cd ~/catkin_ws
catkin_make
运行
默认已经source,接着运行。
roscore
rosrun learning_topic person_server.py
rosrun learning_topic person_client.py
可以看到运行Server后,启动Client会发一次人物信息,在Server端看到,看到后反馈给Client确认后终止这次发送行为。
先运行Client的话则会一直等待Server端接收,直到Server端启动接收到信息。
【ROS学习笔记】11.服务数据(srv)的定义与使用相关推荐
- vs2010 学习Silverlight学习笔记(11):数据与通信之WebClient
概要: 基础知识终于学完了,我今天又从第一篇看到第十篇,发现明白了一些东西,还有忘记了部分东西.呵呵,咱不能猴子掰玉米,学了新的忘记旧的.要经常去复习,去用.这一篇是数据通信部分的第一篇,有些东西没接 ...
- ROS:服务数据(srv)的定义与使用
目录 一.服务模型 二.创建功能包 三.自定义服务数据 3.1定义srv文件 3.2在package.xml中添加功能包依赖 3.3在CMakeLists.txt中添加编译选项 3.4编译生成语言相关 ...
- ros学习笔记_服务通讯
学习地址 0.话题通讯理论模型 前言: 话题通信基本操作(C++) 注:启动roscore的时候rosmaster已经启动了,因此ROS master 不需要实现,而连接的建立也已经被封装了(因此连接 ...
- ROS学习笔记11(用C++写一个简单的消息发布和消息订阅)
文章目录 1 写一个消息发布节点 2 写一个消息订阅节点 3 构建节点 1 写一个消息发布节点 首先切换到工作目录: roscd beginner_tutorials 接着,创建src/talker. ...
- ROS 学习笔记(三):自定义服务数据srv+server+client 示例运行
ROS 学习笔记(三):自定义服务数据srv+Server+Client 示例运行 一.自定义服务数据: 1.向功能包添加自定义服务文件(AddTwoInts.srv) cd ~/catkin_ws/ ...
- ROS学习笔记六:理解ROS服务和参数
ROS学习笔记六:理解ROS服务和参数 主要介绍ROS服务和参数,同时使用命令行工具rosservice和rosparam. ROS service service是节点之间互相通信的另一种方式,se ...
- ROS学习笔记十:用C++编写一个简单的服务和客户端
ROS学习笔记十:用C++编写一个简单的服务和客户端 这一节主要介绍如何使用C++编写一个简单的服务和客户端节点. 编写服务节点 由于在前面的练习中,已经向beginner_tutorials软件包中 ...
- ROS学习笔记八:创建ROS msg和srv
ROS学习笔记八:创建ROS msg和srv 本节主要讲述了如何创建和建立ROS msg和srv,同时使用命令行工具rosmsg.rossrv和roscp. msg和srv简介 msg:描述ROS m ...
- ROS学习笔记十一:ROS中数据的记录与重放
ROS学习笔记十一:ROS中数据的记录与重放 本节主要介绍如何记录一个正在运行的ROS系统中的数据,然后在一个运行的系统中根据记录文件重新产生和记录时类似的运动情况.本例子还是以小海龟例程为例. 记录 ...
最新文章
- 很高兴加入51cto——交朋友
- 腾讯Hermes设计概要——数据分析用的是列存储,词典文件前缀压缩,倒排文件递增id、变长压缩、依然是跳表-本质是lucene啊...
- string与stringBuilder的效率与内存占用实测
- 世界最厉害的14位程序员,你认识几个?
- HTML5教程之-文件拖拽功能实现
- Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2)C. Voltage Keepsake
- java分布式和集成式_【分布式java应用笔记】分布式与soa
- javascript设计模式 ---序
- 如何做好Web接口测试
- [转]win7添加xp的快速启动栏
- matlab中unique的作用,matlab中的unique函数详解
- (stream流)List转Map
- 读书笔记 | 4.3 基于征信系统的征信基础产品
- c语言计算个人成绩平均分,C语言 | 计算总平均分及第n个人的成绩
- css——给多张图片设置一个背景图:上下固定尺寸+中间拉伸,里面放内容
- 大数至简,带您实现“数据自由”,炎凰数据免费社区版产品正式发布
- 本月,我最推荐的意外保险排行榜
- 最近公共祖先 (Lowest common ancestor)
- 学计算机用多大的u盘合适,u盘装系统需要多大的u盘?很多人都做错了!
- アプリケーションコンポーネント(大分類)
热门文章
- 华为iot 应用侧 开发
- photoshop制作一寸照片
- CTC介绍(connectionist temporal classification论文翻译)
- 微型计算机为控制器的基本功能是,微型计算机控制器的基本功能是什么?
- 软件成本估算流程详解及案例分享【国内行业规范-NESMA】
- AndroidStudio打包.so库
- imap与pop3的区别
- 【和77】火车到底能不能当出租车开呢?(温微观察13-7)
- oracle事务管理器,全能数据库盘问分析器中的事务管理在oracle中的应用.doc
- 高校计算机专业教师年终总结,计算机教师年终工作总结