ROS学习笔记19 (编写简单的服务器和客户端 (Python))

1 编写服务端节点

  • 我们会创建服务端节点 ("add_two_ints_server") ,节点接收两个整型数字,并返回和
  • 进入beginner_tutorials包
$ roscd beginner_tutorials
  • 确保你确保已经在之前创建好AddTwoInts.srv

1.1 程序

  • 在beginner_tutorials包创建scripts/add_two_ints_server.py文件
  • 内容如下:
#!/usr/bin/env python

from beginner_tutorials.srv import *
import rospy

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()
  • 文件更改为可执行权限:
chmod +x scripts/add_two_ints_server.py

1.2 代码解释

  • init_node()初始化节点,并声明服务:
s = rospy.Service('add_two_ints', AddTwoInts, handle_add_two_ints)
  • 声明一个名为add_two_ints新服务,使用AddTwoInts服务类型。
  • 所有请求传递到handle_add_two_ints函数处理,并传递实例AddTwoIntsRequest和返回AddTwoIntsResponse实例。
  • 类似订阅实例,rospy.spin()会保持代码不退出,直到服务关闭

2 编写客户端

2.1 程序

  • 在beginner_tutorials包创建scripts/add_two_ints_client.py
  • 内容如下:
#!/usr/bin/env python

import sys
import rospy
from beginner_tutorials.srv import *

def add_two_ints_client(x, y):
    rospy.wait_for_service('add_two_ints')
    try:
        add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)
        resp1 = add_two_ints(x, y)
        return resp1.sum
    except rospy.ServiceException, e:
        print "Service call failed: %s"%e

def usage():
    return "%s [x y]"%sys.argv[0]

if __name__ == "__main__":
    if len(sys.argv) == 3:
        x = int(sys.argv[1])
        y = int(sys.argv[2])
    else:
        print usage()
        sys.exit(1)
    print "Requesting %s+%s"%(x, y)
    print "%s + %s = %s"%(x, y, add_two_ints_client(x, y))
  • 设置为可执行:
$ chmod +x scripts/add_two_ints_client.py

2.2 程序解释

  • 客户端调用服务更简单,甚至可以不调用init_node()来初始化节点
rospy.wait_for_service('add_two_ints')
  • 这是一种便利的阻塞方法,直到服务名为add_two_ints的服务生效。
  • 下一步创建实例来调用服务:
add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)
  • 我们使用实例就如平常的函数一样:
resp1 = add_two_ints(x, y)
return resp1.sum
  • 因为我们已声明服务类型AddTwoInts,它生成AddTwoIntsRequest对象。
  • 返回值是一个AddTwoIntsResponse对象。
  • 如果调用失败,rospy.ServiceException会抛出异常,因此你应该建立适当的try/except代码块

2.3 构建节点

  • 我们使用CMake作为构建系统,在Python也同样使用作为构建系统,它能确保之前创建的消息和服务能自动生成Python代码。
  • 进入catkin 工作空间,运行catkin_make
# In your catkin workspace
$ cd ~/catkin_ws
$ catkin_make

3 测试

  • 新终端,运行:
$ cd ~/catkin_ws
$ . devel/setup.bash
$ rosrun beginner_tutorials add_two_ints_server.py
  • 另开新终端,运行:
$ cd ~/catkin_ws
$ . devel/setup.bash
$ rosrun beginner_tutorials add_two_ints_client.py
  • 或运行:
/home/user/catkin_ws/src/beginner_tutorials/scripts/add_two_ints_client.py [x y]
  • 或运行:
$ rosrun beginner_tutorials add_two_ints_client.py 4 5
  • 服务端输出效果:
Requesting 4+5
4 + 5 = 9
  • 客户端输出效果:
Returning [4 + 5 = 9]
  • 现在你已经学会如何编写简单的Service和Client,开始测试简单的Service和Client吧。

你可能感兴趣的:(ROS)