【ROS 笔记4】service 通信(通俗理解)

本文详细介绍了ROS中的服务通信,包括服务的定义、服务端和客户端的创建。服务允许节点间同步通信,适用于需等待结果的情况。文章解答了关于AddTwoInts.srv文件中响应消息的来源、客户端为何无需调用init_node()以及一个进程能否运行多个节点的问题。同时,还提供了一个示例,展示如何在同一个节点中实现多个服务的提供。
摘要由CSDN通过智能技术生成

1. 前言

在ROS(Robot Operating System)中,客户端与服务端的通信是一种非常核心的交互方式,允许节点之间进行同步通信。具体来说,服务端(Service Server)提供特定的服务,客户端(Service Client)则向服务端发送请求并等待响应。这种通信方式适用于需要等待结果才能继续执行的情况,如获取传感器数据或执行计算任务。

2. 定义服务(service)

首先,我们需要定义一个服务,包括请求和响应的消息类型。这通常在一个.srv文件中完成,该文件位于你的ROS包的srv目录下。

例如,如果我们要创建一个服务来执行两个整数的加法,我们可能会定义一个名为AddTwoInts.srv的文件,内容如下:

# 定义一个AddTwoInts.srv 文件
# 内容如下

int64 a
int64 b
---
int64 sum

这里:

---之前的部分是请求消息(客户端发送给服务端的),

---之后的部分是响应消息(服务端返回给客户端的)。

3. 建立服务端

创建服务定义后,下一步是实现服务端节点,该节点将提供服务。

在Python中,服务端的实现大概是这样的:

#!/usr/bin/env python
import rospy
from your_package.srv import AddTwoInts, AddTwoIntsResponse

def handle_add_two_ints(req):
    print("Returning [%s + %s = %s]" % (req.a, req.b, (req.a + req.b)))
    return AddTwoIntsResponse(req.a + req.b)

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

if __name__ == "__main__":
    add_two_ints_server()
在这个例子中,我们首先导入必要的ROS库和服务消息类型。handle_add_two_ints函数是服务的实际逻辑,它接收请求,执行操作,并返回响应。通过rospy.Service创建服务,指定服务名称、服务类型,以及处理函数。

4. 建立客户端(也叫请求端)

有了服务端,我们还需要一个客户端节点来发送请求并接收响应。

客户端的Python代码可能如下所示:

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值