为什么导入在这个ROS python脚本中有效



我正在使用ROS包,并且来自本教程。考虑到当前工作目录或PATH中列出的任何其他目录中的任何位置都没有AddTwoIntsResponse,此导入语句令人惊讶地工作。此外,.srv是如何被导入的?

# add_two_ints_server.py
from beginner_tutorials.srv import AddTwoInts, AddTwoIntsResponse 

当前工作目录为~/catkin_ws/src/beginner_tutorials/srv

这是我的ROS目录布局:

catkin_ws
|-- src
|   `-- beginner_tutorials
|       |-- scripts
|       |   `-- add_two_ints_server.py
|       `-- srv
|           `-- AddTwoInts.srv
|-- build
`-- devel

AddTwoInts.srv的内容为:

int64 a
int64 b
---
int64 sum

根据我的理解,这应该抛出一个ImportError: cannot import name 'AddTwoIntsResponse',但它没有。导入任何其他文件,例如:from beginner_tutorials.srv import foo会抛出ImportError

我的理解哪里出了问题?

|-- src
|   `-- beginner_tutorials
|       |-- scripts
|       |   `-- add_two_ints_server.py
|       `-- srv
|           `-- AddTwoInts.srv
|-- build
|-- devel // this is where your modules are imported from

当您使用catkin_make构建包时,"catkin"会为.srv文件中定义的服务类型生成相关的python文件,并将它们放在您的python版本/dist packages/包名/srv下。

如果您的工作区来源于catkin_ws/devel/lib/您的python版本/dist packages/已经添加到您的PYTHONPATH中,这就是您成功导入它们的方法。

对于您正在使用的教程包,如果您安装了教程的二进制文件,即使您还没有获取当前的catkin目录,导入也可以工作。通过这种方式,python模块位于/opt/ros/ros版本/lib/您的python版本/dist包/下,这也是PYTHONPATH的一部分。(如果ROS-env可用(

最新更新