机器人视觉课程 ROSOrin 实战课
阅读进度 0%
课程导读6.0

机器人视觉课程:
颜色识别与追踪

本章基于ROS2和OpenCV介绍机器人的颜色视觉功能。你可以按课程顺序完成颜色阈值标定、三色识别和闭环目标追踪,也可以根据需要选择对应实验。

预计总时长
90~120分钟
课程难度
入门 / 进阶
适用设备
ROSOrin Mecanum Pro
实机核验
2026-07-17
验证环境Ubuntu 22.04.5 LTS、ROS2、V1.0.0、App_ROS2_1.0
软件版本日期2026-05-25
建议基础能够使用NoMachine和命令行终端,无需OpenCV编程经验
课程产出颜色阈值配置、颜色识别结果、颜色追踪参数实验记录

完成本单元后,你可以

  • 使用LAB TOOL调节并保存目标颜色阈值。
  • 识别红、绿、蓝三种颜色并判断结果是否正确。
  • 通过鼠标取色让机器人追踪指定目标。
  • 记录PID和画面死区对追踪速度、摆动与误差的影响。

课程安排

课程内容难度预计时间前置内容说明
6.1 LAB颜色阈值工具入门20~30分钟6.0课程导读调节并保存颜色阈值
6.2 实验1:颜色识别入门15~20分钟建议完成6.1识别红、绿、蓝三种颜色
6.3 实验2:颜色追踪入门/进阶20~30分钟;参数实验约30分钟建议完成6.2鼠标动态取色并调节追踪参数

实验前准备

  • 已正常启动的机器人和深度相机。
  • 安装有NoMachine远程控制软件的电脑。
  • ROS2工作空间、OpenCV及本章实验程序。
  • 用于颜色识别和追踪的红、绿、蓝物体。

通用启动与退出方法

  1. 1
    连接机器人

    启动机器人并使用NoMachine连接远程桌面。连接方法可参考“1 教程资料 / 1 机器人快速使用指南 / ROSOrin Pro使用手册 / 7.2直连模式连接步骤”。

  2. 2
    打开终端

    输入指令时严格区分大小写,可以使用“Tab”键补齐关键词。

  3. 3
    启动实验

    按照所选实验的步骤执行对应命令,不同实验的启动命令请勿混用。

  4. 4
    退出并恢复服务

    实验结束后,在运行程序的终端按“Ctrl+C”。如果关闭了APP自启服务,再执行以下命令:

Terminal
sudo systemctl restart start_app_node.service

推荐学习路径

颜色识别路线6.1 颜色视觉基础6.2 颜色识别

颜色追踪路线6.2 颜色识别6.3 颜色追踪

光线与阈值

颜色识别容易受到环境光线影响,更换使用环境后建议重新检查并调节颜色阈值。颜色追踪使用鼠标动态取色,无需预设LAB阈值,但应避免画面中出现大面积相近颜色。

6.1 · 颜色视觉基础

LAB颜色阈值工具

入门 · 20~30分钟
适用范围

本节用于6.2颜色识别。颜色追踪使用鼠标动态取色;只学习颜色追踪时,可以跳过本节。

不同光源会改变物体在画面中的颜色表现。本节使用LAB TOOL筛选目标颜色区域,为后续颜色识别配置稳定参数。

学习目标

  • 启动和关闭LAB TOOL。
  • 根据当前环境调节已有颜色的LAB阈值。
  • 新增识别颜色并保存颜色阈值。
LAB颜色空间简介了解L、A、B三个分量

LAB颜色空间由L、A、B三个分量组成。L表示亮度,A表示从绿色到红色的颜色范围,B表示从蓝色到黄色的颜色范围。LAB TOOL通过设置三个分量的最小值和最大值,筛选需要识别的颜色区域。

调节过程中,目标颜色区域应逐渐显示为白色,其他区域显示为黑色。目标区域越完整、背景干扰越少,颜色识别效果越稳定。

颜色分量取值范围对应颜色区间
L0~255黑—白(-L ~ +L)
A0~255绿—红(-a ~ +a)
B0~255蓝—黄(-b ~ +b)

启动LAB TOOL

  1. 1
    连接机器人并打开终端

    按照6.0.4连接机器人,然后在远程桌面打开命令行终端。

  2. 2
    停止APP自启服务
Terminal 1
sudo systemctl stop start_app_node.service
  1. 3
    启动深度相机节点

    相机节点会持续运行,请保留当前终端。

Terminal 1
ros2 launch peripherals depth_camera.launch.py
  1. 4
    在新终端启动LAB TOOL
Terminal 2
python3 /home/ubuntu/software/lab_tool/main.py
LAB TOOL启动成功后的完整界面
LAB TOOL启动成功后的完整界面
LAB TOOL界面说明画面显示区与识别调节区
LAB TOOL画面显示区和识别调节区
图中1为画面显示区,图中2为识别调节区

画面显示区(图中1)

左侧为摄像头处理后的画面,右侧为原始画面。若画面无法正常显示,请检查摄像头连接线,必要时重新插拔后再启动相机节点。

识别调节区(图中2)

界面控件功能说明
LAB分量滑杆L、A、B滑杆用于调节三个分量。左侧是最小值,右侧是最大值。
颜色列表选择需要调节阈值的颜色。
删除颜色按钮删除当前选择的颜色。
新增颜色按钮增加可识别颜色。
保存设置按钮保存颜色阈值调节结果。
相机切换按钮切换深度相机和单目相机。
关闭软件按钮关闭LAB TOOL。

调节颜色阈值

  1. 1
    选择颜色

    在颜色列表中选择需要调节阈值的颜色,下面以红色(red)为例。

    在LAB TOOL选择红色
  2. 2
    恢复完整范围

    将L、A、B分量的最小值全部设置为0,最大值全部设置为255。

    将LAB范围恢复为0到255
  3. 3
    缩小目标颜色区间

    将物体放入摄像头视野,参考LAB颜色空间分布图向目标区间调整。红色靠近“+a”,保持A最大值不变并逐步增大A最小值,直到目标变白、其他区域变黑。

    LAB颜色空间分布图
    调整红色A分量阈值
    红色目标区域显示为白色
  4. 4
    调整亮度与冷暖

    根据环境调整L、B分量。红色偏浅时增大L最小值,偏深时减小L最大值;偏暖时增大B最小值,偏冷时减小B最大值。

    调整LAB的L和B分量
  5. 5
    保存设置

    确认目标区域完整、背景干扰较少后,点击“保存设置”。

    保存LAB颜色阈值
进阶:新增识别颜色以黄色(yellow)为例
  1. 1
    点击“新增颜色”
    点击LAB TOOL新增颜色
  2. 2
    填写颜色名称

    在“name”一栏填写yellow,然后点击“确定”。

    填写新增颜色名称
  3. 3
    选择新增颜色
    在颜色列表选择黄色
  4. 4
    调节阈值

    拖动L、A、B滑杆,直到黄色物体在处理画面中变为白色,其他区域保持黑色。具体方法与6.1.5相同。

    调节黄色LAB阈值
    黄色目标处理结果
  5. 5
    保存新增颜色
    保存新增黄色阈值

保存与退出

  1. 1
    保存颜色阈值

    点击识别调节区的“保存设置”。

  2. 2
    关闭LAB TOOL

    点击右下角“关闭软件”。

    LAB TOOL关闭软件按钮
  3. 3
    关闭相机节点

    回到启动相机节点的终端,按“Ctrl+C”。

  4. 4
    恢复APP自启服务

    服务恢复后,机械臂会回到初始位置。

Terminal
sudo systemctl restart start_app_node.service
不要遗漏服务恢复

未恢复APP自启服务会影响APP玩法。若没有手动恢复,重新启动机器人也会恢复该服务。

完成标准

  • 目标颜色完整显示为白色,背景大部分区域保持黑色。
  • 阈值已经保存,重新打开LAB TOOL后仍可使用。
  • LAB TOOL和相机节点已经关闭,APP自启服务已经恢复。
遇到问题?查看LAB TOOL排查方法
  • 没有相机画面:检查深度相机连接线,必要时重新插拔后再启动相机节点。
  • 目标颜色区域不完整:将L、A、B恢复到0~255,再根据当前光线逐步缩小范围。
  • 背景出现较多白色区域:移除相近颜色物体,并继续缩小对应分量范围。
  • 退出后APP玩法无法运行:执行服务恢复命令,或重新启动机器人。

6.2 · 实验1

颜色识别

入门 · 15~20分钟
使用LAB颜色阈值

开始实验前,建议先完成6.1颜色视觉基础。

将红、绿、蓝物体依次放置在摄像头前,程序会使用对应颜色的圆圈标记目标,并在画面左下角显示颜色名称。

颜色识别实验效果
识别成功时,目标周围显示对应颜色的圆圈

实验目标

  • 启动深度相机和颜色识别程序。
  • 完成红、绿、蓝三种颜色的物体识别。
  • 根据画面标记和颜色名称判断结果是否正确。

实验准备

  • 按照6.0.4完成机器人连接。
  • 准备红、绿、蓝三种颜色明显的物体。
  • 建议先完成6.1 LAB颜色阈值工具。
  • 移除视野内颜色相近的物体,减少背景干扰。

开始实验

  1. 1
    打开命令行终端
  2. 2
    停止APP自启服务
Terminal 1
sudo systemctl stop start_app_node.service
  1. 3
    启动深度相机节点

    保留当前终端,节点会持续运行。

Terminal 1
ros2 launch peripherals depth_camera.launch.py
  1. 4
    在新终端启动颜色识别程序

    程序启动后,桌面会显示实时摄像头画面。

Terminal 2
cd ~/ros2_ws/src/example/example/color_detect
python3 color_detect_demo.py

查看实验结果

  1. 1
    测试红色物体

    观察物体周围的圆圈和左下角颜色名称。

  2. 2
    依次更换绿色和蓝色物体

    确认识别结果会随物体颜色变化。

  3. 3
    改变物体距离

    缓慢移动物体,观察程序能够稳定识别的范围。

测试物体正确画面标记颜色名称
红色物体红色圆圈Color: red
绿色物体绿色圆圈Color: green
蓝色物体蓝色圆圈Color: blue

成功判定圆圈颜色和画面左下角的颜色名称均与物体一致。

结束实验

  1. 1
    停止颜色识别

    在颜色识别程序终端按“Ctrl+C”。

  2. 2
    关闭相机节点

    在相机节点终端按“Ctrl+C”。

  3. 3
    恢复APP自启服务
Terminal
sudo systemctl restart start_app_node.service

完成标准

  • 红、绿、蓝物体均显示正确的圆圈和颜色名称。
  • 更换物体后,识别结果随目标颜色正确变化。
  • 背景不会被持续识别为目标物体。
  • 能够独立停止程序、关闭相机并恢复APP服务。
遇到问题?查看颜色识别排查方法
  • 没有相机画面:检查连接线,并确认相机节点没有报错。
  • 颜色名称错误:返回6.1,根据当前光线重新调节LAB阈值。
  • 背景被识别为目标:移除相近颜色干扰物,并重新调节阈值。
  • APP功能没有恢复:重新执行服务恢复命令,或重启机器人。

6.3 · 实验2

颜色追踪

入门/进阶 · 20~60分钟

本实验通过鼠标点击画面动态取色,机器人会根据目标在画面中的位置调整行驶方向和前后距离。无需预先调节6.1中的LAB阈值,建议先完成6.2颜色识别。

颜色追踪实验中被圆圈标记的红色物块
彩色圆圈表示当前目标,黄色圆点表示机器人希望目标保持的位置

实验目标

  • 启动颜色追踪功能并进入追踪状态。
  • 使用鼠标选取需要追踪的颜色。
  • 控制机器人开始、暂停和恢复追踪。
  • 根据画面标记和机器人运动判断追踪是否正常。

实验准备

  • 按照6.0.4连接机器人远程桌面。
  • 准备一个颜色明显的红色物块。
  • 将机器人放在平整、开阔的地面并清除障碍物。
  • 移除视野内大面积红色或相近颜色物体。
  • 建议先完成6.2颜色识别。
运动安全

启动追踪后机器人会自动移动。请保持安全距离,并确保可以立即回到launch终端按“Ctrl+C”退出。

开始追踪

  1. 1
    打开终端
  2. 2
    启动目标追踪、相机和底盘控制节点

    当前终端需要保持运行。

Terminal 1
ros2 launch app object_tracking_node.launch.py debug:=true
  1. 3
    在新终端进入目标追踪功能

    成功后返回success: true,桌面随后显示实时画面。

Terminal 2
ros2 service call /object_tracking/enter std_srvs/srv/Trigger {}
  1. 4
    鼠标左键点击红色物块

    点击物块中间颜色均匀的位置。出现彩色圆圈和黄色目标点后,说明取色成功;此时机器人尚未移动。

  2. 5
    确认安全后启动追踪

    服务返回success: true后,机器人开始自动移动。

Terminal 2
ros2 service call /object_tracking/set_running std_srvs/srv/SetBool "{data: True}"

查看实验结果

  1. 1
    左右移动物块

    观察机器人是否转向目标所在方向。

  2. 2
    改变物块距离

    观察机器人是否向前或向后调整位置。

  3. 3
    停止移动物块

    观察目标接近黄色点后,机器人是否停止或只进行小幅调整。

测试动作正确结果
左右移动红色物块彩色圆圈跟随物块,机器人向目标方向转动。
改变物块距离机器人向前或向后调整位置。
物块回到黄色点附近机器人停止或仅进行小幅调整。
目标暂时离开画面机器人停止运动,重新取色后可继续追踪。

程序比较彩色圆圈中心与黄色目标点的位置偏差,并通过控制器调整运动。偏差越大,调整越明显;接近目标点后,运动逐渐停止。

课程重点

核心进阶实验:调整追踪参数

约30分钟

通过实际修改PID和画面死区,观察追踪速度、摆动和稳定性的变化。这是本课程从“运行功能”进入“理解机器人控制”的关键实验。

需要修改的颜色追踪程序:

/home/ubuntu/ros2_ws/src/app/app/object_tracking.py
实验参数主要影响测试值重点观察
pid_yaw左右转向响应0.001 / 0.006 / 0.012转向速度、来回摆动
pid_dist前进和后退响应0.001 / 0.002 / 0.003距离调整速度
画面死区触发调整的偏差范围5 / 20 / 40像素灵敏度、抖动、位置误差
修改前先停止并备份

每次只改一个参数,完成一组测试后恢复默认值,再测试下一个参数。

6.3.6.1 实验准备:备份并打开程序必须先完成
  1. 1
    在launch终端按“Ctrl+C”

    确认机器人已经停止。

  2. 2
    进入目录并备份原程序
Terminal
cd ~/ros2_ws/src/app/app
cp -n object_tracking.py object_tracking.py.bak

参数测试期间请保留object_tracking.py.bak,不要修改或删除。

  1. 3
    打开颜色追踪程序
Terminal
gedit object_tracking.py

修改后按“Ctrl+S”保存并关闭编辑器。当前设备使用源码运行方式,无需执行colcon build;重新按照6.3.4启动即可生效。

6.3.6.2 转向比例系数 pid_yaw比较左右跟随速度

pid_yaw控制左右跟随目标的响应速度,默认值如下:

Python
self.pid_yaw = pid.PID(0.006, 0.0, 0.0)
pid_yaw追踪效果
0.001左右转向较慢,跟随平缓。
0.006默认值,速度和稳定性较均衡。
0.012响应较快,过大时容易来回摆动。
6.3.6.3 距离比例系数 pid_dist比较前后调整速度

pid_dist控制前进和后退的响应速度,默认值如下:

Python
self.pid_dist = pid.PID(0.002, 0.0, 0.0)
pid_dist追踪效果
0.001前后响应较慢,运动平缓。
0.002默认值,速度和稳定性较均衡。
0.003前进、后退响应较快。
6.3.6.4 画面死区比较灵敏度、抖动与误差

目标偏离黄色点超过死区后,机器人开始调整。左右和前后死区的默认值均为20像素。

Python · 左右
if abs(x - self.x_stop) > 20:
Python · 前后
if abs(y - self.y_stop) > 20:
画面死区追踪效果
5像素更灵敏,但容易抖动。
20像素默认值,灵敏度和稳定性较均衡。
40像素更加稳定,但允许更大位置误差。
  1. 1
    先测试左右死区

    只修改x方向,保持y方向为20。

  2. 2
    恢复后再测试前后死区

    恢复x方向默认值,再修改y方向。

控制变量

不要同时修改两个方向的死区,否则无法判断变化由哪个参数引起。

6.3.6.5 记录实验结果

每次测试使用相同的物块、起点、移动距离和速度,然后填写记录:

参数测试值响应速度摆动/抖动最终误差结论
pid_yaw0.001 / 0.006 / 0.012
pid_dist0.001 / 0.002 / 0.003
左右转向死区5 / 20 / 40像素
前后距离死区5 / 20 / 40像素

选择一组响应较快、不会持续摆动且最终误差可接受的参数,并说明理由。

6.3.6.6 恢复默认程序实验结束后必须完成

在launch终端按“Ctrl+C”并确认机器人停止,然后恢复备份:

Terminal
cd ~/ros2_ws/src/app/app
cp object_tracking.py.bak object_tracking.py
cmp -s object_tracking.py object_tracking.py.bak && echo "默认程序恢复成功"

终端显示“默认程序恢复成功”后,重新启动追踪功能并确认默认参数工作正常。

结束实验

返回运行launch指令的命令行终端,按“Ctrl+C”退出。目标追踪、相机和底盘控制节点会同时关闭,确认机器人停止运动即可。

完成标准

  • 鼠标取色后,彩色圆圈能够持续标记目标。
  • 左右移动物块时机器人能够转向,改变距离时能够前进或后退。
  • 目标接近黄色点后,机器人停止或仅小幅调整。
  • 能够在launch终端使用“Ctrl+C”安全退出。
  • 完成进阶参数实验后,已经填写记录并恢复默认程序。
遇到问题?查看颜色追踪排查方法
  • 没有摄像头画面:确认launch命令包含debug:=true,并确认enter服务成功。
  • 点击后没有圆圈:点击物块中间颜色均匀的位置,避开阴影、反光和相近背景。
  • 识别成功但机器人不移动:确认set_running的数据为True
  • 追踪错误目标:先停止运动,再重新点击正确物块取色。
  • 机器人运动异常:立即回到launch终端按“Ctrl+C”。