在ROS2中导入包中的模块

2024-03-29 00:03:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经为Python创建了一个存储库,我已经为它添加了一个包。我遇到的问题是,在原始存储库中,来自自己的repo的模块是直接导入的,而在我的存储库中,我必须在模块前面添加ROS2包名称,即使我是从同一个repo导入模块,比如:

import planner_pkg.SimpleOneTrailerSystem as SimpleOneTrailerSystem

我想:

import SimpleOneTrailerSystem

我的ROS2项目结构如下:

ros2_ws
  src
    planner
      planner_pkg
        __init__.py
        SimpleOneTrailerSystem.py
        planner_node.py
        ...
      package.xml
      setup.py

在包.xml在

^{pr2}$

在设置.py公司名称:

from setuptools import setup

package_name = 'planner_pkg'

setup(
    name=package_name,
    version='0.0.0',
    packages=[package_name],
    data_files=[
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
    ],
    install_requires=['setuptools'],
    zip_safe=True,
    author='',
    author_email='',
    maintainer='',
    maintainer_email='',
    keywords=['ROS'],
    classifiers=[
        'Intended Audience :: Developers',
        'License :: OSI Approved :: Apache Software License',
        'Programming Language :: Python',
        'Topic :: Software Development',
    ],
    description='Package containing examples of how to use the rclpy API.',
    license='Apache License, Version 2.0',
    tests_require=['pytest'],
    entry_points={
        'console_scripts': [
            'planner_node = planner_pkg.planner_node:main',
        ],
    },
)


Tags: 模块namepyimport名称nodepackagelicense
1条回答
网友
1楼 · 发布于 2024-03-29 00:03:04

这个答案已经很晚了,但我最近刚建立了一个ROS2项目,我想我可以解释一下进口产品发生了什么。在

首先,根据Module Search Path文档,当您执行import something操作时,Python会在以下位置查找{}:

  • 从内置模块
  • sys.path,它是一个list,包含:
    • 输入脚本的目录
    • PYTHONPATH,这是一个包含目录列表的环境变量
    • 依赖于安装的默认值

其次,在构建ros2python包时(通过调用colcon build调用ament_python构建类型),Python代码将被复制到一个树结构如下的install文件夹中:

install
...
├── planner_pkg
│   ├── bin
│   │   └── planner_node
│   ├── lib
│   │   └── python3.6
│   │       └── site-packages
│   │           ├── planner_pkg
│   │           │   ├── __init__.py
│   │           │   ├── planner_node.py
│   │           │   └── SimpleOneTrailerSystem.py
...

现在,当您执行import SimpleOneTrailerSystem操作时,Python将首先从内置模块中搜索它(这肯定不会在那里找到),然后从sys.path中搜索。您可以在规划器的顶部添加print(sys.path)_节点.py要查看以下列表:

^{pr2}$

sys.path列表中,首先是输入脚本的bin文件夹,它将是planner_node(指定为中的入口点)设置.py)。没有SimpleOneRailerSystem.py文件/模块(或任何其他文件)在bin文件夹中,这样导入将失败。在

列表中的下一个将是planner_pkg/lib/pythonX.X/site-packages,从上面的树结构可以看出,有一个SimpleOneRailerSystem.py模块但它位于计划器包文件夹下。所以像这样的直接进口

import SimpleOneTrailerSystem

不起作用。您需要使用包文件夹来限定它,如下所示:

import planner_pkg.SimpleOneTrailerSystem

有两种方法可以解决这个问题。在

  1. import-ingSimpleOneTrailerSystem之前修改sys.path

    import sys
    sys.path.append("/path/to/install/planner_pkg/lib/python3.6/site-packages/planner_pkg")
    
    import SimpleOneTrailerSystem
    

    此方法将planner_pkginstall目录的路径添加到sys.path列表中,这样就不需要在后续导入中指定它。

  2. 在运行ROS2节点之前修改PYTHONPATH

    $ colcon build
    $ source install/setup.bash
    $ export PYTHONPATH=$PYTHONPATH:/path/to/install/planner_pkg/lib/python3.6/site-packages/planner_pkg
    $ planner_node
    

    此方法与第一种方法几乎相同,但不涉及代码更改(也不涉及重建),因为您只需要修改PYTHONPATH环境变量。

相关问题 更多 >