目录

  • 一、服务模型
  • 二、创建功能包
  • 三、自定义服务数据
    • 3.1定义srv文件
    • 3.2在package.xml中添加功能包依赖
    • 3.3在CMakeLists.txt中添加编译选项
    • 3.4编译生成语言相关文件
  • 四、创建代码并编译运行(C++)
    • 4.1创建代码
    • 4.2编译
    • 4.3运行

一、服务模型


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

二、创建功能包

使用 ROS:客户端Client的编程实现 中创建的 learning_service 包来进行代码存放和编译。

三、自定义服务数据

3.1定义srv文件

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

在learning_topic的功能包根目录下,新建文件夹 srv

并创建新文件 Person.srv,创建方法为使用touch命令在当前目录输入:

touch Person.srv


我们把下面代码复制进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编译。

3.2在package.xml中添加功能包依赖

添加动态生成程序的功能包依赖。
打开package.xml文件,将下面代码拷到文件指定位置:

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

build_depend为编译依赖,这里依赖的是一个会动态产生message的功能包
exer_depend为执行依赖,这里依赖的是一个动态runtime运行的功能包

3.3在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)


3.4编译生成语言相关文件

到工作空间根目录,编译:

catkin_make

编译完成后,我们可以在 devel/include/learning_topic/ 下找到这个C++的头文件;
也可以在 devel/lib/python3/dist-packages/learning_topic/mrv 下找到Python的包。

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

4.1创建代码

learning_service\src文件夹下创建一个Client代码和一个Server代码,通过程序调用生成的头文件。

person_client.cpp

/*** 该例程将请求/show_person服务,服务数据类型learning_service::Person*/#include <ros/ros.h>
#include "learning_service/Person.h"int main(int argc, char** argv)
{// 初始化ROS节点ros::init(argc, argv, "person_client");// 创建节点句柄ros::NodeHandle node;// 发现/spawn服务后,创建一个服务客户端,连接名为/spawn的serviceros::service::waitForService("/show_person");ros::ServiceClient person_client = node.serviceClient<learning_service::Person>("/show_person");// 初始化learning_service::Person的请求数据learning_service::Person srv;srv.request.name = "Tom";srv.request.age  = 20;srv.request.sex  = learning_service::Person::Request::male;// 请求服务调用ROS_INFO("Call service to show person[name:%s, age:%d, sex:%d]", srv.request.name.c_str(), srv.request.age, srv.request.sex);person_client.call(srv);// 显示服务调用结果ROS_INFO("Show person result : %s", srv.response.result.c_str());return 0;
};

person_server.cpp

/*** 该例程将执行/show_person服务,服务数据类型learning_service::Person*/#include <ros/ros.h>
#include "learning_service/Person.h"// service回调函数,输入参数req,输出参数res
bool personCallback(learning_service::Person::Request  &req,learning_service::Person::Response &res)
{// 显示请求数据ROS_INFO("Person: name:%s  age:%d  sex:%d", req.name.c_str(), req.age, req.sex);// 设置反馈数据res.result = "OK";return true;
}int main(int argc, char **argv)
{// ROS节点初始化ros::init(argc, argv, "person_server");// 创建节点句柄ros::NodeHandle n;// 创建一个名为/show_person的server,注册回调函数personCallbackros::ServiceServer person_service = n.advertiseService("/show_person", personCallback);// 循环等待回调函数ROS_INFO("Ready to show person informtion.");ros::spin();return 0;
}

4.2编译

配置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文件。

4.3运行

roscore
rosrun learning_service person_server

rosrun learning_service person_client


可以看到运行Server后,启动Client会发一次人物信息,在Server端看到,看到后反馈给Client确认后终止这次发送行为。
先运行Client的话则会一直等待Server端接收,直到Server端启动接收到信息。
参考视屏:古月居ROS入门21讲

ROS:服务数据(srv)的定义与使用相关推荐

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

    基于B站ROS公开课:[古月居]古月·ROS入门21讲 基于Ubuntu 20.04.1.Noetic版本 修正错误,并详述Python版本部署 文章目录 1 模型图 2 创建功能包 3 自定义服务数 ...

  2. ROS 学习笔记(三):自定义服务数据srv+server+client 示例运行

    ROS 学习笔记(三):自定义服务数据srv+Server+Client 示例运行 一.自定义服务数据: 1.向功能包添加自定义服务文件(AddTwoInts.srv) cd ~/catkin_ws/ ...

  3. 【RK3399Pro学习笔记】十一、ROS服务数据的定义与使用

    目录 自定义服务数据 定义srv文件 在package.xml中添加功能包依赖 在CMakeLists.txt添加编译选项 编译生成语言相关文件 使用 C++ 编写程序 person_server.c ...

  4. 第十三弹 服务数据的定义与使用

    1.服务模型(服务端/客户端) 2.自定义服务数据 2.1定义srv文件 服务是有response的,所以需要上下分割.三个横线以上,是request数据,横线以下,是response数据. 创建一个 ...

  5. ROS系统 服务数据的定义与使用

    如何自定义服务数据 定义srv文件 在package.xml中添加功能包依赖 在CMakeLists.txt添加编译选项 编译生成语言相关文件 cd ~/catkin_ws/src/learning_ ...

  6. ROS入门-13.服务数据的定义与使用

    前面我们已经学习到了spawn和Trigger两种在ROS中已经定义好的服务数据类型的使用方式,当已经定义好的服务数据不能满足我们需求时,就需要根据自己需求来定义一个服务数据的类型并使用 之前在自定义 ...

  7. 【ROS学习笔记】(八)服务数据的定义与使用

    一.目的 Client每Request一次数据请求,Server发送一次数据.数据格式为个人信息,如姓名.性别等. 二.自定义服务数据 此步骤与话题消息的定义与使用过程类似 1. 定义srv文件 再l ...

  8. ROS应用开发入门 服务数据的定义和使用

    ROS是机器人操作系统的简称,本文介绍ROS应用开发入门,服务数据的定义和使用.客户端和服务端 之间通讯都使用服务数据(service data).本文先定义一个服务数据,编译成功后,用一个服务端和一 ...

  9. 7.ROS编程学习:自定义服务数据c++调用

    目录 一.准备工作--配置vscode 二.服务端创建 1.创建文件demo01_server.cpp 2.服务端的CMakeList.txt配置 3.测试服务端 三.客户端实现 1.创建domo01 ...

最新文章

  1. python的try exception捕获异常
  2. ARM汇编伪指令介绍(全集)
  3. tomcat 7连接池配置与使用
  4. Qt 视图框架示例 Colliding Mice 的翻译
  5. 在html页面提交值到动态页面时出现中文值为乱码的解决方案
  6. 中国人口较少民族作家研讨会
  7. java中,剩下的这两个内部类不太好理解!
  8. Lua4.0 实现#操作,获取table大小
  9. webpack的面试题
  10. 树莓派 Learning 001 装机 ---之 1 安装NOOBS系统
  11. WordPress目录解析
  12. python之输出语句
  13. 实现土豆网的视频播放
  14. 免费pdf转换成jpg图片方法
  15. MMORPG开发入门[转]
  16. CondaSSLError: OpenSSL appears to be unavailable on this machine.
  17. C语言实现连接MySQL服务器CURD
  18. 新手如何靠区块链赚钱?
  19. Java程序员的职业规划(五年)
  20. java可变参数 map_Java第6期Collection、Map、迭代器、泛型、可变参数、集合工具类、集合结构、Debug...

热门文章

  1. 西门子V90伺服驱动器的面板控制
  2. 牛掰!100行Python,自动动手打造一款多国语言翻译软件,酷啊!
  3. leetcode 594最长和谐子序列
  4. HDOJ 畅通工程 1232(并查集入门)
  5. 优先级调度算法实现_《操作系统原理》实验一:进程调度
  6. 2021-12-23 统计学-基于R(第四版)第十一章课后习题记录及总结
  7. 关于webgis技术选型的一些思考
  8. [导入]视频网站源码
  9. MySQL 5.7.29详细下载安装配置教程winx64
  10. MIS/MRP/ERP/OA/BPM/CMS等概念解析