ROS学习笔记(六)---服务通信机制

这篇具有很好参考价值的文章主要介绍了ROS学习笔记(六)---服务通信机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 服务通信是什么

在ROS中,服务通信机制是一种点对点的通信方式,用于节点之间的请求和响应。它允许一个节点(服务请求方)向另一个节点(服务提供方)发送请求,并等待响应。

服务通信机制在ROS中使用以下两个概念:

服务(Service):服务是一种在ROS中定义的一对相关消息类型,包括请求消息和响应消息。请求消息用于向服务提供方发送请求,而响应消息用于服务提供方返回响应给请求方。

服务节点(Service Node):服务节点是一个ROS节点,它提供了一个或多个服务。服务节点注册自己提供的服务,并等待来自其他节点的请求。一旦接收到请求,服务节点执行相应的操作,并将响应发送回请求方。

下面是服务通信的基本流程:

  • 服务定义
    首先,需要在ROS中定义一个服务,包括请求消息和响应消息的格式。这可以使用ROS的消息描述语言(如.srv文件)来完成。

  • 服务节点注册
    服务提供方节点将自己注册为一个服务节点,并指定所提供的服务类型。

  • 请求发送
    服务请求方节点创建一个请求消息实例,并将其发送到服务提供方节点。

  • 请求处理
    服务提供方节点接收到请求消息后,执行相应的操作,可能包括计算、处理数据等。

  • 响应发送
    服务提供方节点生成一个响应消息,并将其发送回请求方节点。

  • 响应接收
    请求方节点接收到响应消息后,可以根据需要进行后续处理。

下面以打车的案例简单描述ROS中服务通信机制的场景:
(1)Master(管理者):Master是滴滴打车平台的中央控制器,负责协调和管理打车服务请求。在这个案例中,滴滴打车的后台系统可以充当Master的角色。它接收乘客的打车请求,处理请求并将其分派给合适的司机。

(2)Server(司机):Server指的是滴滴打车平台上的司机角色。他们是提供车辆和打车服务的实际执行者。当Master将乘客的打车请求分派给司机时,司机将接收到请求并决定是否接受该请求。

(3)Client(乘客):Client是需要使用滴滴打车服务的乘客。在这个案例中,乘客作为Client,他们使用滴滴打车应用程序来请求打车服务。乘客通过应用程序选择目的地、车型等选项,并发起打车请求。
ROS学习笔记(六)---服务通信机制,ROS学习,python,学习,笔记,机器人

上图参考了赵虚左老师的课程

2. 服务通信有什么用

以下是一些常见的ROS服务通信应用举例:

(1)传感器数据请求:在一个机器人系统中,可以使用服务通信来请求特定传感器(如摄像头、激光雷达)的数据。例如,一个节点可以向摄像头节点发送请求,要求获取当前的图像数据。

(2)控制指令发送:通过服务通信,可以向执行器节点发送控制指令,控制机器人的运动或执行特定任务。例如,一个导航节点可以向底盘控制节点发送请求,要求机器人移动到特定位置。

(3)参数配置和调整:服务通信可用于动态地配置和调整节点的参数。例如,在机器人系统中,可以使用服务通信来请求更改底盘控制节点的运动速度或其他参数,以适应不同的任务需求。

(4)数据处理和计算:通过服务通信,可以请求进行特定的数据处理或计算操作。例如,一个节点可以向图像处理节点发送请求,要求对图像进行特定的算法处理,如目标识别或图像滤波。

(5)任务协作和分布式计算:在多机器人系统中,可以使用服务通信来实现任务的协作和分布式计算。不同机器人节点可以通过服务通信交换任务信息、共享计算结果,并相互协作完成复杂的任务。

3.编写服务通信(客户端-服务端)的python案例

(1)任务要求

实现简单的整数加法运算。客户端提交两个数据至服务端,服务端相应之后将求和结果发送至客户端。

(2)流程

① 编写服务消息文件srv文件。(注意:与话题通信的不同,为了实现服务通信,需要定义服务消息类型,服务消息文件(.srv)描述了请求和响应的消息格式。服务服务器根据服务消息文件生成服务接口,服务客户端使用该接口与服务服务器进行通信。因此在编写客户端和服务端的python程序之前,我们需要先编写好服务消息文件。)
② 编写客户端和服务端的python程序。

(3)编程实现流程

① 创建功能包(默认继续在之前ROS学习笔记(二)上新建功能包server_client,然后新建一个scripts文件夹,用来编写python的服务通信程序,再新建一个srv文件,新建好之后如下图。
② 定义srv文件

  • 按照固定格式创建srv文件

在srv文件夹下新建文件AddTwoInts.srv。也就是我们的服务消息srv文件)
ROS学习笔记(六)---服务通信机制,ROS学习,python,学习,笔记,机器人

编辑文件的内容如下。

# AddTwoInts.srv
int64 a
int64 b
---
int64 sum
  • 编辑配置文件
    1)在package.xml中添加编译依赖与执行依赖
<build_depend>message_generation</build_depend>

<exec_depend>message_runtime</exec_depend>

ROS学习笔记(六)---服务通信机制,ROS学习,python,学习,笔记,机器人
2)在CMakeLists.txt编辑 srv 相关配置
第一处:

message_generation

ROS学习笔记(六)---服务通信机制,ROS学习,python,学习,笔记,机器人
第二处:要改成你srv文件名

AddTwoInts.srv

ROS学习笔记(六)---服务通信机制,ROS学习,python,学习,笔记,机器人
第三处:

generate_messages(
  DEPENDENCIES
  std_msgs
)

ROS学习笔记(六)---服务通信机制,ROS学习,python,学习,笔记,机器人

  • 编译之后生成中间文件(编译 crtl + shift +b)
    ROS学习笔记(六)---服务通信机制,ROS学习,python,学习,笔记,机器人
    这样就完成服务消息srv的创建了。接下来来时编写服务通信的程序

(4)编写服务端和客户端的程序

① 我们在创建好的script文件内,继续创建add_two_ints_server.py和add_two_ints_client.py的Python文件。

  • 服务端实现:
#!/usr/bin/env python
#coding:utf-8
#上面的coding:utf-8是放置程序有中文报错的
import rospy
from server_client.srv import AddTwoInts, AddTwoIntsResponse

def handle_add_two_ints(req):
    result = req.a + req.b
    rospy.loginfo("Received request: %d + %d = %d", req.a, req.b, result)
    return AddTwoIntsResponse(result)

def add_two_ints_server():
    rospy.init_node('add_two_ints_server')
    rospy.Service('add_two_ints', AddTwoInts, handle_add_two_ints)
    rospy.loginfo("Ready to add two ints.")
    rospy.spin()

if __name__ == '__main__':
    add_two_ints_server()
  • 客户端实现:
#!/usr/bin/env python
#coding:utf-8
import rospy
from server_client.srv import AddTwoInts, AddTwoIntsRequest
import sys

def add_two_ints_client(x, y):
    rospy.wait_for_service('add_two_ints')
    try:
        add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)
        req = AddTwoIntsRequest()
        req.a = x
        req.b = y
        resp = add_two_ints(req)
        return resp.sum
    except rospy.ServiceException as e:
        rospy.logerr("Service call failed: %s", str(e))

if __name__ == '__main__':
    rospy.init_node('add_two_ints_client')
    x = int(sys.argv[1])
    y = int(sys.argv[2]) 
    result = add_two_ints_client(x, y)
    rospy.loginfo("%d + %d = %d", x, y, result)

② 打开python可执行权限,然后编辑配置文件CMakeLists.txt
ROS学习笔记(六)---服务通信机制,ROS学习,python,学习,笔记,机器人
ROS学习笔记(六)---服务通信机制,ROS学习,python,学习,笔记,机器人

(5)查看实现的效果

ROS学习笔记(六)---服务通信机制,ROS学习,python,学习,笔记,机器人文章来源地址https://www.toymoban.com/news/detail-726780.html

到了这里,关于ROS学习笔记(六)---服务通信机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ROS学习笔记08、机器人导航仿真(slam、map_server、amcl、move_base与导航消息介绍)

    马上开学,目前学校很多实验室都是人工智能这块,大部分都是和机器人相关,然后软件这块就是和cv、ros相关,就打算开始学习一下。 本章节是虚拟机安装Ubuntu18.04以及安装ROS的环境。 学习教程:【Autolabor初级教程】ROS机器人入门,博客中一些知识点是来源于赵老师的笔记

    2023年04月12日
    浏览(33)
  • ROS学习2:ROS通信机制

    【Autolabor初级教程】ROS机器人入门 机器人操作系统 ROS 快速入门教程 1. 引言 机器人上可能集成各种传感器(雷达、摄像头、GPS等)以及运动控制实现, 为了解耦合 ,在 ROS 中 每一个功能点都是一个单独的进程 , 每一个进程都是独立运行的 。更确切的讲, ROS 是进程(也称为

    2024年02月08日
    浏览(33)
  • ROS入门21讲 | ROS机器人入门教程 【简明笔记】

    古月·ROS入门21讲 | 一学就会的ROS机器人入门教程 ROS = 通信机制+开发工具+应用功能+生态系统 通信机制 : Node :完成具体功能的进程、独立运行的可执行文件。可用多种语言py、c++。节点在系统中的名称唯一。 ROS Master :为节点提供命名注册服务;跟踪和记录话题、服务通信

    2024年02月09日
    浏览(50)
  • ROS学习——通信机制(话题通信③—注意事项)

    2.1.2 话题通信基本操作A(C++) · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程   043话题通信(C++)4_注意事项_Chapter2-ROS通信机制_哔哩哔哩_bilibili 1. int main(int argc, char const *argv[]){} vscode 中的 main 函数 声明 int main(int argc, char const *argv[]){},默认生成 argv 被 const 修饰,需要

    2024年02月08日
    浏览(35)
  • 【ROS2机器人入门到实战】ROS2服务入门

    当前平台文章汇总地址:ROS2机器人从入门到实战 获取完整教程及配套资料代码,请关注公众号鱼香ROS获取 教程配套机器人开发平台:两驱版| 四驱版 为方便交流,搭建了机器人技术问答社区:地址 fishros.org.cn 大家好,帅鱼又蹬蹬蹬的游回来了。本节小鱼将要带大家一起了解

    2024年02月07日
    浏览(43)
  • ROS键盘遥控机器人,通过参数服务器指定速度

    在上节的驱动机器人,我们知道是 cmd_vel 话题发布一串 Twist 类型消息来控制,我们可以输入如下命令查看这个 Twist 的详细信息: rosmsg show geometry_msgs/Twist geometry_msgs/Vector3 linear   float64 x   float64 y   float64 z geometry_msgs/Vector3 angular   float64 x   float64 y   float64 z 由两个向量组成,

    2024年02月08日
    浏览(29)
  • ROS2从入门到精通1-2:详解ROS2服务通信机制与自定义服务

    本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。 🚀详情:《ROS2从入门到精通》 服务 是 ROS 图中节点之间的另一种通信方法。服务基于 服务器-客户端 模型,不同于话题的 发布者-订阅者

    2024年04月09日
    浏览(29)
  • (无人机方向)ros学习之路ROS 机器人系统仿真_导航仿真概述

    一:导航仿真概述 导航是机器人系统中最重要的模块之一,比如现在较为流行的服务型室内机器人,就是依赖于机器人导航来实现室内自主移动的,本章主要就是介绍仿真环境下的导航实现,主要内容有: 导航相关概念 导航实现:机器人建图(SLAM)、地图服务、定位、路径规划…

    2024年02月02日
    浏览(41)
  • 【ros2 control 机器人驱动开发】简单双关节机器人学习-example 1

    【ros2 control 机器人驱动开发】简单双关节机器人学习-example 1 本系列文件主要有以下目标和内容: 为系统、传感器和执行器创建 HardwareInterface 以URDF文件的形式创建机器人描述 加载配置并使用启动文件启动机器人 控制RRBot的两个关节(两旋转关节机器人) 六自由度机器人的

    2024年02月04日
    浏览(41)
  • ros2 基础学习 15- URDF:机器人建模方法

    ROS是机器人操作系统,当然要给机器人使用啦,不过在使用之前,还得让ROS认识下我们使用的机器人,如何把一个机器人介绍给ROS呢? 为此,ROS专门提供了一种机器人建模方法——URDF(Unified Robot Description Format,统一机器人描述格式),用来描述机器人外观、性能等各方面属

    2024年02月01日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包