ros2学习笔记:如何使用conda环境运行功能包

一、区分构建与运行

按照官网的教程安装ros2,官方安装流程使用的是 Ubuntu 系统默认的 Python 环境,所有 ROS2 的 Python 依赖(如 rclpy)都通过 apt 安装在系统路径中(例如 /usr/lib/python3/dist-packages)。当你运行 colcon build 时,它会默认使用系统 Python。因此无法访问 Conda 虚拟环境中的包。

但当我们编写程序时,我们需要依赖各种第三方库。当我在系统默认的Python环境中安装第三方库时,产生报错如下:

~$ pip install face_recognition -i https://pypi.tuna.tsinghua.edu.cn/simple   
error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.
    
    If you wish to install a non-Debian-packaged Python package,
    create a virtual environment using python3 -m venv path/to/venv.
    Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
    sure you have python3-full installed.
    
    If you wish to install a non-Debian packaged Python application,
    it may be easiest to use pipx install xyz, which will manage a
    virtual environment for you. Make sure you have pipx installed.
    
    See /usr/share/doc/python3.12/README.venv for more information.

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.

错误原因:Ubuntu 系统默认的 Python 环境受到外部管理限制,不允许直接使用 pip 工具在系统级安装 Python 包,防止用户随意修改系统级的 Python 包,避免对系统中其他依赖这些包的软件造成影响。因此,我们还是最好创建一个python虚拟环境。

思考:到这里,我遇到了一个问题。ros2默认安装在系统的python环境中,因此我们必须要使用默认环境。但该环境却不支持用户随意修改添加python包,因此我们使用第三方库需要安装在虚拟环境中。我的第一个想法是,能不能将ros2安装在conda的虚拟环境中呢?搜索相关资料后的出的结论:可以,但非常不推荐

原因如下:

  • 复杂性高:ROS2 依赖大量系统级 C++ 库(如 OpenCV、DDS 实现),在 Conda 中重新构建极其复杂。

  • 兼容性问题:Conda 的python包可能与 ROS2 的python包冲突。

  • 维护困难:官方不支持此方式,社区经验较少。

其实我陷入了一个误区,那就是构建功能包和运行功能包不一定要同一个python环境。例如,在使用colcon build构建功能包时,我们可以使用系统默认的python环境,而在运行功能包时,可以使用自己创建的虚拟python环境。这里我使用miniconda来创建虚拟环境。

二、解决方法

2.1、准备工作

步骤一:在工作空间下创建一个run_with_conda.sh脚本,内容如下:

#!/bin/bash

# 激活conda环境
source ~/miniconda3/etc/profile.d/conda.sh  # 根据您的conda安装路径调整
conda activate your_env_name  # 替换为您的conda环境名

# 设置ROS2环境
source /opt/ros/jazzy/setup.bash
source install/setup.bash

# 设置PYTHONPATH包含conda环境的库
export PYTHONPATH="$CONDA_PREFIX/lib/python3.12/site-packages:$PYTHONPATH"

# 运行节点
ros2 run demo_python_service learn_face_detect

步骤二:使脚本可执行

chmod +x run_with_conda.sh

2.2、使用步骤:

步骤一:colcon build构建功能包

步骤二:通过脚本运行节点

./run_with_conda.sh

三、举例验证

这是一段人脸识别的代码,参考b站:鱼香ros

其中face_recognition是需要安装的第三方库,我在系统默认的python3环境中安装失败,故创建了一个ros2env的conda环境进行安装。

import face_recognition
import cv2
from ament_index_python.packages import get_package_share_directory # 获取功能包share目录绝对路径

def main():
    # 获取图片真实路径
    default_image_path = get_package_share_directory('demo_python_service') + '/resource/default.jpg'
    print(f"Default image path: {default_image_path}")
    # 使用cv2加载图片
    image = cv2.imread(default_image_path)
    # 检测人脸
    face_locations = face_recognition.face_locations(image,number_of_times_to_upsample=1,model='hog')
    # 绘制人脸框
    for top,right,bottom,left in face_locations:
        cv2.rectangle(image, (left, top), (right, bottom), (0, 255, 0), 4)
    # 显示图片
    cv2.imshow("Face Detection", image)
    cv2.waitKey(0)

首先,我仍然在系统环境中进行构建,结果如下:

可以看到,我使用的python路径是/usr/bin/python3,这代表着是在系统默认的python环境中进行构建的,即使该环境没有face_recognition库,仍然可以构建成功。

接下来若我仍然使用系统默认环境进行运行,结果如下:

可以看到报错:ModuleNotFoundError: No module named 'face_recognition',这便是因为系统环境里没有安装face_recognition。

因此我们采用上文中提出的方法来运行,结果如下,运行成功!

四、可能遇到的问题

若安装miniconda后发生与系统默认python3起冲突的情况,可以参考博客:

ros2学习笔记-错误修正:miniconda与python3冲突

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10710

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值