ros服务通信

由于毕设是做ros机器人相关的上位机,因此本专题是做毕设所有过程的记录
学习资料参考内容如下:
B站Autolabor初级教程教学
Autolabor初级教程教学文档
主要是想记录自己的踩过的所有坑,内容可能比较零散,想看比较系统完备的知识请去参考上面两个链接

1. 创建srv文件

在功能包下创建srv文件夹,再在文件夹下创建srv文件
ros服务通信_第1张图片
srv_clinent.srv

# 客户端请求时发送的两个数字
int32 num1
int32 num2
---
# 服务器响应发送的数据
int32 sum

2. 配置package.xmlCMakeLists.txt

具体的配置可以看Autolabor初级教程教学文档,由于IDE用的是roboware studio,会帮我配置,配置都会自动生成

3. 编译并配置路径

ros服务通信_第2张图片
ros服务通信_第3张图片

编译后我们可以看到这个路径下会生成一个srv的python包,为了之后方便调用我们把python包移到我们scripts文件夹下

ros服务通信_第4张图片

4. 编写服务端程序

srv_demo.py

"""
    需求: 
        编写两个节点实现服务通信,客户端节点需要提交两个整数到服务器
        服务器需要解析客户端提交的数据,相加后,将结果响应回客户端,
        客户端再解析

    服务器端实现:
        1.导包
        2.初始化 ROS 节点
        3.创建服务对象
        4.回调函数处理请求并产生响应
        5.spin 函数

"""
# 1.导包
import rospy
from srv._srv_clinent import  srv_clinent, srv_clinentRequest, srv_clinentResponse
def doReq(req):
    # 解析提交的数据
    sum = req.num1 + req.num2
    rospy.loginfo("提交的数据:num1 = %d, num2 = %d, sum = %d",req.num1, req.num2, sum)

    # 创建响应对象,赋值并返回
    # resp = AddIntsResponse()
    # resp.sum = sum
    resp = srv_clinentResponse(sum)
    return resp


if __name__ == "__main__":
    # 2.初始化 ROS 节点
    rospy.init_node("addints_server_p")
    # 3.创建服务对象
    server = rospy.Service("srv_client",srv_clinent,doReq)
    # 4.回调函数处理请求并产生响应
    # 5.spin 函数
    rospy.spin()

命令行用rosservice call srv_client "num1: 12 num2: 11" 调用会出现以下画面

ros服务通信_第5张图片

值得注意的是srv_clinent, srv_clinentRequest, srv_clinentResponse这几个类是和msg文件同名的,不要导入错误了

5. 编写客户端程序

client_demo.py

"""
    需求: 
        编写两个节点实现服务通信,客户端节点需要提交两个整数到服务器
        服务器需要解析客户端提交的数据,相加后,将结果响应回客户端,
        客户端再解析

    客户端实现:
        1.导包
        2.初始化 ROS 节点
        3.创建请求对象
        4.发送请求
        5.接收并处理响应

    优化:
        加入数据的动态获取


"""
#1.导包
import rospy
from srv._srv_clinent import  srv_clinent, srv_clinentRequest, srv_clinentResponse
import sys

if __name__ == "__main__":

    #优化实现
    if len(sys.argv) != 3:
        rospy.logerr("请正确提交参数")
        sys.exit(1)


    # 2.初始化 ROS 节点
    rospy.init_node("Client")
    # 3.创建请求对象
    client = rospy.ServiceProxy("srv_client",srv_clinent)
    # 请求前,等待服务已经就绪
    # 方式1:
    # rospy.wait_for_service("AddInts")
    # 方式2
    client.wait_for_service()
    # 4.发送请求,接收并处理响应
    # 方式1
    # resp = client(3,4)
    # 方式2
    # resp = client(AddIntsRequest(1,5))
    # 方式3
    req = srv_clinentRequest()
    # req.num1 = 100
    # req.num2 = 200 

    #优化
    req.num1 = int(sys.argv[1])
    req.num2 = int(sys.argv[2]) 

    resp = client.call(req)
    rospy.loginfo("响应结果:%d",resp.sum)

调用结果:
ros服务通信_第6张图片

你可能感兴趣的:(ROS学习,机器人)