ROS系统中Service 通讯的原理及实现

news/2024/10/16 19:19:15/

本文我们将会了解 Service 通讯原理和机制,通过编写 Server 端和 Client 端实现 Service 通讯,并通过命令行工具或者图形化工具进行调试。最后再介绍几个常用的 rosservice 命令。

Service 通讯架构

ROS 还提供了节点与节点间通讯的另外一种方式:Service 通讯。

Service 通讯分为 client 端和 server 端。

  • client 端负责发送请求(Request)给 server 端。
  • server 端负责接收 client 端发送的请求数据。
  • server 端收到数据后,根据请求数据和当前的业务需求产生数据,将数据(Response)返回给 client 端。

Service 通讯特点:

  • 同步数据访问。
  • 具有响应反馈机制。
  • 一个 server 处理多个 client 的请求。
  • 注重业务逻辑处理。

Service 通讯的关键点:

  • service 的地址名称。
  • client 端访问 server 端的数据格式。
  • server 端响应 client 端的数据格式。

Server 创建流程 

构建一个 Service 通讯,需要的是一个 client 端和一个 server 端。server 端为 client 端提供服务,帮助 client 端进行加法的求和计算。

首先初始化一个工作空间:

mkdir -p /home/shiyanlou/ws/src
cd /home/shiyanlou/ws
# 对工作空间进行编译
catkin_make

进入 ws/src 目录下,执行如下命令创建名为 demopy 的 Package 以及包下面的 scripts 文件夹:

cd /home/shiyanlou/ws/src
catkin_create_pkg demopy roscpp rospy rosmsg
mkdir /home/shiyanlou/ws/src/demopy/scripts

在 demopy/scripts 目录新建一个 server_node.py 文件,并赋予该文件可执行权限:

chmod +x /home/shiyanlou/ws/src/demopy/scripts/server_node.py

  1. 创建节点。
rospy.init_node(nodeName)

  1. 创建 server。
rospy.Service(serviceName, AddTwoInts, callback)

  • serviceName 参数为服务名称,是一个 uri 地址。
  • AddTwoInts 参数是服务需要的数据类型,这里使用的是 ros 提供的数据类型。
  • callback 参数为服务请求的回调。
  1. 处理请求的逻辑。

回调函数的参数是请求过来的数据,返回值是响应的数据。

def callback(request):if not isinstance(request, AddTwoIntsRequest):return# 获取请求数据a = request.ab = request.b# 返回响应结果response = AddTwoIntsResponse()response.sum = a + breturn response

  1. 完整示例代码。
#! /usr/bin/env python
# coding:utf-8
"""
client: 10 20
server: 10 + 20
"""import rospy
from rospy_tutorials.srv import AddTwoInts, AddTwoIntsRequest, AddTwoIntsResponsedef callback(request):if not isinstance(request, AddTwoIntsRequest): return# 获取请求数据a = request.ab = request.b# 业务逻辑处理,返回响应结果c = a + bresponse = AddTwoIntsResponse()response.sum = creturn responseif __name__ == '__main__':# 创建节点rospy.init_node('server_node')# service 通讯的服务端 server# 服务端 server# 服务地址 /a/b/c/dservice_name = '/shiyan/my_server'server = rospy.Service(service_name, AddTwoInts, callback)rospy.spin()

调试 Server

调试 server 端主要就是查看 server 端是否能正常接收到请求,并根据请求数据处理对应的业务逻辑,然后再返回处理好的结果到客户端。运行刚才编写的 server 端,只需要再模拟一个 client 端发送请求,就可以进行调试了。

# 新开一个终端,启动 ROS Master
roscore
# 切换到工作空间目录下
cd /home/shiyanlou/ws
# 使用 catkin_make 编译项目
catkin_make
# source 开发环境
source devel/setup.zsh
# 运行编译
rosrun demopy server_node.py

ROS 提供了命令行工具和图形化工具供我们调试开发。

  1. rosservice 命令行调试。

通过 rosservice list 命令可以查询出当前运行的所有 service。查询的结果中,可以看到我们定义的服务名称 /shiyan/my_server

然后去调用此服务,会返回相加后的数据。

source devel/setup.zsh
# 注意这个命令的输入需要技巧,先输入 rosservice call /shiyan/my_server,然后按 tab 键它会自动补全,最后再修改 a 和 b 的值
rosservice call /shiyan/my_server "a: 30 b: 3"

  1. rqt_service_caller 工具调试。
rosrun rqt_service_caller rqt_service_caller

打开调试工具,找到自定义的服务名称 /shiyan/my_server,在下面的 Request 区域中,填写 a 和 b 的值,然后点击 Call,计算的结果会显示在 Response 区域中。

Client 创建流程

在 demopy/scripts 目录新建一个 client_node.py 文件,并赋予该文件可执行权限:

chmod +x /home/shiyanlou/ws/src/demopy/scripts/client_node.py

  1. 创建节点。
rospy.init_node(nodeName)

  1. 调用 Service。
# 等待服务器连接
rospy.wait_for_service(serviceName)
# 第一个参数:服务名。第二个参数:数据类型。
call = rospy.ServiceProxy(serviceName, TwoInts)
# 调用服务
result = call(request)

  1. 完整示例代码。
#!/usr/bin/env python
# coding:utf-8
import rospy
from rospy_tutorials.srv import AddTwoInts, AddTwoIntsRequest, AddTwoIntsResponseif __name__ == '__main__':# 创建节点rospy.init_node('client_node')# 服务名称地址service_name = '/shiyan/my_server'client = rospy.ServiceProxy(service_name, AddTwoInts)# 确保 server 是存在的,等待服务开启, 阻塞代码rospy.wait_for_service(service_name)# 给 server 发请求request = AddTwoIntsRequest()request.a = 16request.b = 8response = client.call(request)if isinstance(response, AddTwoIntsResponse):print response.sumrospy.spin()

  1. 调试 Client 端。

开启 Server 端,执行 Client 端,返回计算之后的和。

# 切换到工作空间目录下
cd /home/shiyanlou/ws
# 使用 catkin_make 编译项目
catkin_make
# source 开发环境
source devel/setup.zsh
# 运行编译 Server 端,如果前面的命令中已经执行过了,这里就不需要重复执行
rosrun demopy server_node.py
# 运行编译 Client 端
rosrun demopy client_node.py

rosservice 命令

  • 查询所有的 Service,上面已经使用过。
rosservice list

  • 查询 service 详情。
rosservice info /shiyan/my_server

  • Node:当前 server 所在的 Node 节点。

  • URi:显示 ROSRPC uri 服务。

  • Type:传输的数据类型。

  • Args:请求参数。

  • 查询 service 传输的数据类型。

rosservice type /shiyan/my_server

  • 模拟 client 端调用服务,上面已经使用过。
# 注意这个命令的输入需要技巧,先输入 rosservice call /shiyan/my_server,然后按 tab 键它会自动补全,最后再修改 a 和 b 的值
rosservice call /shiyan/my_server "a:30 b:3"

  • 查询 service 请求参数。
rosservice args /shiyan/my_server

到此,我们通过编写 Server 端和 Client 端实现计算求和的例子,知道了 Service 的一些常用 API,了解了它们之间是如何通讯的,并通过 ros 提供的工具进行调试验证代码是否正确。 


http://www.ppmy.cn/news/829227.html

相关文章

什么是RTOS?

1、RTOS(Real-Time Operating System) RTOS是指实时操作系统。 特性:实时性——及时响应和高可靠性 特点:包含一个实时任务调度器(严格按照优先级分配CPU时间片) RTOS会在外界事件或者数据产生,需要用足够快的时间…

ROS与ROSAPP(Android应用)

安卓APP控制ROS 1、APP下载链接:(非常感谢小白学移动机器人博主) https://pan.baidu.com/s/1_5iqJjC80RD1zfYmCffW5g 提取码:08wy 2、在调试过程中也遇到比较多的棘手的问题:网络连接异常,,map…

SLO、SLI、SLA是什么?【AIOps智能运维的方向会是SLO吗】

1. SLO、SLI、SLA名词解释以及关系 2. Why SLO? SLO的目的 SLO 量化客户对可靠性的期望,找到客户对服务的可靠性感到满意的点(额外的可靠性价值微乎其微,此时新功能更加重要) SLO的好处、优势 对客户 服务质量可预…

ROS2在Windows操作系统下的应用

ROS2在Windows操作系统下的应用 概述一、windows10操作系统下安装ROS2二、ROS2命令行操作三、ROS2开发环境配置四、工作空间与功能包五、节点—系统的最小单位六、话题—节点间传递数据的通道七、服务—节点间的通道应答八、通信接口—传递数据的标准结构九、动作—完整行为的流…

什么是ROS2GO随身系统?

随着ROS(Robot Operating System)机器人操作系统的越来越热,大家都跃跃欲试。想一睹ROS的风采,感受ROS的魅力。但是挡在初学者面前的第一个难题就是如何在Ubuntu系统或其他系统上安装ROS。好多初学者经常给我发消息说安装ROS时出现…

ROS机器人操作系统——什么是ROS(一)

ROS机器人操作系统 文章目录 ROS机器人操作系统前言一、ROS是什么?二、ROS的发展史三、ROS的特点总结 前言 大一下的时候接触过ROS,也只是单纯的知道这个东西,了解了一点皮毛,并没有系统的去学习。一年过去了,无人驾驶…

OSAL系统简介

看一段程序的时候,往往要从它的数据结构入手。 main()函数中主循环存在两个关键数组,*tasksEvents与*tasksArr, tasksEvents这个数组存放的是从序号为0到tasksCnt,每个任务在本次循环中是否要被运行,需要运行的任务其…

机器人操作系统(ROS)

机器人操作系统(Robot Operating System,ROS)是一款广泛应用于机器人领域的开源操作系统。它最初由斯坦福大学人工智能实验室(Stanford AI Lab)开发,旨在为机器人软件开发提供一个通用的框架和平台。ROS提供…