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

Why import works in this ROS python script

我正在使用 ROS packages and coming from this 教程。考虑到当前工作目录或 PATH 中列出的任何其他目录中缺少 AddTwoIntsResponse,此 import 语句出人意料地有效 。另外,为什么会导入 .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 文件,并将它们放在 catkin_ws/devel/lib/你的-python-version/dist-packages/package-name/srv.

如果你的工作区是 sourced,catkin_ws/devel/lib/your-python-version/dist-packages/ 已经添加到你的 PYTHONPATH 中,那就是你是如何成功导入它们的。

对于您正在使用的教程包,如果您安装了教程的二进制文件,即使您没有找到当前的 catkin 目录,导入也可能会起作用。这样 python 模块位于 /opt/ros/ros-version/lib/your-python-version/dist-packages/ 这又是 PYTHONPATH 的一部分。 (如果 ROS env 可用)