继续上节快速回忆了 ros publisher 与subscriber 节点的写法之后,继续回顾 service与client 节点写法
在相同的工作空间 ~/catkin_ws/src 下新建一个功能包:
$catkin_create_pkg test_pkg_service std_msgs rospy roscpp
回到 ~/catkin_ws/下
catkin_make 一下, source ./devel/setup.bash
$roscd test_pkg_service
创建脚本与服务-响应的数据类文件夹
$mkdir scripts
$mkdir srv
新建一个AddTwo.srv 的文本文件
内容:
int64 a
int64 b
---
int64 sum
此格式为ros service 的一般格式,发送请求数据 为 a和b, 返回数据为 sum
之后修改 package.xml 与CMakelist.txt
1 ) 然后在 package.xml中
<build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>
不被注释;
2) CMakelist.txt 中(改动4个地方):
1.在find_package 改动:
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
2.改动add_service_files
add_service_files(
FILES
AddTwo.srv
)
3. 去掉注释
generate_messages(
DEPENDENCIES
std_msgs
)
4.增加依赖脚本
catkin_install_python(PROGRAMS
scripts/service_node.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
然后
回到 ~/catkin_ws/下
catkin_make 一下, source ./devel/setup.bash
$rossrv list 一下 可以看到:
test_pkg_service/AddTwo
$ rossrv info test_pkg_service/AddTwo 就可以看到 service数据格式定义的内容
在scripts 文件夹下增加文件 service_node.py
#!/usr/bin/python
import rospy
from test_pkg_service.srv import AddTwo, AddTwoResponse
# define the function to handle the request
def handle_add_two(req):
rospy.loginfo('Receive the req: %d + %d' % (req.a, req.b))
re = req.a + req.b
rospy.loginfo('The results is %d' % re)
return AddTwoResponse(re)
def add_two_ints_service():
rospy.init_node('adding_node',anonymous=True)
s = rospy.Service('add_two_ints',AddTwo,handle_add_two)
rospy.loginfo('The service started...')
rospy.spin()
if __name__ =="__main__":
add_two_ints_service()
chmod +x service_node.py
运行服务:
$ rosrun test_pkg_service service_node.py
不编写客户端进行 快速测试服务:
$ rosservice call /add_two_ints 2 3
编写客户端情形:
在scripts 文件夹下 建立 client.py
#!/usr/bin/python import rospy from test_pkg_service.srv import AddTwo, AddTwoResponse import sys def add_two_ints_call_service(x,y): rospy.wait_for_service('add_two_ints') func = rospy.ServiceProxy('add_two_ints',AddTwo) rospy.loginfo('ready to call the service from client!') res = func(x, y) return res.sum if __name__ == "__main__": x = int(sys.argv[1]) y = int(sys.argv[2]) re = add_two_ints_call_service(x,y) print('The sum of %d and %d is %d' % (x,y,re))
chmod +x client.py
需要在 CMakelist.txt中增加脚本引用
catkin_install_python(PROGRAMS
scripts/service_node.py
scripts/client.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
回到 ~/catkin_ws/下
catkin_make 一下, source ./devel/setup.bash
运行客户端
$rosrun test_pkg_service client.py 3 5