ros服务端: srv与import 错误:No module named srv

在官方文档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服务。说明编译通过了,但是没有生成相应的依赖文件。
也可以查看终端的编译结果,如果是这样的,说明没有生成依赖项:
依赖项生成失败
如果是这样的:
有紫色、蓝色的提示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的包。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值