在官方文档py服务端开发中,服务端有一句:
from learning_service.srv import AddTwoInts, AddTwoIntsResponse
对于这句比较疑惑:
因为 learning_service中的AddTwoInts.srv是这样的:
int64 a
int64 b
---
int64 sum
如何通过srv进行import?
后来整明白了,这是编译成功后,从/home/box/catkin_ws/devel/lib/python2.7/dist-packages/功能包名称/srv/_AddTwoInts.py中导入 AddTwoInts, AddTwoIntsResponse
我们可以在这里简单看一下_AddTwoInts.py的代码:
# This Python file uses the following encoding: utf-8
"""autogenerated by genpy from learning_service/AddTwoIntsRequest.msg. Do not edit."""
import codecs
import sys
python3 = True if sys.hexversion > 0x03000000 else False
import genpy
import struct
class AddTwoIntsRequest(genpy.Message):
......
class AddTwoIntsResponse(genpy.Message):
.....
class AddTwoInts(object):
......
明显,里面有3个类可以调用。
接下来就可以愉快的编程(取自roswiki的例子):
...
from learning_service.srv import AddTwoInts,AddTwoIntsResponse # 调用刚才的3个类
...
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()
比如这句:新建一个名称为’add_two_ints’的服务,类型是上边的类AddTwoInts,提供给函数handle_add_two_ints。
s = rospy.Service('add_two_ints', AddTwoInts, handle_add_two_ints)
同理,使用类AddTwoIntsResponse,返回值
def handle_add_two_ints(req):
9 print("Returning [%s + %s = %s]"%(req.a, req.b, (req.a + req.b)))
10 return AddTwoIntsResponse(req.a + req.b)
另外要注意的是:
因为是在srv中新建了AddTwoInts.srv,以为是要
from AddTwoInts.srv import 服务1 # 这是错误的!!!
实际是错误的,要按下边的语法进行import:
from 功能包名.srv import 服务1 服务2
然而明白了上边的这些,在自己编写一个新的package后并执行catkin_make,发现仍然报错:No module named srv。
然后就开始查找原因。打开/home/box/catkin_ws/devel/lnclude以及发现/home/box/catkin_ws/devel/lib/python2.7/dist-packages中,都没有发现自己的package。但是使用rospack find 以及rossrv都可以找到功能包及srv服务。说明编译通过了,但是没有生成相应的依赖文件。
也可以查看终端的编译结果,如果是这样的,说明没有生成依赖项:
如果是这样的:
然后把目光放在/home/box/catkin_ws/src/功能包/CMakeLists.txt 以及package.xml上,应该是这俩的问题。但是改了半天还是报错,一气之下用原来其他功能包(胡春旭老师给的教材附带的文件)中编译成功的CMakeLists.txt 以及package.xml考进来,把2个开头的功能及功能包名称给替换成新的,然后执行编译。
终于皆大欢喜。有紫色、蓝色的提示srv生成,说明依赖项有了。然后rosrun一下,果然不再提示No module named srv!!!
后续:经过对这两个CMakeLists.txt的对比及翻阅资料,发现应该是catkin_package没有配置好。
原来的:
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES myself_learn_service
# CATKIN_DEPENDS roscpp rospy std_msgs
# DEPENDS system_lib
)
应该改为:
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES myself_learn_msg
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
# DEPENDS system_lib
)
增加编译的依赖package。没有了这些,就编译不出/home/box/catkin_ws/devel/lib/python2.7/dist-packages/功能包名称/srv/中所需要import的包。