首页 > 其他分享 >[ROS学习]11. 服务数据(srv)的定义与使用

[ROS学习]11. 服务数据(srv)的定义与使用

时间:2022-08-31 16:56:23浏览次数:96  
标签:11 person 代码 Person 编译 srv learning ROS

笔记参考:ROS学习笔记】11.服务数据(srv)的定义与使用

内容参考:基于B站ROS公开课:【古月居】古月·ROS入门21讲

本节说明

前面讲了两个Service模式的例子,分别用到了两种服务数据:turtlesim/Spawn和std_srvs/Trigger。
我们可以使用 rossrv show ...来查看数据结构:

我们可以看到Spawn中的Request部分含坐标信息、朝向角和名称,Response部分含名称。
Trigger中Request部分为空,Response部分含成功Flag、消息内容。

与之前topic种的msg类似,我们也可以用相似的语法自定义服务数据srv
这节我们来自己定义服务数据(srv)来满足个性化的需求。

1 模型图

在第8节我们讲解了话题消息msg的定义与使用,在第8节的例子中我们曾自定义了一个消息类型“Person”以发布个人信息,Publisher发布个人信息,Subscriber接收个人信息。这个例子中,Publisher会不断地发信息,Subscriber不停地接数据,一开动就停不下来了,也是topic模式的缺陷。

本节我们使用Service模式用自定义的服务数据srv来实现,我们希望Request一次才发一次信息来显示。

如图,Client发布显示某个人的信息的Request,通过自定义的服务数据“Person”(learning_service::Person)来发出去。
Server端收到Request,显示这个人的具体信息,同时发Response向Client反馈显示结果。
ROS Master负责管理节点。

2 创建功能包

本节还是使用上节创建的 learning_service 包来进行代码存放和编译。

3 自定义服务数据

定义srv文件

我们通过自定义.srv文件来自定义服务数据。与之前自定义话题数据.msg类似。
我们定义.srv文件名为:Person.srv

  1. 在learning_service的功能包根目录下,新建文件夹 srv
    并创建新文件 Person.srv,创建方法为使用touch命令在当前目录输入:touch Person.srv
  2. 我们把下面代码输入进Person.srv,打开文件可以用:gedit Person.srv(Ubuntu)
string name
uint8 sex
uint8 age

uint8 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中添加编译选项

为什么要添加编译选项:

  1. 因为在package.xml添加了功能包编译依赖,在CMakeList.txt里的find_package中也要加上对应的部分;
  2. 需要将定义的Person.srv作为消息接口,针对它做编译;
  3. 需要指明编译这个消息接口需要哪些ROS已有的包;
    有了这两个配置才可将定义的srv编译成不同的程序文件
  4. 因为在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++的头文件(有三个,Person.h为总内容);
也可以在 devel/lib/python3/dist-packages/learning_topic/mrv 下找到Python的包。

4 创建代码并编译运行(C++)

创建代码

我们创建一个Client代码和一个Server代码,通过程序调用生成的头文件。

编译

先配置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库。
参考笔记。绿字是Python3的修正。

将代码拷贝到scripts文件夹下。
右击py文件→属性,打开执行权限。

编译

运行

roscore
rosrun learning_topic person_server.py
rosrun learning_topic person_client.py

标签:11,person,代码,Person,编译,srv,learning,ROS
From: https://www.cnblogs.com/gentlejan/p/16643657.html

相关文章

  • seafile onlyoffice k8s traefik Cross origin requests are only supported for prot
    这个问题我实际上是用答案倒推寻找的原因完整报错:hasbeenblockedbyCORSpolicy:Crossoriginrequestsareonlysupportedforprotocolschemes:http,data,chr......
  • 力扣 110. 平衡二叉树 [基础+优化]
    110.平衡二叉树给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。......
  • 【Java学习Day11】变量种类及命名规范
    变量变量是什么:就是可以变化的量Java是一种强类型语言,每个变量都必须声明其类型Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域typevarNa......
  • P3514 [POI2011]LIZ-Lollipop
    给定长度为\(n\)的序列,里面的元素为1或2,求是否有一种方案,取出连续的一段,使得到的元素和等于给定的值,若可以则输出一种方案。多组询问,\(n,q\leq10^6\)。感觉有点水,典......
  • 侯捷老师c++11重点
    作者:还有offer嘛链接:https://www.nowcoder.com/discuss/962212?page=3来源:牛客网  •指针、引用、数组、内存•右值引用与完美转发•引用与指针区别•C和......
  • luoguP8085 [COCI2011-2012#4] KRIPTOGRAM 题解(KMP)
    /*给定明文和密文,密文与明文的某个字串格式相同,找出密文出现的最早位置。如:明文aaabcdabc 密文xy ans:3解:容易想到KMP算法。可以发现,密文和对应子串的格式相同......
  • JS311,第 2 天
    JS311,第2天你如何组织你的代码?您在网上找到了哪些建议?我通过JavaScript中的简化函数来组织我的代码。我还尝试组织我的CSS以尽可能地匹配我的HTML。网络建议按......
  • 11.过去完成进行时1
    过去完成进行时过去完成进行时与现在完成进行时的用法在本质上是相同的,区别只是说话的“参照时间”由现在移到过去。过去完成进行时表示开始于过去某个时刻之前的动作......
  • C++11可变参数模板(函数模板、类模板)
    https://yngzmiao.blog.csdn.net/article/details/105247065......
  • 11 个需要避免的 React 错误用法
    11个需要避免的React错误用法王平安​lovecoding,lovelife~​关注他 4人赞同了该文章随着React越来越受欢迎,React开发者也越来越......