15.服务数据的定义与使用

2023-11-14

学习视频:https://www.bilibili.com/video/BV1zt411G7Vn?p=15
目标:服务数据的自定义,客户端发布显示个人信息的请求,服务端处理请求及反馈应答。
一、自定义服务数据
1.定义srv文件

mkdir ~/catkin_ws/src/learning_service/srv
gedit ~/catkin_ws/src/learning_service/srv/Person.srv

运行命令打开Person.srv文件,复制下面代码保存退出。

string name
uint8  age
uint8  sex

uint8 unknown = 0
uint8 male    = 1
uint8 female  = 2

---
string result

2.在package.xml中添加功能包依赖
运行命令打开package.xml文件

gedit ~/catkin_ws/src/learning_service/package.xml

加入下列代码保存退出。

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

在这里插入图片描述
3.在CMakeLists.txt添加编译选项
运行命令打开CMakeList.txt文件。

gedit ~/catkin_ws/src/learning_service/CMakeLists.txt 

首先在find_package函数中添加 message_generation依赖功能包
在这里插入图片描述
然后添加下面代码

add_service_files(FILES Person.srv)
generate_messages(DEPENDENCIES std_msgs)

如下图所示位置
在这里插入图片描述

最后在catkin_package函数中添加message_runtime依赖功能包
在这里插入图片描述
保存退出文件。
4.编译生成语言相关文件

cd ~/catkin_ws
catkin_make

可以在devel/include/learning_server文件夹下生成3个头文件。
在这里插入图片描述
二、用C++创建服务端与客户端代码
1.创建服务端代码
运行命令打开person_server.cpp文件

gedit ~/catkin_ws/src/learning_service/src/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;
}

2.创建客户端代码
运行命令打开person_client.cpp文件。

gedit ~/catkin_ws/src/learning_service/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;

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

3.配置代码编译规则
运行指令打开CMakeLists.txt文件。

gedit ~/catkin_ws/src/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)

在这里插入图片描述
保存退出文件。
三、用Python创建服务端和客户端代码
1.创建服务端代码
运行执行打开person_server.py文件

gedit ~/catkin_ws/src/learning_service/scripts/person_server.py

复制下面代码,保存退出文件

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

########################################################################
####          Copyright 2020 GuYueHome (www.guyuehome.com).          ###
########################################################################

# 该例程将执行/show_person服务,服务数据类型learning_service::Person

import rospy
from learning_service.srv import Person, PersonResponse

def personCallback(req):
	# 显示请求数据
    rospy.loginfo("Person: name:%s  age:%d  sex:%d", req.name, req.age, req.sex)

	# 反馈数据
    return PersonResponse("OK")

def person_server():
	# ROS节点初始化
    rospy.init_node('person_server')

	# 创建一个名为/show_person的server,注册回调函数personCallback
    s = rospy.Service('/show_person', Person, personCallback)

	# 循环等待回调函数
    print ("Ready to show person informtion.")
    rospy.spin()

if __name__ == "__main__":
    person_server()

设置person_server.py 文件运行权限

cd ~/catkin_ws/src/learning_service/scripts
chmod +x person_server.py 

2.创建客户端代码
运行执行打开person_client.py文件

gedit ~/catkin_ws/src/learning_service/scripts/person_client.py

复制下面代码,保存退出文件

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

########################################################################
####          Copyright 2020 GuYueHome (www.guyuehome.com).          ###
########################################################################

# 该例程将请求/show_person服务,服务数据类型learning_service::Person

import sys
import rospy
from learning_service.srv import Person, PersonRequest

def person_client():
	# ROS节点初始化
    rospy.init_node('person_client')

	# 发现/spawn服务后,创建一个服务客户端,连接名为/spawn的service
    rospy.wait_for_service('/show_person')
    try:
        person_client = rospy.ServiceProxy('/show_person', Person)

		# 请求服务调用,输入请求数据
        response = person_client("Tom", 20, PersonRequest.male)
        return response.result
    except rospy.ServiceException as e:
        print ("Service call failed: %s" %e)

if __name__ == "__main__":
	#服务调用并显示调用结果
    print ("Show person result : %s" %(person_client()))

设置person_client.py 文件运行权限

cd ~/catkin_ws/src/learning_service/scripts
chmod +x person_client.py 

四、编译功能包(Python不需要本步骤)
命令行输入

cd ~/catkin_ws/
catkin_make

五、运行程序
1.运行命令

roscore

2.打开新的命令窗,运行命令

rosrun learning_service person_server.py 

3.接着打开命令窗,运行命令

rosrun learning_service person_client.py

4.运行效果
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

15.服务数据的定义与使用 的相关文章

  • IBM小型机(AIX)技术手册(一)

    2007年7月 2008年7月在北京中软国际的工作时总结的IBM小型机技术手册 AIX基本命令 创建文件夹 Mkdir 名称 查看硬件信息 prtconf 查看卷组 lsvg o 查看进程 ps ef grep 名称 如 socket等 查
  • python模拟鼠标拖动滑块_Python+Selenium 拖动滑块 (一)

    在我们登录账号中常常会遇到各种验证码 如图片验证码 拖动滑块验证 滑块验证码只需要用户使用鼠标将滑块从某个位置拖动到另一个位置即可 程序通过记录用户拖动滑块的轨迹 这一串的轨迹数据采用模式识别的手段就可以判断出这是否是真人在操作 滑块验证通
  • 中标麒麟 docker安装及运行第一个实例

    一 下载安装包 选择适合版本 本次安装选择20 10 7 Index of linux static stable x86 64 二 安装 1 将下载的安装文件进行解压 命令如下 tar xzf docker 20 10 7 tar 2 将
  • 【Linux内核】cpu时间片的概念

    推荐阅读 浅谈linux 内核网络 sk buff 之克隆与复制 深入linux内核架构 进程 线程 了解Docker 依赖的linux内核技术 cpu时间片的概念 时间片即CPU分配给各个程序的时间 每个线程被分配一个时间段 称作它的时间
  • 【mcuclub】PTC加热模块

    一 实物图 名称 PTC加热片 工作电压 5V 最大温度 180 功率 7 12W 是否防水 不防水 外部加热 名称 加热棒 工作电压 5V 最大温度 110 功率 7 10W 是否防水 防水 可直接放入水中 二 简介 PTC电加热器是一种
  • Linux命令自动补齐oh-my-zsh插件及美化主题超详细

    安装zsh 1 查看系统当前使用的shell echo SHELL 2 查看系统是否安装了zsh cat etc shells 3 用yum安装zsh yum y install zsh 4 查看shell列表 cat etc shells
  • [附源码]计算机毕业设计Python游戏交易平台(程序+源码+LW文档)

    该项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 项目运行 环境配置 Pychram社区版 python3 7 7 Mysql5 7 HBuilderX list pip Navicat11 Django nodejs 项目技
  • C#中Socket的Accept()和BeginAccept()的区别

    C 中Socket的Accept 和BeginAccept 的区别 区别在于 Accept 是同步的 BeginAccept 是异步的 调用accept 或者BeginAccept 函数来接受客户端的连接 这就可以和客户端通信了 Begin
  • 五分钟学会一门编程语言?

    大家好 我是可乐 看到标题 不出意外的话 你肯定开始骂我了 标题党 什么编程语言五分钟就能学会 其实我本来也是不相信的 但是学过了才知道这是真的 1 Brainfuck 看到这个小标题 不要误会 我没有骂人 这就是今天文章的主人公 也就是让
  • 如何理解BIO、NIO、AIO的区别

    一 同步阻塞I O BIO 同步阻塞I O 服务器实现模式为一个连接一个线程 即客户端有连接请求时服务器就需要启动一个线程进行处理 如果这个连接不做任何事情会造成不必要的线程开销 可以通过线程池机制来改善 BIO方式适用于连接数目比较小且固
  • Leetcode 124. 二叉树中的最大路径和

    题目内容 给定一个非空二叉树 返回其最大路径和 本题中 路径被定义为一条从树中任意节点出发 沿父节点 子节点连接 达到任意节点的序列 该路径至少包含一个节点 且不一定经过根节点 示例 1 输入 1 2 3 1 2 3 输出 6 示例 2 输
  • 使用 js 实现 贷款计算器功能

    table tr th Enter Loan Data th td td th Loan Balance Interest Payments th tr tr td Amount of Loan td tr table
  • Java NIO介绍(二)————无堵塞io和Selector简单介绍

    无堵塞IO介绍 既然NIO相比于原来的IO在读取速度上其实并没有太大区别 因为NIO出来后 IO的低层已经以NIO为基础重新实现了 那么NIO的优点是什么呢 NIO是一种同步非阻塞的I O模型 也是I O多路复用的基础 而且已经被越来越多地
  • 【我的Java笔记】List集合中set()方法的使用

    方法 E set int index E element 首先看一下API里对List集合中的set 方法的描述 例 使用List集合中的set 方法进行冒泡排序 import java util ArrayList public clas
  • WebDriverException unexpectedly exited. Status code was: 2

    raise WebDriverException selenium common exceptions WebDriverException Message Service D Projects test geckodriver exe u
  • 计数器实现七分频

    七分频 即将输入信号的频率变为原来的七分之一 本文用计数器实现输入信号的七分频 一 画出七分频的时序逻辑 实现原理 图中用到了两个计数器 一个上升沿触发一个下降沿触发 且每当计数器从0计数到6时 复位 中间信号sig1 sig2分别在cnt

随机推荐

  • xhtml2pdf如何支持中文

    这段时间在做一个图片PDF的项目 需要把网页转换成PDF 找到了python的xhtml2pdf这个库 个方面都满意 只是对中文的支持不好 html上的中文转换成PDF后都成了乱码 貌似中文网站都没有找到合适的解决办法 只能求助于万能的go
  • 传统语音增强——基本的维纳滤波语音降噪算法

    一 维纳滤波的基本原理 基本维纳滤波就是用来解决从噪声中提取信号问题的一种过滤 或滤波 方法 它基于平稳随机过程模型 且假设退化模型为线性空间不变系统的 实际上这种线性滤波问题 可以看成是一种估计问题或一种线性估计问题 基本的维纳滤波是根据
  • error LNK2001: 无法解析的外部符号 “void __cdecl cv::cvtColor

    c 调用opencv时报错了 error LNK2001 无法解析的外部符号 void cdecl cv cvtColor 现在发现有两个可能的原因 原因1 没有添加lib库 需要添加lib库 VC 目录 包含目录 VC 目录 库目录 链接
  • 网络安全入门学习练手——CS伪装钓鱼网站

    文章目录 一 实验环境 二 使用工具和目标 三 开始复现 1 启动Cobalt Strike服务器端 打开Cobalt Strike客户端 2 设置监听器 3 网站克隆 4 在受害者端输入克隆网站对应的ip 5 测试 四 拓展 让钓鱼网址挂
  • 记录一次mac电脑安装git并在idea中使用的问题

    一 安装Git 下载地址 https sourceforge net projects git osx installer 点击下载最新版就可以了 下载速度很快的 下载完直接打开 默认安装即可 安装完成直接在命令行用root用户执行 git
  • L1-020 帅到没朋友(java)

    1 题目详情 当芸芸众生忙着在朋友圈中发照片的时候 总有一些人因为太帅而没有朋友 本题就要求你找出那些帅到没有朋友的人 输入格式 输入第一行给出一个正整数N 100 是已知朋友圈的个数 随后N行 每行首先给出一个正整数K 1000 为朋友圈
  • gcc make makefile 的基本介绍

    一 gcc 1 在window操作系统下 编译工具用集成开发环境 在Linux操作系统下没有很好的集成环境 用的编译器是gcc 2 程序的编译分为四个阶段 由 c到可执行程序 1 预编译 2 编译 3 汇编 4 链接 3 编译程序 1 一步
  • PTAMM阅读笔记之SLAM概述(五)

    1 同时定位与地图创建允许机器人在未知环境中 依靠自身所带的传感器递增式地创建环境地图 并同时给出机器人所在位置 2 移动机器人的定位有两种类型 全局定位 绝对定位 Global Absolute Localization 和位置跟踪 Po
  • Mybatis3快速上手(详细)

    因为编辑器不互通 所以可以直接打开有道云看 有道云链接 Mybatis的初入 创建Maven项目工程 因为Mybatis属于数据访问层的操作 我们需要引入相关依赖 mysql mysql connector java 8 0 29 org
  • HashMap实现原理及扩容机制详解

    文章目录 一 HashMap基础 二 红黑树基础 三 HashMap实现原理 1 Node和Node链 2 拉链法 3 关于Node数组 table 4 散列算法 5 HashMap和红黑树 6 关于TreeNode 转自 这篇更详细 ht
  • UNext:基于 MLP 的快速医学图像分割网络

    UNext 会议分析 摘要 贡献 方法 整体框架 1 Shifted MLP 2 Tokenized MLP Stage 实验 1 对比实验 2 消融实验 2 1 模块的消融实验 2 2 通道数的探索 可借鉴参考 会议分析 期刊 会议 名
  • 前端常见难点面试题

    1 跨域 同源策略 同源策略 同源策略是浏览器的一个安全功能 不同源的客户端脚本在没有明确授权的情况下 不能读写对方资源 同源 就是协议 域名和端口号相同 降域 document domain 同源策略认为域和子域属于不同的域 如 chil
  • 《代码走查》杂记

    代码走查 一 定义 1 代码走查 code walkthrough 是一个开发人员与架构师集中与讨论代码的过程 代码走查的目的交换有关代码是如何书写的思路 并建立一个对代码的标准集体阐述 在代码走查的过程中 开发人员都应该有机会向其他人来阐
  • OpenGL: 视图矩阵的推导

    OpenGL 视图矩阵的推导 2014年03月04日 11 08 45 阅读数 6525 把物体从世界坐标系转化到视点坐标系的矩阵称为视图矩阵 下面我们先看下opengl视图矩阵的推导过程 假设视点或camera的局部坐标系为UVN UVN
  • webpack中的代码分离

    Tip 本指南继续沿用 起步 中的示例代码 请确保你已熟悉这些指南中提供的示例以及输出管理章节 代码分离是 webpack 中最引人注目的特性之一 此特性能够把代码分离到不同的 bundle 中 然后可以按需加载或并行加载这些文件 代码分离
  • Python 九九乘法表的7种实现方式

    Python 九九乘法表的7种实现方式 九九乘法表是初学者学习编程的必要练手题目之一 因此各种语言都有对应的实现方式 而 Python 也不例外 在 Python 中 我们可以使用多种方式来生成一个简单的九九乘法表 实现方式一 双重循环 f
  • 远程debug java_远程Debug Java进程的方法

    远程debug的意思是启动一个Java进程 启动一个debugger进程 将两者连接起来 利用debugger来debug Java进程 事实上目前所有的IDE的debug功能都是通过远程debug方式来实现的 它们都利用了一个叫做JDPA
  • 【行人重识别】Unsupervised Salience Learning for Person Re-identification

    Abstract 人眼可以基于 一些较小的显着区域来识别人的身份 然而 当使用现有方法计算图像的相似度时 通常会隐藏这种有价值的显着信息 此外 许多现有的方法学习区别性特征并以监督的方式处理急剧的视点变化 并要求为不同的摄像机视图对标注新的
  • QSqlQueryModle使用过滤器来完成数据库数据筛选

    原型 void QSqlTableModel setFilter const QString filter 注意 如果模型已从数据库中填充数据 则模型将其与新滤波器重新选择 否则 将在调用下一次select 中应用过滤器 model的sel
  • 15.服务数据的定义与使用

    学习视频 https www bilibili com video BV1zt411G7Vn p 15 目标 服务数据的自定义 客户端发布显示个人信息的请求 服务端处理请求及反馈应答 一 自定义服务数据 1 定义srv文件 mkdir ca