Python实现Server端

Server创建流程

1. 创建节点

1
rospy.init_node(nodeName)

2. 创建server

Tip

第一个参数serviceName为服务名称,为一个uri地址

第二个参数是服务需要的数据类型。

第三个参数为服务请求的回调

3.处理请求的逻辑

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
def callback(request):
    if not isinstance(request, AddTwoIntsRequest):
        return

    # 获取请求数据
    a = request.a
    b = request.b

    # 返回响应结果
    response = AddTwoIntsResponse()
    response.sum = a + b
    return response

Tip

回调函数的参数是请求过来的数据

返回值是响应的数据

完整示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/env python
# coding:utf-8

import rospy
from rospy_tutorials.srv import AddTwoInts, AddTwoIntsRequest, AddTwoIntsResponse


def callback(request):
    if not isinstance(request, AddTwoIntsRequest):
        return

    # 获取请求数据
    a = request.a
    b = request.b

    # 返回响应结果
    response = AddTwoIntsResponse()
    response.sum = a + b
    return response

if __name__ == '__main__':
    # 创建节点
    nodeName = "my_server_node"
    rospy.init_node(nodeName)

    # 创建Service Server
    serviceName = "my_service"
    rospy.Service(serviceName, AddTwoInts, callback)

    # 阻塞线程
    rospy.spin()

调试Server

调试server端主要是查看server端是否能接收到请求,并根据请求数据处理相应的业务逻辑,然后返回处理好的结果。

在这里,我们只需要模拟client端发送请求就可以了。

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

1. rosservice命令行调试

通过rosservice list命令可以帮助我们查询出当前运行的所有service

1
rosservice list

查询的结果中,我们可以得到对应的服务名称/demo_service/add_tow_int

通过查询的服务名称,来调用此服务

1
rosservice call /my_service "a:1 b:3"

Tip

rosservice call负责调用service。第一个参数是要调用的service的名称,后面的参数是调用时需要传入的参数。

2.rqt_service_caller工具调试

通过命令呼出工具

1
rosrun rqt_service_caller rqt_service_caller