多个节点间通讯 定义srv
与定义 msg类似
在功能包的根目录下 创建srv文件
sum.srv文件如下
int64 a
int64 b
---
int64 sum
catkin_make install
#!/usr/bin/env python
# service.py
from __future__ import print_function
from hrg.srv import sum,sumResponse
import rospy
def handle_add_two_ints(req):
print("Returning [%s + %s = %s]"%(req.a, req.b, (req.a + req.b)))
return sumResponse(req.a + req.b)
def add_two_ints_server():
rospy.init_node('add_two_ints_server')
s = rospy.Service('add_two_ints', sum, handle_add_two_ints)
print("Ready to add two ints.")
rospy.spin()
if __name__ == "__main__":
add_two_ints_server()
#!/usr/bin/env python
# client.py
from __future__ import print_function
import sys
import rospy
from hrg.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', sum)
resp1 = add_two_ints(x, y)
return resp1.sum
except rospy.ServiceException as 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)))
rosrun hrg service.py
root@chxin-virtual-machine:~/catkin_ws# rosrun hrg service.py
Ready to add two ints.
Returning [1 + 2 = 3]
#新cmd窗口
rossum hrg client.py 1 2 输出如下
root@chxin-virtual-machine:~/catkin_ws# rosrun hrg client.py 1 2
Requesting 1+2
1 + 2 = 3
其他的功能包也可使用 msg srv 共享的,是在整个python环境中的

注,新开cmd
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import rospy
from hrg.srv import *
import sys
def _service():
rospy.init_node("Service2")
srv_server_handler = rospy.Service("add", sum, lambda req :sumResponse(req.a+req.b))
rospy.spin()
def _client():
add=rospy.ServiceProxy("add",sum)
res=add(1,1)
print(res)
if __name__ == "__main__":
try:
arg1=arg1=sys.argv[1]
print(arg1)
if("1"==arg1):
_service()
else:
_client()
except Exception as err:
print(err)
pass
网友评论