ROS2 节点使用 Conda 环境运行 Python 依赖的解决方案

ROS2 节点使用 Conda 环境运行 Python 依赖的解决方案

适用场景 :ROS2 节点需要 PyTorch、NumPy 等仅在 Conda 中安装的 Python 包,但 ros2 launch / ros2 run 启动时出现 ModuleNotFoundError,或 rclpy 与 Python 版本不匹配。


一、问题现象

在 Conda 环境(如 metarobotics)中已安装 PyTorch,且终端中 python3 -c "import torch" 正常,但通过 ROS2 launch 启动节点时报错:

复制代码
ModuleNotFoundError: No module named 'torch'

或改用 conda run 后出现:

复制代码
ModuleNotFoundError: No module named 'rclpy._rclpy_pybind11'
The C extension '...cpython-38-x86_64-linux-gnu.so' isn't present on the system.

二、原因分析

2.1 为什么 ModuleNotFoundError: No module named 'torch'?

ros2 run / ros2 launch 启动的节点,实际执行的是 colcon 安装时生成的入口脚本(如 install/lib/xxx_pkg/executable_name)。该脚本的 shebang 通常指向构建时的 Python 解释器 ,多为系统自带的 /usr/bin/python3,而非 Conda 环境中的 Python。

因此:

  • 终端中 python3 来自 Conda → 能找到 torch
  • 节点进程使用的 Python 来自系统 → 找不到 torch

2.2 为什么 rclpy._rclpy_pybind11 报错?

ROS2 Humble 的 rclpy C 扩展是为 Python 3.10 编译的。若 Conda 环境使用 Python 3.8:

  • Conda 的 Python 3.8 能 import torch ✓
  • 但 rclpy 的 .so 文件是为 cpython-310 编译的,Python 3.8 无法加载 ✓
  • 报错提示缺少 rclpy._rclpy_pybind11 或 C 扩展不匹配

本质是 Python 版本不一致:ROS2 用 Python 3.10,Conda 用 Python 3.8。


三、解决方案

方案一:创建 Python 3.10 的 Conda 环境(推荐)

使 Conda 环境与 ROS2 Humble 使用同一 Python 版本,同时安装所需依赖:

bash 复制代码
# 1. 创建 Python 3.10 环境
conda create -n ros2_torch python=3.10 -y
conda activate ros2_torch

# 2. 安装 PyTorch 等依赖
pip install torch numpy

# 3. 使用该环境启动 ROS2 节点(见下文 launch 配置)

在 launch 文件中通过 conda run 在指定环境中运行节点,例如:

python 复制代码
from launch.actions import ExecuteProcess

eeg_simulator_node = ExecuteProcess(
    cmd=[
        'conda', 'run', '-n', 'ros2_torch', '--no-capture-output',
        'python3', '-m', 'your_pkg.your_node_module',  # 用 python -m 避免走系统 Python
        '--ros-args', '--params-file', params_file,
    ],
    output='screen',
    shell=False,
)

注意 :必须用 python3 -m your_pkg.your_node_module,而不要用 ros2 run。否则 ros2 run 调用的仍是 colcon 安装的脚本,可能继续使用系统 Python。


四、launch 中通过 conda run 指定环境的示例

以 eeg_bci_go2 包为例,支持通过 launch 参数指定 Conda 环境:

python 复制代码
# launch 参数
conda_env_arg = DeclareLaunchArgument(
    'conda_env',
    default_value='ros2_torch',  # 或 metarobotics(需 Python 3.10)
    description='Conda environment for nodes that need PyTorch',
)

# 需要 PyTorch 的节点:用 python3 -m 在 Conda 中运行
eeg_simulator_node = ExecuteProcess(
    cmd=[
        'conda', 'run', '-n', LaunchConfiguration('conda_env'), '--no-capture-output',
        'python3', '-m', 'eeg_bci_go2.eeg_simulator_node',
        '--ros-args', '--params-file', params_file,
    ],
    output='screen',
    shell=False,
)

# 不需要 PyTorch 的节点:可用 ros2 run 或同样用 conda run
eeg_cmd_bridge_node = ExecuteProcess(
    cmd=[
        'conda', 'run', '-n', LaunchConfiguration('conda_env'), '--no-capture-output',
        'ros2', 'run', 'eeg_bci_go2', 'eeg_cmd_bridge_node',
        '--ros-args', '--params-file', params_file,
    ],
    output='screen',
    shell=False,
)

启动方式:

bash 复制代码
# 默认使用 ros2_torch
ros2 launch my_package my_nodes_launch.py

# 指定 Conda 环境
ros2 launch my_package my_nodes_launch.py conda_env:=metarobotics

这样即使当前终端未激活 Conda,launch 也会在指定 Conda 环境中启动相关节点。


相关推荐
SEO_juper3 小时前
用 Python 写一个 GEO 可见性检查脚本:你的网站现在能被 AI 引用吗
开发语言·人工智能·爬虫·python·seo·外贸独立站
西柚小萌新4 小时前
【LLM&&AI应用开发 八股文】--4.3.Agent智能体(下)
java·开发语言·数据库
北极有牛4 小时前
cpp学习笔记--常量指针
java·开发语言·算法
半杯咖啡半行码4 小时前
C++ 编程与 STL 模板:从泛型编程到内存安全详解
开发语言·c++
caoerzhong4 小时前
JeeWMS 开源 WMS 部署避坑指南:Java 仓库管理系统的环境基线、四类根因与可复现交付
java·开发语言·开源
时间的拾荒人4 小时前
Qt 界面优化:绘图详解 —— 从基础图形到图片处理
开发语言·qt·面试
用户8356290780515 小时前
使用 Python 对 Excel 工作表进行排序
后端·python
MayZork5 小时前
Qt 文件操作:QSaveFile 与 QTemporaryFile(含 QTemporaryDir)实战
开发语言·qt
北冥you鱼5 小时前
Go 语言空接口(interface{})使用场景与最佳实践
开发语言·windows·golang
for_ever_love__5 小时前
MySQL 全文索引实战:FULLTEXT、ngram 中文分词与 MATCH AGAINST 到底该怎么用
java·python·mysql·全文检索·分词·索引·ngram