机器人视觉课程:
颜色识别与追踪
本章基于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连接机器人
启动机器人并使用NoMachine连接远程桌面。连接方法可参考“1 教程资料 / 1 机器人快速使用指南 / ROSOrin Pro使用手册 / 7.2直连模式连接步骤”。
- 2打开终端
输入指令时严格区分大小写,可以使用“Tab”键补齐关键词。
- 3启动实验
按照所选实验的步骤执行对应命令,不同实验的启动命令请勿混用。
- 4退出并恢复服务
实验结束后,在运行程序的终端按“Ctrl+C”。如果关闭了APP自启服务,再执行以下命令:
sudo systemctl restart start_app_node.service
推荐学习路径
颜色识别路线6.1 颜色视觉基础6.2 颜色识别
颜色追踪路线6.2 颜色识别6.3 颜色追踪
颜色识别容易受到环境光线影响,更换使用环境后建议重新检查并调节颜色阈值。颜色追踪使用鼠标动态取色,无需预设LAB阈值,但应避免画面中出现大面积相近颜色。
6.1 · 颜色视觉基础
LAB颜色阈值工具
本节用于6.2颜色识别。颜色追踪使用鼠标动态取色;只学习颜色追踪时,可以跳过本节。
不同光源会改变物体在画面中的颜色表现。本节使用LAB TOOL筛选目标颜色区域,为后续颜色识别配置稳定参数。
学习目标
- 启动和关闭LAB TOOL。
- 根据当前环境调节已有颜色的LAB阈值。
- 新增识别颜色并保存颜色阈值。
LAB颜色空间简介了解L、A、B三个分量
LAB颜色空间由L、A、B三个分量组成。L表示亮度,A表示从绿色到红色的颜色范围,B表示从蓝色到黄色的颜色范围。LAB TOOL通过设置三个分量的最小值和最大值,筛选需要识别的颜色区域。
调节过程中,目标颜色区域应逐渐显示为白色,其他区域显示为黑色。目标区域越完整、背景干扰越少,颜色识别效果越稳定。
| 颜色分量 | 取值范围 | 对应颜色区间 |
|---|---|---|
| L | 0~255 | 黑—白(-L ~ +L) |
| A | 0~255 | 绿—红(-a ~ +a) |
| B | 0~255 | 蓝—黄(-b ~ +b) |
启动LAB TOOL
- 1连接机器人并打开终端
按照6.0.4连接机器人,然后在远程桌面打开命令行终端。
- 2停止APP自启服务
sudo systemctl stop start_app_node.service- 3启动深度相机节点
相机节点会持续运行,请保留当前终端。
ros2 launch peripherals depth_camera.launch.py- 4在新终端启动LAB TOOL
python3 /home/ubuntu/software/lab_tool/main.py
LAB TOOL界面说明画面显示区与识别调节区

画面显示区(图中1)
左侧为摄像头处理后的画面,右侧为原始画面。若画面无法正常显示,请检查摄像头连接线,必要时重新插拔后再启动相机节点。
识别调节区(图中2)
| 界面控件 | 功能说明 |
|---|---|
![]() | L、A、B滑杆用于调节三个分量。左侧是最小值,右侧是最大值。 |
![]() | 选择需要调节阈值的颜色。 |
![]() | 删除当前选择的颜色。 |
![]() | 增加可识别颜色。 |
![]() | 保存颜色阈值调节结果。 |
![]() | 切换深度相机和单目相机。 |
![]() | 关闭LAB TOOL。 |
调节颜色阈值
- 1选择颜色
在颜色列表中选择需要调节阈值的颜色,下面以红色(red)为例。

- 2恢复完整范围
将L、A、B分量的最小值全部设置为0,最大值全部设置为255。

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



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

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

进阶:新增识别颜色以黄色(yellow)为例
- 1点击“新增颜色”

- 2填写颜色名称
在“name”一栏填写
yellow,然后点击“确定”。
- 3选择新增颜色

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


- 5保存新增颜色

保存与退出
- 1保存颜色阈值
点击识别调节区的“保存设置”。
- 2关闭LAB TOOL
点击右下角“关闭软件”。

- 3关闭相机节点
回到启动相机节点的终端,按“Ctrl+C”。
- 4恢复APP自启服务
服务恢复后,机械臂会回到初始位置。
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
颜色识别
开始实验前,建议先完成6.1颜色视觉基础。
将红、绿、蓝物体依次放置在摄像头前,程序会使用对应颜色的圆圈标记目标,并在画面左下角显示颜色名称。

实验目标
- 启动深度相机和颜色识别程序。
- 完成红、绿、蓝三种颜色的物体识别。
- 根据画面标记和颜色名称判断结果是否正确。
实验准备
- 按照6.0.4完成机器人连接。
- 准备红、绿、蓝三种颜色明显的物体。
- 建议先完成6.1 LAB颜色阈值工具。
- 移除视野内颜色相近的物体,减少背景干扰。
开始实验
- 1打开命令行终端
- 2停止APP自启服务
sudo systemctl stop start_app_node.service- 3启动深度相机节点
保留当前终端,节点会持续运行。
ros2 launch peripherals depth_camera.launch.py- 4在新终端启动颜色识别程序
程序启动后,桌面会显示实时摄像头画面。
cd ~/ros2_ws/src/example/example/color_detect
python3 color_detect_demo.py查看实验结果
- 1测试红色物体
观察物体周围的圆圈和左下角颜色名称。
- 2依次更换绿色和蓝色物体
确认识别结果会随物体颜色变化。
- 3改变物体距离
缓慢移动物体,观察程序能够稳定识别的范围。
| 测试物体 | 正确画面标记 | 颜色名称 |
|---|---|---|
| 红色物体 | 红色圆圈 | Color: red |
| 绿色物体 | 绿色圆圈 | Color: green |
| 蓝色物体 | 蓝色圆圈 | Color: blue |
成功判定圆圈颜色和画面左下角的颜色名称均与物体一致。
结束实验
- 1停止颜色识别
在颜色识别程序终端按“Ctrl+C”。
- 2关闭相机节点
在相机节点终端按“Ctrl+C”。
- 3恢复APP自启服务
sudo systemctl restart start_app_node.service完成标准
- 红、绿、蓝物体均显示正确的圆圈和颜色名称。
- 更换物体后,识别结果随目标颜色正确变化。
- 背景不会被持续识别为目标物体。
- 能够独立停止程序、关闭相机并恢复APP服务。
遇到问题?查看颜色识别排查方法
- 没有相机画面:检查连接线,并确认相机节点没有报错。
- 颜色名称错误:返回6.1,根据当前光线重新调节LAB阈值。
- 背景被识别为目标:移除相近颜色干扰物,并重新调节阈值。
- APP功能没有恢复:重新执行服务恢复命令,或重启机器人。
6.3 · 实验2
颜色追踪
本实验通过鼠标点击画面动态取色,机器人会根据目标在画面中的位置调整行驶方向和前后距离。无需预先调节6.1中的LAB阈值,建议先完成6.2颜色识别。

实验目标
- 启动颜色追踪功能并进入追踪状态。
- 使用鼠标选取需要追踪的颜色。
- 控制机器人开始、暂停和恢复追踪。
- 根据画面标记和机器人运动判断追踪是否正常。
实验准备
- 按照6.0.4连接机器人远程桌面。
- 准备一个颜色明显的红色物块。
- 将机器人放在平整、开阔的地面并清除障碍物。
- 移除视野内大面积红色或相近颜色物体。
- 建议先完成6.2颜色识别。
启动追踪后机器人会自动移动。请保持安全距离,并确保可以立即回到launch终端按“Ctrl+C”退出。
开始追踪
- 1打开终端
- 2启动目标追踪、相机和底盘控制节点
当前终端需要保持运行。
ros2 launch app object_tracking_node.launch.py debug:=true- 3在新终端进入目标追踪功能
成功后返回
success: true,桌面随后显示实时画面。
ros2 service call /object_tracking/enter std_srvs/srv/Trigger {}- 4鼠标左键点击红色物块
点击物块中间颜色均匀的位置。出现彩色圆圈和黄色目标点后,说明取色成功;此时机器人尚未移动。
- 5确认安全后启动追踪
服务返回
success: true后,机器人开始自动移动。
ros2 service call /object_tracking/set_running std_srvs/srv/SetBool "{data: True}"查看实验结果
- 1左右移动物块
观察机器人是否转向目标所在方向。
- 2改变物块距离
观察机器人是否向前或向后调整位置。
- 3停止移动物块
观察目标接近黄色点后,机器人是否停止或只进行小幅调整。
| 测试动作 | 正确结果 |
|---|---|
| 左右移动红色物块 | 彩色圆圈跟随物块,机器人向目标方向转动。 |
| 改变物块距离 | 机器人向前或向后调整位置。 |
| 物块回到黄色点附近 | 机器人停止或仅进行小幅调整。 |
| 目标暂时离开画面 | 机器人停止运动,重新取色后可继续追踪。 |
程序比较彩色圆圈中心与黄色目标点的位置偏差,并通过控制器调整运动。偏差越大,调整越明显;接近目标点后,运动逐渐停止。
核心进阶实验:调整追踪参数
通过实际修改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在launch终端按“Ctrl+C”
确认机器人已经停止。
- 2进入目录并备份原程序
cd ~/ros2_ws/src/app/app
cp -n object_tracking.py object_tracking.py.bak参数测试期间请保留object_tracking.py.bak,不要修改或删除。
- 3打开颜色追踪程序
gedit object_tracking.py修改后按“Ctrl+S”保存并关闭编辑器。当前设备使用源码运行方式,无需执行colcon build;重新按照6.3.4启动即可生效。
6.3.6.2 转向比例系数 pid_yaw比较左右跟随速度
pid_yaw控制左右跟随目标的响应速度,默认值如下:
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控制前进和后退的响应速度,默认值如下:
self.pid_dist = pid.PID(0.002, 0.0, 0.0)| pid_dist | 追踪效果 |
|---|---|
0.001 | 前后响应较慢,运动平缓。 |
0.002 | 默认值,速度和稳定性较均衡。 |
0.003 | 前进、后退响应较快。 |
6.3.6.4 画面死区比较灵敏度、抖动与误差
目标偏离黄色点超过死区后,机器人开始调整。左右和前后死区的默认值均为20像素。
if abs(x - self.x_stop) > 20:if abs(y - self.y_stop) > 20:| 画面死区 | 追踪效果 |
|---|---|
5像素 | 更灵敏,但容易抖动。 |
20像素 | 默认值,灵敏度和稳定性较均衡。 |
40像素 | 更加稳定,但允许更大位置误差。 |
- 1先测试左右死区
只修改x方向,保持y方向为20。
- 2恢复后再测试前后死区
恢复x方向默认值,再修改y方向。
不要同时修改两个方向的死区,否则无法判断变化由哪个参数引起。
6.3.6.5 记录实验结果
每次测试使用相同的物块、起点、移动距离和速度,然后填写记录:
| 参数 | 测试值 | 响应速度 | 摆动/抖动 | 最终误差 | 结论 |
|---|---|---|---|---|---|
pid_yaw | 0.001 / 0.006 / 0.012 | ||||
pid_dist | 0.001 / 0.002 / 0.003 | ||||
| 左右转向死区 | 5 / 20 / 40像素 | ||||
| 前后距离死区 | 5 / 20 / 40像素 |
选择一组响应较快、不会持续摆动且最终误差可接受的参数,并说明理由。
6.3.6.6 恢复默认程序实验结束后必须完成
在launch终端按“Ctrl+C”并确认机器人停止,然后恢复备份:
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”。






