一、写一个服务器(service)节点
首先我们得确保运行了之前的教程中的creating the AddTwoInts.srv教程。
进去工作空间中
roscd beginner_tutorials
在py脚本文件夹scripts中新建add_two_ints_server.py文件
touch 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) #因为我们已经将服务的类型声明为AddTwoInts,所以它会为您生成AddTwoIntsRequest对象(可以自由传递)。
def add_two_ints_server():
rospy.init_node('add_two_ints_server') #声明节点为add_two_ints_server
s = rospy.Service('add_two_ints', AddTwoInts, handle_add_two_ints)#使用AddTwoInts(之前教程中建立的)服务类型声明一个名为add_two_ints的新服务。所有请求都传递给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
二、写一个客户端(client)节点
在py脚本文件夹scripts中新建add_two_ints_client.py文件
touch 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') #在客户端中我们不需要创建node,这是一种便捷方法,可以阻止名为add_two_ints的服务可用。
try:
add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)#创建一个用于调用服务的句柄,可以像调用函数一样,调用句柄
resp1 = add_two_ints(x, y) #因为我们已经将服务的类型声明为AddTwoInts,所以它会为您生成AddTwoIntsRequest对象(可以自由传递)。
return resp1.sum
except rospy.ServiceException, e: #如果调用失败,可能会抛出rospy.ServiceException
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
三、运行节点
首先回到工作空间,并且编译
cd catkin_ws
catkin_make
source
source devel/setup.bash
运行节点
rosrun beginner_tutorials add_two_ints_server.py
会出现Ready to add two ints.字样,然后打开新的终端运行client节点
rosrun beginner_tutorials add_two_ints_client.py
会打印出实用信息如下:
/home/m-tan/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]
至此,已经完成了ROS的服务器和客户端教程。