一、目的

Client每Request一次数据请求,Server发送一次数据。数据格式为个人信息,如姓名、性别等。

二、自定义服务数据

此步骤与话题消息的定义与使用过程类似

1. 定义srv文件

learning_service文件夹下新建一个文件夹srv,再在srv文件夹内新建一个Person.srv文件,内容如下

string name
uint8  age
uint8  sexuint8 unknown = 0
uint8 male    = 1
uint8 female  = 2---
string result

—以上是request的数据,—以下是response的数据

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

打开learning_service/package.xml,在文件最后部分添加如下代码

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

3. 在CMakeLists.txt中添加编译选项

首先在find_package最后一行添加一条语句message_generation,用以添加依赖的功能包

find_package(catkin REQUIRED COMPONENTSgeometry_msgsroscpprospystd_msgsturtlesimmessage_generation
)

在此函数下面再添加

add_service_files(FILESPerson.srv
)generate_messages(DEPENDENCIESstd_msgs
)

add_message_files,将Person.srv作为定义的接口

generate_messages,在编译Person.srv文件时需要依赖的功能包

然后在下方catkin specific configuration内的catkin_packages中,添加依赖message_runtime,修改后的代码如下:

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES learning_topicCATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs turtlesim message_runtime
#  DEPENDS system_lib
)

4. 编译生成相关文件
cd ~/catkin_ws
catkin_make

三、创建服务器代码

~/catkin_ws/src/learning_service/src目录下创建一个person_server.cpp`的文件

/*** 该例程将执行/show_person服务,服务数据类型learning_service::Person
REFERENCE:www.guyuehome.com*/#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;
}

四、创建客户端代码

同样在~/catkin_ws/src/learning_service/src目录下创建一个person_client.cpp的文件,其内容为:

/*** 该例程将请求/show_person服务,服务数据类型learning_service::Person
REFERENCE:www.guyuehome.com*/#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 = "Huffie";srv.request.age  = 21;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;
};

五、配置服务器/客户端代码编译规则

打开learning_service中的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)

六、编译并运行发布者和订阅者

首先进行编译

cd catkin_ws
catkin_make

运行发布者和订阅者

roscore
rosrun learning_service person_server
rosrun learning_service person_client

client每请求一次,会接受到一次数据

【ROS学习笔记】(八)服务数据的定义与使用相关推荐

  1. ROS学习笔记八:创建ROS msg和srv

    ROS学习笔记八:创建ROS msg和srv 本节主要讲述了如何创建和建立ROS msg和srv,同时使用命令行工具rosmsg.rossrv和roscp. msg和srv简介 msg:描述ROS m ...

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

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

  3. ros学习笔记_服务通讯

    学习地址 0.话题通讯理论模型 前言: 话题通信基本操作(C++) 注:启动roscore的时候rosmaster已经启动了,因此ROS master 不需要实现,而连接的建立也已经被封装了(因此连接 ...

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

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

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

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

  6. ROS学习笔记(八): ROS通信架构

    ROS学习笔记(八): ROS通信架构 文章目录 01 Node & Master 1.1 Node 1.2 Master 1.3 启动master和node 1.4 rosrun和rosno ...

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

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

  8. ROS学习笔记六:理解ROS服务和参数

    ROS学习笔记六:理解ROS服务和参数 主要介绍ROS服务和参数,同时使用命令行工具rosservice和rosparam. ROS service service是节点之间互相通信的另一种方式,se ...

  9. ZooKeeper学习笔记(八):ZooKeeper集群写数据原理

    写数据原理 写流程直接请求发送给Leader节点 这里假设集群中有三个zookeeper服务端 ACK (Acknowledge character)即是确认字符,在数据通信中,接收站发给发送站的一种 ...

  10. ROS学习笔记十一:ROS中数据的记录与重放

    ROS学习笔记十一:ROS中数据的记录与重放 本节主要介绍如何记录一个正在运行的ROS系统中的数据,然后在一个运行的系统中根据记录文件重新产生和记录时类似的运动情况.本例子还是以小海龟例程为例. 记录 ...

最新文章

  1. java面试 内存中堆和栈的区别
  2. struts2 防止表单重复提交--令牌机制
  3. 来深入了解一下 Eureka 的工作机制及相关原理
  4. windows10 下 用图片手把手教你 卸载 cygwin
  5. vb怎么抓取html的class,vbs怎么获取网页内容
  6. 被阿里P8面了两个小时,技术、业务有来有回......
  7. 玩转算法面试:(一)什么是算法面试?
  8. 【Vue2.0】— 插件(十六)
  9. windows服务器上安装的有mysql环境怎么创建数据库_Windows环境MySQL数据库安装方法...
  10. multisim10中设置变压器匝数比的两种方法
  11. python获取管理员权限
  12. 华为鸿蒙系统支持5g吗,华为新机入网:预装鸿蒙OS 不支持5G网络
  13. c++定义结构体队列
  14. 【公基】口算提速,java 自动生成:加、减、乘、除、混合运算题目
  15. HDU 5855 Less Time, More profit 【最大流-最大权闭合子图】
  16. 发现一php木马代码
  17. MOGRT动态图标模板 爱情元素手绘爱心特效pr视频模板
  18. 3.3 CNN经典网络实现
  19. C# 操作Excel数据透视表详解 – 创建、操作和删除
  20. 计算:[(1*2*4+2*4*8+...+n*2n*4n)/(1*3*9+2*6*18+...+n*3n*9n)]^2的值

热门文章

  1. matlab实现直方图均衡化
  2. pod配置Liveness和Readiness探针
  3. python应用系列教程——python使用socket创建tcp服务器和客户端
  4. item系列内置方法重构类
  5. PATB 1038. 统计同成绩学生(20)
  6. 【MyBatis源码解析】MyBatis一二级缓存
  7. 推荐几个精致的web UI框架
  8. 闲来无事写写-Huffman树的生成过程
  9. volatile 变量
  10. ADO,ADO.NET,OLEDB,ODBC连接数据库的区别