ros1 基础学习09 -自定义service服务开发示例

news2024/11/25 23:46:04

自定义service服务开发示例

    • 如何使用服务
    • 一、模型图
    • 二、创建功能包
    • 三、自定义服务数据
      • 3.1 在package.xml中添加功能包依赖
      • 3.2 在CmakeLists.txt中添加编译选项
      • 3.3 编译生成的C++文件和Python库
      • 4.1.2 编译整个工作空间
    • 测试:

在ROS中,除了消息这种通信类型外,还有一种称为服务的通信类型。不同于消息通信是单向的,服务是一种双向的通信,可以对接收到的请求做出回应。接下来练习如何使用自定义的消息类型进行通信测试。

如何使用服务

服务是能够使节点之间相互通信的另一种方法。服务允许节点发送请求和接收响应。
可以使用rosservice工具与服务进行交互。此命令接受的参数如下所示:

  1. 输出服务参数。
rosservice args/service 
  1. 根据命令行参数调用服务。
rosservice call/service 
  1. 根据服务类型查询服务。
rosservice find msg-type 
  1. 输出服务信息。
rosservice info/service 
  1. 列出活动服务清单。
rosservice list 
  1. 输出服务类型。
rosservice type/service 
  1. 输出ROSRPC URI服务。
rosservice uri/service 

一、模型图

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

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

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

主要就是已事件通知为主,监听模式的形式,学过java 就比如是spring 的 SpringEvent 事件机制。

在这里插入图片描述

二、创建功能包

注:进行这个步骤需要根据前面几个文章来,不然你这个learning_service会觉得莫名其妙

在learning_service目录下创建srv文件夹,并创建Person.srv文件

在这里插入图片描述

Person.srv 内容如下:

string name
uint8 sex
uint8 age

uint8 unknown = 0
uint8 male = 1
uint8 female = 2
---
string result

破折号下面的是Response的结果,上面是Response的内容

三、自定义服务数据

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

补充以下内容:

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

在这里插入图片描述

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

3.2 在CmakeLists.txt中添加编译选项

为什么要添加编译选项?

在package.xml添加了功能包编译依赖,因此CMakeList.txt里的find_package中也要加上对应的部分;需要将定义的Person.srv作为消息接口,针对它做编译;

需要指明编译这个消息接口需要哪些ROS已有的包;
有了这两个配置才可将定义的srv编译成不同的程序文件,
因为在package.xml添加了功能包执行依赖,在CMakeList.txt里的catkin_package中也要加上对应的部分;

package.xml 文件类似java 中的pom.xml 文件

将以下信息分别对应添加到指定区域:


find_package( ...... message_generation)


add_service_files(FILES Person.srv)

generate_messages(DEPENDENCIES std_msgs)

catkin_package( ...... message_runtime)

在这里插入图片描述

在这里插入图片描述
放开注释,添加 message_runtime
在这里插入图片描述

3.3 编译生成的C++文件和Python库

cd ~/catkin_ws
catkin_make

显示如下表示编译成功

在这里插入图片描述

四、代码实现
4.1 以C++为例
将以下两个cpp文件放到src目录下:

person_client.cpp

/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************/

/**
 * 该例程将请求/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;

    // 发现/show_person服务后,创建一个服务客户端,连接名为/show_person的service
	ros::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 = "Tom2";
	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

/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************/

/**
 * 该例程将执行/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,注册回调函数personCallback
    ros::ServiceServer person_service = n.advertiseService("/show_person", personCallback);

    // 循环等待回调函数
    ROS_INFO("Ready to show person informtion.");
    ros::spin();

    return 0;
}

在这里插入图片描述

4.1.1 配置代码编译规则
将以下代码拷贝进CmakeList.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)

在这里插入图片描述

4.1.2 编译整个工作空间

cd ~/catkin_ws
catkin_make

编译成功如下图:
在这里插入图片描述

测试:

启动ros 服务

roscore

启动服务端服务

rosrun learning_service person_server

启动后我们 查看当前服务的列表

rosservice list

可以看到现在已经多一个 叫 show_peoper 的服务

在这里插入图片描述

启动客户端 就是模拟去请求一次,服务端就会将客户端的请求参数信息显示出来

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1193401.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云数据安全:在数字时代保护您的宝贵资产

在数字化时代&#xff0c;云计算已经成为企业和个人数据存储和处理的主要方式。然而&#xff0c;与之相伴而来的是日益严峻的数据安全挑战。本文将探讨云数据安全的重要性以及如何在云环境中保护您的数据。 一、云计算的崭新时代 云计算为组织提供了无与伦比的灵活性和效率&…

LinkedList的插入速度一定比ArrayList快吗?

目录 一、有一道经典的面试题&#xff0c;“ArrayList 和 LinkedList 的区别是什么&#xff1f;”1、小白答法&#xff1a;2、入门答法&#xff1a;3、系统回答 二、LinkedList的插入速度一定比ArrayList快吗&#xff1f;三、分析一下两种数据结构的add源码1、先分析熟悉的Arra…

AI生成技术威胁版权保护,水印技术和法律完善是关键/安圭拉小岛以.ai域名注册赚得3000万美元 |魔法半周报

我有魔法✨为你劈开信息大海❗ 高效获取AIGC的热门事件&#x1f525;&#xff0c;更新AIGC的最新动态&#xff0c;生成相应的魔法简报&#xff0c;节省阅读时间&#x1f47b; &#x1f525;资讯预览 AI生成技术威胁版权保护&#xff0c;水印技术和法律完善是关键 Sam Altman对…

Python数据结构: 列表(List)详解

在Python中&#xff0c;列表&#xff08;List&#xff09;是一种有序、可变的数据类型&#xff0c;被广泛用于存储和处理多个元素。列表是一种容器&#xff0c;可以包含任意数据类型的元素&#xff0c;包括数字、字符串、列表、字典等。本文将深入讨论列表的各个方面&#xff0…

续:将基于Nasm汇编的打字小游戏,移植到DOSBox

续&#xff1a;将基于Nasm汇编的打字小游戏&#xff0c;移植到DOSBox 文章目录 续&#xff1a;将基于Nasm汇编的打字小游戏&#xff0c;移植到DOSBox前情提要细说1 编译2 程序入口3 定位段 运行体验 前情提要 上一篇&#xff1a;【编程实践】黑框框里的打字小游戏&#xff0c;但…

一键创建PDF文档,高效管理您的文件资料

在繁忙的工作中&#xff0c;您是否曾为处理PDF文件而感到烦恼&#xff1f;现在&#xff0c;我们为您推荐一款全新的高效PDF文档管理工具——一键创建PDF文档&#xff0c;让您的工作效率瞬间提升&#xff01; 首先&#xff0c;在首助编辑高手的主页面板块栏里&#xff0c;选择“…

集简云银行系统:API连接广告推广与客服系统,降低企业研发成本

连接多元化软件系统的挑战 在企业进行业财税一体化的进程中&#xff0c;以及企业数字化进程中&#xff0c;企业需要连接多个软件系统。然而&#xff0c;随着业务的发展&#xff0c;使用的软件越来越多&#xff0c;软件与软件之间的连接和数据同步成为了一个挑战。这在公司的财…

【神印王座】林鑫和李馨甜蜜接吻,团灭七阶恶魔,温馨结尾

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 深度爆料&#xff0c;《神印王座》80话最新剧情解析。有关李馨与林鑫的爱情故事源于一场争执。那时&#xff0c;两人都年轻气盛&#xff0c;不肯向对方低头。但是&#xff0c;经过一段时间的相处&#xff0c;…

C#,Python实践,用CodeFormer实现人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色

无论是自己、家人或是朋友、客户的照片&#xff0c;免不了有些是黑白的、被污损的、模糊的&#xff0c;总想着修复一下。作为一个程序员 或者 程序员的家属&#xff0c;当然都有责任满足他们的需求、实现他们的想法。除了这个&#xff0c;学习了本文的成果&#xff0c;或许你还…

盘点10个地推拉新和网推拉新app推广接单平台,免费一手渠道平台

首推&#xff1a;”聚量推客“ 一手官签服务商 官方邀请码 000000 在地推行业里&#xff0c;每个人心中的第一的地推拉新app推广接单平台可能不一样&#xff0c;但之所以会把相关的地推拉新app推广平台推上第一的宝座&#xff0c;就是因为这些地推平台有过人的优势。因此本篇文…

JavaScript如何实现钟表效果,时分秒针指向当前时间,并显示当前年月日,及2024春节倒计时,源码奉上

本篇有运用jQuery&#xff0c;记得引入jQuery库&#xff0c;否则不会执行的喔~ <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title></title> <meta name"chenc" content"Runoob"> <met…

立体库堆垛机提升电机运行动作功能块

形成允许提升定位距离误差其误差值可要据现场实际更改 进入提升定位范围内

苹果M3 MacBook Pro续航实测 续航超17小时 比 M2 Pro 还要长

苹果公司在日前召开的“来势迅猛”主题活动中&#xff0c;推出了新款 MacBook Pro 机型&#xff0c;搭载全新 3nm M3 系列芯片&#xff0c;显著提高续航表现&#xff0c;苹果表示&#xff0c;新机提供了“Mac 有史以来最长的电池续航”。 配备 M3 芯片的 14 英寸 MacBook Pro 在…

具名挂载和匿名挂载

匿名卷挂载 &#xff1a; -v 的时候只指定容器内的路径 如下面这个&#xff1a;/etc/nginx 1.docker run -d -P --name nginx -v /etc/nginx nginx 2.查看所有卷 docker volume ls 这里发现&#xff0c;这就是匿名挂载&#xff0c;只指定容器内的路径&#xff0c;没有指定…

Redis的内存淘汰策略分析

概念 LRU 是按访问时间排序&#xff0c;发生淘汰的时候&#xff0c;把访问时间最久的淘汰掉。LFU 是按频次排序&#xff0c;一个数据被访问过&#xff0c;把它的频次 1&#xff0c;发生淘汰的时候&#xff0c;把频次低的淘汰掉。 几种LRU策略 以下集中LRU测率网上有很多&am…

blender动画制作软件拓扑全流程

拓扑在三维动画制作中至关重要&#xff0c;原因如下&#xff1a; 1. 动画变形&#xff1a; 自然形变&#xff1a; 良好的拓扑结构能够支持角色或物体在动画中的自然形变&#xff0c;例如关节弯曲、肌肉收缩等。流畅运动&#xff1a; 适当的拓扑有助于保持模型表面的平滑性&…

Simulia仿真之CST的使用指南(1) | 百世慧®

前言 CST是Computer Simulation Technology的缩写,是全球范围内众多工程师都喜欢使用的高端电磁仿真分析软件。 本文又名《智慧的CST生活》这里一共列出了120个章节&#xff0c;其中包括CST使用过程中的有用小技巧&#xff0c;还有给用户提供技术支持的过程中常见的问题。本专…

QWidget 实现九宫格图案解锁

前言 最近需要实现一个九宫格图案解锁功能,查看网上的方案,基于QWidget的方案全网搜来搜去就一篇 Qt编写自定义控件:图案密码锁, 都是炒来炒去的同一篇,代码还比较复杂,运行后在PC端还是可以的,但是运行在arm机器上,就卡顿,或者容易断开手势连接线,各种不友好,于是自…

5.浮点数及其运算

目录 一. 浮点数的表示 &#xff08;1&#xff09;表示 &#xff08;2&#xff09;规格化 二. IEEE 754标准 三. 浮点数的运算 &#xff08;1&#xff09;步骤 &#xff08;2&#xff09;关于舍入 四. C语言的强制类型转换 一. 浮点数的表示 &#xff08;1&#xff09…

Kali无线网卡无法识别

啊莫,该不会有人Kali系统识别不了自己的无线网卡吧! 环境:本来用作监听功能的3037芯片无线网卡,自己胡乱调,一不小心调试成了物理网卡的功能,变成了WLAN2网卡,结果用在了Windows系统上!如果你也是这样,点开你的网络适配器看看吧! 解决思路:1.删驱动 删除Windows上的…