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 环境中启动相关节点。


相关推荐
蜜獾云3 小时前
设计模式之构造器模式:封装复杂对象的构造逻辑
java·开发语言·设计模式
acanab4 小时前
vscode对isaac lab开发时包不能正常导入的问题
vscode·python
娇娇yyyyyy4 小时前
Qt编程(3): 信号和槽函数
开发语言·数据库·qt
wwww.wwww4 小时前
qt程序执行时报错:无法定位程序输入点,但是通过IDE的run又可以正常的运行。
开发语言·ide·qt
乌鸦乌鸦你的小虎牙7 小时前
qt 5.12.8 配置报错(交叉编译环境)
开发语言·数据库·qt
feifeigo1237 小时前
Leslie人口模型MATLAB实现(中长期人口预测)
开发语言·matlab
写代码的二次猿7 小时前
安装openfold(顺利解决版)
开发语言·python·深度学习
一只大袋鼠7 小时前
Redis 安装+基于短信验证码登录功能的完整实现
java·开发语言·数据库·redis·缓存·学习笔记
Eward-an7 小时前
LeetCode 1980 题通关指南|3种解法拆解“找唯一未出现二进制串”问题,附Python最优解实现
python·算法·leetcode