目录

一.我的环境

二.环境炸了怎么办?用Timeshift恢复快照(达到类似于Windows重置的效果)

Timeshift安装

三.ros2与pytorch的先后安装顺序

1.安装ros2

2.安装与配置Anaconda

(1)安装步骤

(2)创建一个新的python虚拟环境,这里我的虚拟环境叫pytorch

(3)在刚刚创建的虚拟环境下安装Ultralytics

(4)关闭 在启动bash时 自动激活base环境

3.创建和编译ros2包

(1)创建ros2包

(2)编译ros2包

4.写ros2 Python代码

(1)怎么让pycharm同时知道 系统环境下的ros2 pyhton包 和 自定义的ros2消息 和 conda虚拟环境下的ultralytics包 呢?

(2)写代码时的注意事项

四.测试

1.示例代码

2.编译运行

五.参考资料


一.我的环境

  • Ubuntu22.04LTS(X86架构)
  • ros2 humble
  • Anaconda
  • Ultralytics

二.环境炸了怎么办?用Timeshift恢复快照(达到类似于Windows重置的效果)

在使用Timeshift之前建议先刷机!!!

  • 这是一款拍摄快照的软件,我们可以在系统是全新无污染的时候拍一次快照,之后每次环境炸了,都可以直接恢复快照

Timeshift安装

在刷完系统后建议立刻安装timeshift,安装timeshift的bash代码如下:

sudo apt install timeshift

三.ros2与pytorch的先后安装顺序

步骤(省流):

在系统环境下安装ros2

👇

安装Anaconda

👇

创建虚拟环境(这里我创建的名字叫pytorch)

👇

在虚拟环境中安装 Ultralytics(默认一起安装pytorch)

👇

在系统环境下创建并编写ros2包

👇

在系统环境下编译ros2包

1.安装ros2

【踩坑记录:尝试过在安装Anaconda后,新建一个python版本,名为ros2_env的虚拟环境,然后在该虚拟环境下安装ros2,然后用的是小鱼的一键安装,然后发现我的ros2_env中并没有多出包(可以尝试寻找colcon包,是找不到的),我就猜测最终包都装到系统自带的python中,于是我删除了ros2_env,然后再去编译包就会一堆报错,其中包括colcon的依赖缺失,如catkin_pkg】

小鱼ros一键安装:

wget http://fishros.com/install -O fishros && . fishros

2.安装与配置Anaconda

Anaconda安装地址https://www.anaconda.com/download/success

(1)安装步骤

  • 安装的Anaconda安装包是一个bash文件,所以我们在下载Anaconda的目录中打开bash,输入以下命令(这里我的安装目录是Downloads,所以我就在Downloads目录下打开bash)

  • 这里是同意许可,按下Enter键

  • 这里是同意许可,输入yes,再按Enter

  • 这里是选择安装目录,一般都是用默认目录,所以按下Enter键盘

【安装完成】

测试:关闭现在的bash,再打开一个新的bash,就会在用户名前出现一个(base)👇

(2)创建一个新的python虚拟环境,这里我的虚拟环境叫pytorch

【注意:这里建议python版本选择3.10,原因参考鱼香ros社区中的一个问题帖子,截图我放在下面👇,当然这是我的一个猜测,我没有真正尝试过用其他的python版本,因为已经折腾太多次了】

参考的照片

2025.8.19踩坑记录:

  • 我在ros2中试图融合Online-3D-BPP-DRL项目,但是因为该项目支持python版本为3.7,于是我创建了一个python=3.7的conda环境,而且顺利跑通了源代码。
  • 但是在我融合ros2时,就出现了以下意外👇
右图为报错,左图为gemini给出的解释

通过这个例子说明,我们最好不要用调用其他版本的python包

  • 创建虚拟环境:
conda create -n [你自定义的虚拟环境名] python=3.10


 

  • 然后输入y,再按Enter键来安装一些基础包
  • 输入以下命令来查看是否有刚刚创建的环境
    conda env list


     

  • 输入以下命令进入刚刚创建的虚拟环境

conda activate [你刚刚创建的环境的名称]

(3)在刚刚创建的虚拟环境下安装Ultralytics

Yolo官网https://docs.ultralytics.com/zh/

pip install ultralytics


 

(4)关闭 在启动bash时 自动激活base环境

【为什么要这么做呢?其实是因为我基本上用不上base环境,但是 请不要删除base环境,删除后可能会导致Anaconda运行不正常,所以我们可以修改conda的配置来取消bash开启时自动激活base环境】

  • 随便在一个地方打开终端
  • 输入以下命令
conda config --set auto_activate_base false
  • 附:如果你想再次启动 base环境的自动激活:
conda config --set auto_activate_base true

3.创建和编译ros2包

创建包编译包
系统环境✓✓
Conda的虚拟环境✓✕

(1)创建ros2包

  • 经过测试,无论是创建python包还是创建c++包,用系统环境和Conda虚拟环境都是可行的

(2)编译ros2包

一定一定要在系统环境下编译ros2包,否则会出现以下报错👇

ModuleNotFoundError: No module named 'catkin_pkg'

【报错原因:ros2包是安装在系统环境下的,也就是说ros2中的python依赖也是安装在系统环境下的,而我们看到报错中cmake编译时使用的python环境是conda的pytorch环境,而pytorch环境中我只安装了ultralytics,根本不可能存在ros2的依赖,所以报错】

报错截图展示

踩坑记录

  • 系统环境下编译ros2包 -> 不删除编译文件 -> 在conda虚拟环境下编译ros2包:都不会报错,并且在系统环境和虚拟环境下都正常运行

如下图所示👇

  • conda虚拟环境下编译ros2包 -> 不删除编译文件 -> 系统环境下编译ros2包:都会报错

如下图所示👇

结论:当编译报错时,先删除编译文件,然后在系统环境下重新编译

4.写ros2 Python代码

  • 编译器:pycharm-professional、clion

(1)怎么让pycharm同时知道 系统环境下的ros2 pyhton包 和 自定义的ros2消息 和 conda虚拟环境下的ultralytics包 呢?

步骤:

  • 在 终端 中 source ros2工作环境
  • 然后在 终端 中打开 pycharm-professional
  • 在 pycharm 里选择 【你的conda虚拟环境】

(clion的操作步骤跟这里一样)

(2)写代码时的注意事项

【注意:在运行ros2 python程序时,我们其实是在系统环境下运行的,所以在写代码的时候我们其实也相当于在系统环境下编写。emmmm可能理解起来有点抽象。】

  • 那就抛开注意事项不说,我们只需要知道,在写ros2 python程序时,如果我要引入pytorch、yolo等在虚拟环境才有的玩意,我们就要引入虚拟环境的环境变量,即输入:
# 引入环境变量,这里我们要把我们创建的Anaconda虚拟环境加入环境变量
import sys
new_path = '/home/amiya/anaconda3/envs/pytorch/lib/python3.10/site-packages'
if new_path not in sys.path:
    sys.path.insert(0,new_path)

# 然后我们就可以引入Anaconda虚拟环境中的包
from ultralytics import YOLO
import torch

效果如图

【至此,我们就已经完成了 ros2 和 pytorch 环境共存的配置】

四.测试

1.示例代码

# 系统环境的包
import rclpy
from rclpy.node import Node
from std_msgs.msg import String

# 引入Anaconda虚拟环境的变量,这里我的Ubuntu用户名是amiya,我的虚拟环境名叫pytorch
import sys
new_path = '/home/amiya/anaconda3/envs/pytorch/lib/python3.10/site-packages'
if new_path not in sys.path:
    sys.path.insert(0,new_path)

# 引入 pytorch虚拟环境 才有的包
from ultralytics import YOLO

class test(Node):
    def __init__(self):
        super().__init__('test')
        self.publisher = self.create_publisher(String, 'test', 10)
        self.timer = self.create_timer(5, self.test_callback)

        self.test_yolo()

        print('初始化完成')

    # 这里是Yolo官方文档的代码示例
    def test_yolo(self):
        # Create a new YOLO model from scratch
        model = YOLO("yolo11n.yaml")

        # Load a pretrained YOLO model (recommended for training)
        model = YOLO("yolo11n.pt")

        # Train the model using the 'coco8.yaml' dataset for 3 epochs
        results = model.train(data="coco8.yaml", epochs=3)

        # Evaluate the model's performance on the validation set
        results = model.val()

        # Perform object detection on an image using the model
        results = model("https://ultralytics.com/images/bus.jpg")

        # Export the model to ONNX format
        success = model.export(format="onnx")
    
    # 发布者回调函数
    def test_callback(self):
        msg = String()
        msg.data ='你好世界'
        self.publisher.publish(msg)

def main(args=None):
    rclpy.init(args=args)
    node = test()
    rclpy.spin(node)
    rclpy.shutdown()


2.编译运行

成功运行

五.参考资料

【在此十分感谢小鱼以及鱼香ros社区的贡献】

Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐