ROS第 10 课 服务数据的自定义与使用

news2024/9/24 7:25:06

文章目录

  • 第 10 课 服务数据的自定义与使用
    • 1.自定义服务数据
    • 2.服务数据的使用
      • 2.1 创建服务器和客户端代码
      • 2.2 运行服务器和客户端节点

第 10 课 服务数据的自定义与使用

1.自定义服务数据


注意:在自定义服务数据之前,需要先创建工作空间和功能包,具体操作过程可前往目录“第4课 创建工作空间与功能包”查看文档。


自定义服务数据的具体操作步骤如下:

  1. 打开命令行终端。
  2. 输入进入功能包所在目录的指令“roscd beginner_hiwonder”,并按下回车。
    在这里插入图片描述

注意:若出现提示“No such package/stack ‘beginner_hiwonder’”,即功能包不存在于环境变量 ROS_PACKAGE_PATH 中,具体解决方法可前往目录“第 4 课 创建工作空间与功能包”查看文档,解决此问题后,请重复一次当前步骤的操作。


  1. 输入指令“mkdir srv”,并按下回车,新建用于存放文本文件的文件夹“srv”。
    在这里插入图片描述
  2. 输入指令“vi Person.srv”编辑程序,复制下面程序。如需修改,再按下“i”即可修改。修改完成,按下“Esc”,输入“:wq”保存并退出。
    在这里插入图片描述
string name
int8 age
int8 sex

int8 unknown = 0
int8 male = 1
int8 female = 2


---
string result

在这里插入图片描述
5) 输入“cd ~/catkin_ws/src/beginner_hiwonder/”,按下回车。
在这里插入图片描述
6) 输入“vi package.xml”,复制下面程序,在下图所示位置添加功能包依赖。如需修改,再按下“i”即可修改。修改完成,按下“Esc”,输入“:wq”保存并退出。
在这里插入图片描述

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

在这里插入图片描述
7) 输入“vi CMakeLists.txt”,再按下“i”,修改“CMakeLists.txt”文件。
在这里插入图片描述
8) 在下图所示位置添加所需的编译选项“message_generation”。
在这里插入图片描述
9) 找到下图所示代码,将红框部分进行反注释,并添加所需的编译选项“Person.srv”。
在这里插入图片描述
10) 找到下图所示代码,将红框部分进行反注释,确保所需的编译选项生效。
在这里插入图片描述
11) 找 到 下 图 所 示 代 码 , 将 红 框 部 分 进 行 反 注 释 , 并 添 加 所 需 的 编 译 选 项“message_runtime”。
在这里插入图片描述
12) 修改完成,按下“Esc”,输入“:wq”保存并退出。
在这里插入图片描述
13) 输入指令“rossrv show beginner_hiwonder/Person”,并按下回车,查看写入的消息字段能否被系统识别。当出现下图红框所示字样,即代表识别成功。
在这里插入图片描述

2.服务数据的使用

2.1 创建服务器和客户端代码

  1. 打开Linux命令行终端。
  2. 输入指令“cd catkin_ws/src/beginner_hiwonder/scripts/”,并按下回车,进入用于存放Python脚本的文件夹“scripts”。
    在这里插入图片描述
  3. 输入指令“vi person_server.py”编辑程序,复制下面程序。如需修改,再按下“i”即可修改。修改完成,按下“Esc”,输入“:wq”保存并退出。
    在这里插入图片描述
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 该脚本定义了一个ROS服务,用于展示个人信息
# 服务数据类型为 beginner_hiwonder::Person,这是一个自定义的服务类型

# 导入rospy,这是一个Python库,用于ROS节点的编写
import rospy
# 从beginner_hiwonder.srv包导入Person服务定义(这是自定义服务类型)及其响应PersonResponse
from beginner_hiwonder.srv import Person, PersonResponse

# 定义服务请求的处理函数,该函数将在客户端请求服务时被调用
def personCallback(req):
    # 打印请求数据,包括名字、年龄和性别
    rospy.loginfo("Person: name:%s age:%d sex:%d", req.name, req.age, req.sex)
    # 服务响应,返回字符串"OK",表示成功接收到请求
    return PersonResponse("OK")

# 定义服务节点的主函数
def person_server():
    # 初始化一个名为'person_server'的ROS节点
    rospy.init_node('person_server')
    # 创建一个服务'/show_person',服务类型为Person,指定服务请求时的回调函数为personCallback
    s = rospy.Service('/show_person', Person, personCallback)
    # 打印消息,指示已准备好接收服务请求
    print "Ready to show person information."
    # 进入循环,等待服务请求并调用回调函数处理
    rospy.spin()

# Python的标准模板,当该脚本被执行时,以下代码块将运行
if __name__ == "__main__":
    # 调用服务节点的主函数
    person_server()

在这里插入图片描述
4) 输入指令“vi person_client.py”编辑程序,复制下面程序。如需修改,再按下“i”即可修改。修改完成,按下“Esc”,输入“:wq”保存并退出。
在这里插入图片描述

#!/usr/bin/env python
# -*- coding: utf-8 -*- 
# 该脚本作为ROS服务客户端,请求/show_person服务,该服务的数据类型为beginner_hiwonder::Person

# 导入sys模块,它提供了一系列有关Python运行环境的变量和函数
import sys
# 导入rospy,用于ROS节点的编程
import rospy
# 从beginner_hiwonder.srv包导入Person服务和PersonRequest消息类型
from beginner_hiwonder.srv import Person, PersonRequest


# 定义服务客户端函数
def person_client():
    # 初始化ROS节点,命名为'person_client'
    rospy.init_node('person_client')
    # 阻塞直到发现名为'/show_person'的服务
    rospy.wait_for_service('/show_person')
    try:
        # 创建服务客户端,连接到'/show_person'服务,服务类型为Person
        person_client = rospy.ServiceProxy('/show_person', Person)
        # 使用PersonRequest的常量male表示性别,向服务发送请求
        # 发送的请求数据是名字"Tom",年龄20,性别male(使用PersonRequest的male常量)
        response = person_client("Tom", 20, PersonRequest.male)
        # 返回响应结果
        return response.result
    except rospy.ServiceException, e:
        # 如果服务调用失败,打印错误信息
        print "Service call failed: %s" % e


# 当该脚本被作为主程序运行时,而不是作为模块导入时
if __name__ == "__main__":
    # 调用服务并打印结果
    print "Show person result : %s" % (person_client())

在这里插入图片描述
5) 输入指令“chmod +x person_server.py”和“chmod +x person_client.py”,并按下回车,赋予文件可执行权限
在这里插入图片描述
在这里插入图片描述

2.2 运行服务器和客户端节点

  1. 输入指令“cd ~/catkin_ws”,并按下回车,进入catkin工作空间。
    在这里插入图片描述
  2. 输入指令“catkin_make”,并按下回车,构建目录中所有的功能包。
    在这里插入图片描述
  3. 输入指令“source ./devel/setup.bash”,并按下回车,刷新工作空间的环境。
    在这里插入图片描述
  4. 输入指令“roscore”,并按下回车,启动节点管理器。
    在这里插入图片描述
    若已开启,则会出现以下提示:
    在这里插入图片描述
  5. 输入指令“rosrun beginner_hiwonder person_server.py”,并按下回车,运行服务器节点。如需停止节点的运行,可按下快捷键“Ctrl+C”。
    在这里插入图片描述
  6. 打开一个新的命令行终端,输入指令“rosrun beginner_hiwonder person_client.py”,并按下回车,运行客户端节点。
    在这里插入图片描述
  7. 运行客户端节点后,启动服务器节点的终端窗口会打印下图红框所示内容。
    在这里插入图片描述

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

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

相关文章

【Linux第二课-权限】操作系统、Linux用户、Linux权限、Linux文件类型、粘滞位

目录 操作系统shell外壳为什么有shell外壳shell外壳是什么shell外壳工作原理 Linux用户root用户与非root用户root用户与普通用户的切换普通用户 --> root用户root用户 --> 普通用户普通用户 --> 普通用户对一条指令提升为root权限进行执行 Linux权限Linux中的权限角色…

STM32(--001) Win10、Win11 上的驱动安装说明

一、USB线插到 CMSIS-DAP 接口上&#xff0c;将自动识别到两个设备 ① CMSIS-DAP&#xff1a;用于烧录代码、在线硬件仿真; 在Keil里烧录&#xff0c;无需通过FlyMCU; ② USB转TTL&#xff1a;用于开发板与电脑间串口通信 &#xff0c;即USART1, TX-PA9、RX-PA10; 接口备注&a…

Java 流程控制 - 分支、循环

顺序控制 程序从上到下逐行执行&#xff0c;中间没有任何判断和跳转。 public class Test{//正确形式int a 1;int b a;// 错误形式int c d 1;int d 2; }块作用域 块&#xff08;即复合语句&#xff09;是指由一对大括号括起来的若干条简单的 Java 语句。块确定了变量的…

JVM性能调优-垃圾收集器G1详解

目录 G1收集器(-XX:UseG1GC) G1垃圾收集分类 YoungGC MixedGC Full GC G1收集器参数设置 G1垃圾收集器优化建议 什么场景适合使用G1 G1收集器(-XX:UseG1GC) G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足…

redis未授权访问全漏洞复现

redis未授权访问全漏洞复现 Redis 有关的漏洞具有明显的时间分段性&#xff0c;在15年11月之前&#xff0c;主要是未授权导致的数据泄露&#xff0c;获得一些账号密码。另外还可以 DoS&#xff08;参考&#xff1a;Sangfor VMP redis unauthorized access vulnerability&#…

UI开发布局-HarmonyOS应用UI开发布局

UI页面的构建不用再像Android开发过程中在.xml文件中书写&#xff0c;可直接在页面上使用声明式UI的方式按照布局进行排列&#xff0c;构建应用的页面。 如下代码使用Row、Column构建一个页面布局&#xff0c;在页面布局中添加组件Text、Button&#xff0c;共同构成页面&#…

Git学习笔记(第5章):Git团队协作机制

目录 5.1 团队内协作 5.2 跨团队协作 Git进行版本控制都是在本地库操作的。若想使用Git进行团队协作&#xff0c;就必须借助代码托管中心。 5.1 团队内协作 问题引入&#xff1a;成员1&#xff08;大佬&#xff09;利用Git在宿主机上初始化本地库&#xff0c;完成代码的整体…

016-Vue-黑马2023:前后端分离开发(在线接口文档),前端工程化、Element、vue编写一个完成页面、Vue路由、vue打包部署到nginx

第三节 前后端分离开发 1、介绍 开发模式 前后端混合开发&#xff1a;传统开发模式 前后端分离开发&#xff1a;当前最为主流的开发模式 页面原型需求案例&#xff1a;分析出接口文档 离线开发文档示例&#xff1a; 2、YAPI&#xff08;官网已停用&#xff09; 202…

服务注册流程解析

本文主要介绍服务注册的基本流程 起手式 接上面的继续说&#xff0c;服务注册是一门至高无上的武学&#xff0c;招式千变万化 &#xff0c;九曲十八弯打得你找不到北。可正所谓这顺藤摸瓜&#xff0c;瓜不好找&#xff0c;可是这藤长得地方特别显眼。那么今天&#xff0c;就让…

【极问系列】springBoot集成elasticsearch出现Unable to parse response body for Response

【极问系列】 springBoot集成elasticsearch出现Unable to parse response body for Response 如何解决&#xff1f; 一.问题 #springboot集成elasticsearch组件,进行增删改操作的时候报异常Unable to parse response body for Response{requestLineDELETE /aurora-20240120/…

HarmonyOS4.0系列——07、自定义组件的生命周期、路由以及路由传参

自定义组件的生命周期 允许在生命周期函数中使用 Promise 和异步回调函数&#xff0c;比如网络资源获取&#xff0c;定时器设置等&#xff1b; 页面生命周期 即被Entry 装饰的组件生命周期&#xff0c;提供以下生命周期接口&#xff1a; onPageShow 页面加载时触发&#xff…

UE5 C++ 学习笔记 UBT UHT 和 一些头文件

总结一些似懂非懂的知识点&#xff0c;从头慢慢梳理。 任何一个项目都有创建这些三个.cs。 这个是蓝图转C 这个是本身就是C项目,应该就是多了一个GameModeBase类 Build.cs包含了每个模块的信息&#xff0c;表明了这个项目用到了哪一些模块。该文件里的using UnrealBuilTool 是…

路由器结构

路由器是连接互联网的设备&#xff0c;本文主要描述路由器的结构组成。 如上所示&#xff0c;OSI&#xff08;Open System Interconnect&#xff09;开放系统互联参考模型是互联网架构的标准协议栈&#xff0c;由ISO标准组织制定。自底向上&#xff0c;互联网架构分为7层&#…

Gitee作为远程仓库保存Vue项目

1.先在gitee上创建仓库 2.本地创建vue项目 3. 将本地项目与远程仓库进行关联 依次执行以下命令 # 进入到项目所在目录 cd vue-rabbit # 将项目变成git项目, 运行命令会在该目录下生成 .git文件 git init# 本地仓库与远程仓库进行关联 git remote add origin 你项目的远程地址…

vue+springboot(前后端分离项目)

目录 JAVA后端项目 一、创建项目 1、使用aliyun的server url 2、初始化项目结构 3、添加依赖 4、创建文件夹 5、把mapper类交给spring容器管理 5.1、方法1 5.2、方法2 6、在yaml文件中配置数据库信息 7、在yaml文件中配置mapper的xml文件的路径 8、配置mapper的xml文…

Django开发_13_静态资源、cookie/session/token

一、在html文件下的操作 &#xff08;一&#xff09;在html中添加{% load static %}标签&#xff0c;加载static模块 &#xff08;二&#xff09;使用{%static "图片地址" %}动态生成静态资源URL 二、csrf跨站请求伪造 在账号登录的html文件中相应位置要加上{% csr…

转转交易猫自带客服多模板全开源完整定制版源码

商品发布&#xff1b; 请在后台商品添加成功后&#xff0c; 再点击该商品管理&#xff0c;可重新编辑当前商品的所有信息及配图以及支付等等相关信息 可点击分享或者跳转&#xff0c;将链接地址进行发布分享 请在手机端打开访问 访问商品主要模板文件路径目录 咸鱼&#…

K8S-YAML

一、Kubernetes对象的描述 kubernetes中资源可以使用YAML描述&#xff08;如果您对YAML格式不了解&#xff0c;可以参考YAML语法&#xff09;&#xff0c;也可以使用JSON。其内容可以分为如下四个部分&#xff1a; typeMeta&#xff1a;对象类型的元信息&#xff0c;声明对象…

软件是什么?前端,后端,数据库

软件是什么&#xff1f; 由于很多东西没有实际接触&#xff0c;很难理解&#xff0c;对于软件的定义也是各种各样。但是我还是不理解&#xff0c;软件开发中的前端&#xff0c;后端&#xff0c;数据库到底有什么关系呢&#xff01; 这个问题足足困扰了三年半&#xff0c;练习时…

创建SERVLET

创建SERVLET 要创建servlet,需要执行以下任务: 编写servlet。编译并封装servlet。将servlet部署为Java EE应用程序。通过浏览器访问servlet。编写servlet 要编写servlet,需要扩展HttpServlet接口的类。编写servlet是,需要合并读取客户机请求和返回响应的功能。 读取和处…