一、区分构建与运行
按照官网的教程安装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起冲突的情况,可以参考博客: