!一命速通!Ubuntu24.04+ROS2+Yolo检测|保姆级教程
目录
准备工作
配置虚拟机
下载镜像
创建并设置虚拟机
安装开发工具
open-vm-tools-desktop
Terminator
Gedit
美化Terminator外观(可跳过)
安装ROS2
UTF-8编码设置
添加开发工具和仓库
测试ROS2
配置摄像头及可视化工具
安装usb_cam
安装rqt_image_view
安装yolov5_ros2
创建环境
配置依赖
创建image_yuv_to_bgr
编译运行
安装colcon
添加虚拟环境的site-packages到环境变量(如果不是在虚拟环境中可以跳过该步)
运行
扩展功能
参考文章
准备工作
确保你电脑上装有vmware,并且磁盘空间有至少40G
配置虚拟机
下载镜像
我使用的是ubuntu24.04,其他版本20.04,22.04都是可以使用的,更换镜像即可
预下载ubuntu24.04光盘映像,推荐使用USTC中科大源(速度最快),下载慢的可以换其他源
中科大:https://mirrors.ustc.edu.cn/ubuntu-releases/24.04/
阿里云:https://mirrors.aliyun.com/ubuntu-releases/24.04/
华为云:https://mirrors.huaweicloud.com/ubuntu-releases/24.04/
网易云:http://mirrors.163.com/ubuntu-releases/24.04/
下载ubuntu-24.04.2-desktop-amd64.iso
移动到非系统盘的其他文件夹,我放到了H:mirror下
创建并设置虚拟机
打开vmware
这里我用的有线连接,WiFi联网参考:VMware Ubuntu系统无线连接攻略:轻松解决无线联网难题 - 云原生实践
等待安装完成并重启
vmware顶部选卡>>虚拟机>>设置>>USB控制器>>USB兼容性>>USB 3.1>>确定保存
安装开发工具
open-vm-tools-desktop
在ubuntu桌面按Ctrl+Alt+T打开终端,并输入
sudo apt-get install open-vm-tools-desktop cloud-init
输入reboot重启虚拟机
重启完成后可以在终端使用Ctrl+Shift+C和Ctrl+Shift+V在虚拟机和物理机之间复制粘贴,并且你的虚拟机界面自动适应了你的屏幕,如果没有适应在vmware顶部选卡>>虚拟机>>设置>>显示器>>显示缩放比例>>取消勾选拉伸模式>>确定保存
Terminator
打开终端,输入
sudo apt-get install terminator
输入y确认,安装完成后关闭当前终端重新打开后可以使用快捷键
Ctrl+Shift+E 水平分割
Ctrl+Shift+O 垂直分割
Ctrl+Shift+W 关闭终端
老版本ubuntu会有快捷键冲突问题,在终端输入
ibus-setup
在弹出的选项卡中选择表情符号删除冲突的快捷键即可
Gedit
gedit文本编辑器
sudo apt-get install gedit
美化Terminator外观(可跳过)
mkdir ~/.config/terminator
touch config
sudo gedit ~/.config/terminator/config
在弹出的配置文件中粘贴以下内容并保存退出,忽略报错
[global_config]
geometry_hinting = False
handle_size = 1
inactive_color_offset = 1.0
title_font = mry_KacstQurn Bold 11
title_hide_sizetext = True
[keybindings]
[layouts]
[[default]]
[[[child1]]]
parent = window0
profile = default
type = Terminal
[[[window0]]]
parent = ""
type = Window
[plugins]
[profiles]
[[default]]
background_image = None
cursor_color = "#3036ec"
custom_command = tmux
font = Ubuntu Mono 13
foreground_color = "#ffffff"
login_shell = True
show_titlebar = False
use_system_font = False
重启终端可以看到美化后的界面
安装ROS2
sudo apt update
sudo apt upgrade
如果需要重启就重启虚拟机
UTF-8编码设置
locale # check for UTF-8
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8
locale # verify settings
添加开发工具和仓库
本节参考ROS仓库GPG签名密钥过期问题_ros 2 gpg 密钥过期-CSDN博客
sudo apt install software-properties-common
sudo add-apt-repository universe
https://raw.githubusercontent.com/ros/rosdistro/master/ros.key
在虚拟机的火狐浏览器中输入上述链接下载密钥,无法打开的可以使用下面我的网盘文件
https://pan.quark.cn/s/9c2edb1cffd5
把下载好的ros.key放到主文件夹/home下,然后运行
mv ~/ros.key ~/ros.key.bak
gpg --dearmor ~/ros.key.bak
sudo mv ~/ros.key.bak.gpg /usr/share/keyrings/ros-archive-keyring.gpg
修改源列表更新密钥
sudo gedit /etc/apt/sources.list.d/ros-latest.list
添加下列内容后保存关闭
deb [signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros/ubuntu focal main
deb [signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu focal main
添加ROS软件源
echo "deb [signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu focal main" | sudo tee /etc/apt/sources.list.d/ros-latest.list
检查ROS源
ls -l /etc/apt/sources.list.d/ros-*
正确的配置是只存在一个ros源,如下
如果存在多个,则保留ros-latest.list,删除其余文件,执行
sudo rm /etc/apt/sources.list.d/ros-fish.list
之后更新索引,安装ros2,ubuntu24.04使用jazzy,其他ubuntu版本将jazzy替换对应的ros2版本
参考ROS2 和Ubuntu 版本对应关系_ros2版本与ubuntu对应版本-CSDN博客
sudo apt update
sudo apt upgrade
sudo apt install ros-jazzy-desktop
安装时间较长,耐心等待
测试ROS2
每次运行ros时都要执行下述命令
source /opt/ros/jazzy/setup.bash
永久生效可以参考ROS 永久设置source的方法_ros source-CSDN博客
下面运行示例,打开一个终端运行
source /opt/ros/jazzy/setup.bash
ros2 run demo_nodes_cpp talker
打开另一个终端运行
source /opt/ros/jazzy/setup.bash
ros2 run demo_nodes_py listener
出现下面输出则表示ros2安装成功
也可以查看$ROS_DISTRO环境变量确认是否安装成功,运行
echo $ROS_DISTRO
会输出你的ros2的发行版名称
配置摄像头及可视化工具
安装usb_cam
使用usb_cam可以通过ros发布你的摄像头节点,直接复制下面命令运行,会自动匹配你的ros版本
sudo apt-get install ros-$ROS_DISTRO-usb-cam
在你的物理机中打开摄像头,我用的是笔记本,直接打开自带的<相机>
点击连接,看到虚拟机右下角的视频图标有绿点,并且物理机中找不到相机,表示连接成功
运行
ros2 run usb_cam usb_cam_node_exe
看到摄像头指示灯亮起表示运行成功,不要关闭当前终端,打开新终端进行下一步
安装rqt_image_view
rqt_image_view可以将图像话题可视化显示,默认是安装好的,没有则执行
sudo apt install ros-$ROS_DISTRO-rqt-image-view
查看当前的ros话题
ros2 topic list
话题名称 | 说明 |
---|---|
/camera_info | 发布相机的内参信息(如焦距、主点、畸变参数),由消息类型 sensor_msgs/msg/CameraInfo 表示。常用于图像处理、3D重建、校正等应用。 |
/image_raw | 原始图像数据,通常是未经压缩的帧图,类型为 sensor_msgs/msg/Image 。这是真正的图像流。 |
/image_raw/compressed | 对 /image_raw 图像进行压缩后的版本,通常使用 JPEG 格式,传输更快但失真。适合网络传输或远程调试。 |
/image_raw/compressedDepth | 若图像为深度图(depth image),这是其压缩版本。格式可能为 PNG + zlib 压缩,用于降低带宽开销。 |
/image_raw/theora | 使用 Theora 视频编解码器压缩的图像流(类似视频编码方式),适合直播场景。现在很少使用。 |
/image_raw/zstd | 用 Zstandard 算法压缩的图像流,是 ROS 2 支持的一种新型压缩方式。比 compressed 更高效,延迟更低。 |
启动rqt_image_view
rqt_image_view
如果提示找不到rqt_image_view:未找到命令则直接运行rqt
rqt
点击菜单:Plugins -> Visualization -> Image View 这和 rqt_image_view 是一样的功能
下拉选择你要查看的话题
查看/image_raw会比较卡顿,切换/image_raw/zstd较为流畅
Ctrl+C终止usb_cam和rqt进程,关闭终端
安装yolov5_ros2
创建环境
不使用虚拟环境直接安装依赖会报错,因为是因为 Ubuntu 23.04开始默认启用了 PEP 668,限制了直接使用 pip 安装 Python 包到系统路径,目的是防止破坏系统自带的 Python 安装。使用23.04以下的版本可以正常运行无需创建环境。
也可以不使用虚拟环境强制进行pip安装,参考
如何修复 Ubuntu 24.04 中的 Python Pip 安装错误
sudo apt install python3-venv python3-full -y
python3 -m venv ~/yoloenv
soure ~/yoloenv/bin/activate
使用鱼香大佬的github项目https://github.com/fishros/yolov5_ros2
配置依赖
sudo apt update
sudo apt install python3-pip ros-$ROS_DISTRO-vision-msgs
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple yolov5
等待下载的同时,打开新终端安装git用于克隆项目
sudo apt install git
创建工作空间并下载
mkdir -p yolov5_ws/src
cd yolov5_ws/src
git clone https://github.com/fishros/yolov5_ros2.git
等待下载完成和之前的yolov5依赖安装完成
创建image_yuv_to_bgr
由于usb_cam中节点/image_raw的图像格式为yuv422_yuy2,而yolov5的输入图像格式为bgr8,这里我创建一个新节点用于转换格式并发布bgr8格式的图像话题
cd ~/yolov5_ws/src
ros2 pkg create image_yuv_to_bgr --build-type ament_python --dependencies rclpy sensor_msgs cv_bridge
添加converter.py
touch ~/yolov5_ws/src/image_yuv_to_bgr/image_yuv_to_bgr/converter.py
gedit ~/yolov5_ws/src/image_yuv_to_bgr/image_yuv_to_bgr/converter.py
粘贴内容并保存退出
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
class YUVToBGRNode(Node):
def __init__(self):
super().__init__('yuv_to_bgr_node')
self.bridge = CvBridge()
self.subscription = self.create_subscription(
Image,
'/image_raw',
self.callback,
10
)
self.publisher = self.create_publisher(
Image,
'/image_bgr',
10
)
self.get_logger().info("Node started: converting yuv422_yuy2 to bgr8")
def callback(self, msg):
try:
# 第一步:从 ROS 消息转换为 OpenCV 图像(保留原始编码)
yuyv = self.bridge.imgmsg_to_cv2(msg, desired_encoding='passthrough')
# 第二步:YUYV → BGR(OpenCV 编码转换)
bgr = cv2.cvtColor(yuyv, cv2.COLOR_YUV2BGR_YUY2)
# 第三步:转换回 ROS Image 消息并发布
bgr_msg = self.bridge.cv2_to_imgmsg(bgr, encoding='bgr8')
bgr_msg.header = msg.header
self.publisher.publish(bgr_msg)
except Exception as e:
self.get_logger().error(f"Failed to convert YUY2 to BGR: {e}")
def main(args=None):
rclpy.init(args=args)
node = YUVToBGRNode()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
编辑package.xml
cd ~/yolov5_ws/src/image_yuv_to_bgr
gedit package.xml
粘贴内容保存退出
image_yuv_to_bgr
0.0.1
Convert YUV422 (YUY2) image topic to BGR for ROS2
emboydontsad
Apache-2.0
ament_python
rclpy
sensor_msgs
cv_bridge
python3-opencv
pytest
ament_python
编辑setup.py
gedit setup.py
粘贴内容保存退出
from setuptools import find_packages, setup
package_name = 'image_yuv_to_bgr'
setup(
name=package_name,
version='0.0.0',
packages=find_packages(exclude=['test']),
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
],
install_requires=['setuptools'],
zip_safe=True,
maintainer='emoboy',
maintainer_email='emoboy@todo.todo',
description='Convert YUV422 (YUY2) image topic to RGB for ROS2',
license='Apache-2.0',
tests_require=['pytest'],
entry_points={
'console_scripts': [
'convert_yuv_to_bgr = image_yuv_to_bgr.converter:main',
],
},
)
编译运行
安装colcon
sudo apt install colcon
编译
cd ~/yolov5_ws
colcon build
source install/setup.bash
添加虚拟环境的site-packages到环境变量(如果不是在虚拟环境中可以跳过该步)
which python
观察输出,我的输出是
执行
echo 'export PYTHONPATH=/home/emoboy/yoloenv/lib/python3.12/site-packages:$PYTHONPATH' >> ~/.bashrc
将上述的site-packages路径替换为自己的实际路径,注意pytho版本
运行
Ctrl+Alt+T打开终端,分成三个子窗格
在【1】中启动摄像头节点,运行
source ~/yolov5_ws/install/setup.bash
ros2 run usb_cam usb_cam_node_exe
在【2】中启动格式转换节点,运行
source ~/yolov5_ws/install/setup.bash
ros2 run image_yuv_to_bgr convert_yuv_to_bgr
在【3】中启动yolov5检测,运行
source ~/yolov5_ws/install/setup.bash
ros2 run yolov5_ros2 yolo_detect_2d --ros-args -p device:=cpu -p image_topic:=/image_bgr -p show_result:=True -p pub_result_img:=True
即可看到yolo检测结果
扩展功能
其余功能参考https://github.com/fishros/yolov5_ros2
参考文章
借鉴了许多大佬的文章
ubantu22与windows相互复制粘贴(详细图文)_ubuntu复制粘贴windows下的-CSDN博客
【ubuntu】20.04下 Ctrl+Shift+E 无法使用 terminator 分屏问题解决_control+shift+e被占用-CSDN博客
ROS学习笔记(四):使用 `ros2 run usb_cam usb_cam_node_exe` 启动 USB 摄像头_ros2 usb cam-CSDN博客
VMware Ubuntu系统无线连接攻略:轻松解决无线联网难题 - 云原生实践
Linux多终端窗口合并以及多窗口分屏式终端_linuxtermianl 合并-CSDN博客
【VMware】宿主机连接wifi,虚拟机中的Linux系统配置连接wifi - OLIVER_QIN - 博客园
ubuntu24.04安装ROS2-CSDN博客
https://github.com/fishros/yolov5_ros2
ubuntu20.04安装ROS2 详细教程-CSDN博客
【ROS】E: Unable to locate package ***_e: unable to locate package ros-kinetic-qt-create-CSDN博客
Ubuntu (deb packages) — ROS 2 Documentation: Jazzy documentation
ROS仓库GPG签名密钥过期问题_ros 2 gpg 密钥过期-CSDN博客
ROS2 和Ubuntu 版本对应关系_ros2版本与ubuntu对应版本-CSDN博客
ROS 永久设置source的方法_ros source-CSDN博客
如何修复 Ubuntu 24.04 中的 Python Pip 安装错误
有torch却显示No module named 'torch' | 鱼香ROS
新手小白,请多指教。