我正在使用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可用(