ROS入门教程-1.1.15 编写简单的Service和Client (Python catkin)
ROS入门教程-编写简单的Service和Client (Python catkin)
说明:
- 本教程介绍如何用Python编写Service和Client节点。
目录
- 编写服务端节点
- 代码
- 代码解释
- 编写客户端节点
- 代码
- 代码解释
- 构建节点
- 测试
编写服务端节点
- 我们会创建服务端节点 ("add_two_ints_server") ,节点接收两个数字,并返回和
- 进入beginner_tutorials包
$ roscd beginner_tutorials
- 确保你确保已经在之前创建好AddTwoInts.srv
代码
- 在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
代码解释
- 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()会保持代码不退出,直到服务关闭
编写客户端
代码
- 在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
代码解释
- 客户端调用服务更简单,甚至可以不调用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代码块
构建节点
- 我们使用CMake作为构建系统,在Python也同样使用作为构建系统,它能确保之前创建的消息和服务能自动生成Python代码。
- 进入catkin 工作空间,运行catkin_make
# In your catkin workspace
$ cd ~/catkin_ws
$ catkin_make
测试
- 新终端,运行:
$ 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吧。
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号