单元 6 · 颜色追踪夹取机器人视觉实战课程

单元 6

6. 颜色追踪夹取

实现目标:学完本节可以,可以通过修改程序实现纯色的袜子的追踪夹取

4个学习部分

6.1 · 颜色追踪夹取

颜色识别

15~20分钟 · 入门

本实验使用摄像头识别红、绿、蓝三种颜色,并在画面中显示识别标记和颜色名称。

预计时间 难度 前置内容
15~20分钟 入门

6.1.1 实验目标

完成本实验后,用户可以:

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

6.1.2 开始实验

  1. 点击系统桌面的图标,打开命令行终端。

  2. 输入以下指令,停止APP自启服务:

Terminal
sudo systemctl stop start_app_node.service
  1. 输入以下指令,启动深度相机节点:
Terminal
ros2 launch peripherals depth_camera.launch.py

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

  1. 新建一个命令行终端,输入以下指令,启动颜色识别程序:
Terminal
cd ~/course_ws/src/color_track_pick/color_track_pick
python3 color_detect.py

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

6.1.3 结果验证

  1. 将红色物体放置在摄像头前,观察物体周围的圆圈和画面左下角的颜色名称。

  2. 依次更换绿色和蓝色物体,观察识别结果是否随物体颜色正确变化。

  3. 缓慢改变物体与摄像头之间的距离,观察程序能够稳定识别的范围。

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

当圆圈颜色和画面左下角的颜色名称均与物体一致,并且更换物体后识别结果能够正确更新时,说明实验完成。

遇到问题?点击查看排查方法

6.1.4 拓展任务:识别新的袜子颜色

准备一只纯色袜子,例如黑色袜子。在现有红、绿、蓝颜色识别的基础上,让程序能够识别袜子的颜色。

思路分析

  1. 使用颜色阈值工具采集袜子的 LAB 颜色范围。
  2. 将新的颜色阈值保存到 lab_config.yaml
  3. 在颜色识别程序中添加新的颜色名称、显示颜色和检测范围。
  4. 重新运行程序,将袜子放置在摄像头前进行测试。
  5. 调整袜子的距离和角度,观察识别结果是否稳定。

6.2 · 颜色追踪夹取

颜色追踪

20~30分钟 · 入门/进阶

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

预计时间 难度 前置内容
20~30分钟;参数实验约30分钟 入门/进阶 建议完成6.1

6.2.1 实验目标

完成本实验后,用户可以:

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

6.2.2 开始实验

  1. 点击系统桌面的终端图标,打开命令行终端。

  2. 输入以下指令,启动目标追踪、深度相机和底盘控制节点:

Terminal
ros2 launch color_track_pick object_tracking_node.launch.py debug:=true

当前命令行终端需要保持运行。

  1. 新建一个命令行终端,输入以下指令进入目标追踪功能:
Terminal
ros2 service call /object_tracking/enter std_srvs/srv/Trigger {}

服务调用成功后会返回success: true,桌面随后显示实时摄像头画面。

  1. 将红色物块放置在摄像头视野内,使用鼠标左键点击物块中间颜色均匀的位置。

取色成功后,画面会使用彩色圆圈标记红色物块,并显示黄色目标点。此时机器人尚未开始移动。

  1. 确认机器人周围没有障碍物后,在命令行终端中输入以下指令,启动机器人追踪:
Terminal
ros2 service call /object_tracking/set_running std_srvs/srv/SetBool "{data: True}"

服务调用成功后会返回success: true,机器人开始根据红色物块的位置自动移动。

6.2.3 结果验证

画面中的彩色圆圈表示当前识别到的目标,黄色圆点表示机器人希望目标保持的位置。

  1. 缓慢向左、向右移动红色物块,观察机器人是否转向目标所在方向。

  2. 缓慢改变红色物块与机器人之间的距离,观察机器人是否向前或向后调整位置。

  3. 停止移动物块,观察机器人是否在目标回到黄色目标点附近后停止调整。

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

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

当彩色圆圈能够持续跟随物块,机器人能够根据目标方向和距离正确调整,并在目标接近黄色点后停止或仅进行小幅调整时,说明基础实验完成。

6.2.4 追踪参数说明(选学)

颜色追踪程序通过比例系数和画面死区控制机器人的响应速度与稳定性。本课程使用默认参数,无需修改程序;下表用于帮助理解不同参数对追踪效果的影响。

参数 默认值 参数增大后的效果 参数减小后的效果
pid_yaw 0.006 调整为0.012时,左右转向响应更快,但可能在目标附近来回摆动。 调整为0.001时,左右转向更加平缓,但跟随速度较慢。
pid_dist 0.002 调整为0.003时,前进、后退响应更快,但可能越过目标位置。 调整为0.001时,前后移动更加平缓,但距离调整较慢。
左右转向死区 20像素 调整为40像素时,机器人转向更稳定,但允许目标产生更大的左右偏差。 调整为5像素时,左右追踪更灵敏,但机器人可能频繁转向或抖动。
前后距离死区 20像素 调整为40像素时,机器人前后运动更稳定,但允许目标产生更大的距离偏差。 调整为5像素时,距离调整更灵敏,但机器人可能频繁前后移动。

6.2.5 拓展任务:追踪纯色袜子

准备一只颜色均匀、与周围环境区别明显的纯色袜子,使用颜色追踪程序完成目标追踪。建议优先使用黑色、黄色、绿色等颜色鲜明的袜子,避免袜子颜色与地面或背景接近。

  1. 输入以下指令暂停机器人运动:
Terminal
ros2 service call /object_tracking/set_running std_srvs/srv/SetBool "{data: False}"
  1. 将袜子放置在摄像头视野内,使用鼠标左键点击袜子上颜色均匀的位置完成取色。

  2. 确认机器人周围没有障碍物后,输入以下指令重新启动追踪:

Terminal
ros2 service call /object_tracking/set_running std_srvs/srv/SetBool "{data: True}"
  1. 缓慢左右移动袜子,观察机器人是否跟随目标转向。

  2. 改变袜子与机器人的距离和角度,观察彩色圆圈能否持续跟随袜子,以及机器人能否正确调整位置。

当彩色圆圈能够持续标记袜子,机器人能够根据袜子的位置和距离调整运动,并在袜子接近黄色目标点后停止或仅进行小幅调整时,说明拓展任务完成。

遇到问题?点击查看排查方法
  • 没有显示摄像头画面:确认launch指令包含debug:=true,并确认enter服务返回成功。
  • 点击物块后没有出现圆圈:点击物块中间颜色均匀的位置,并避免阴影、反光和相近颜色背景。
  • 机器人追踪了错误目标:先暂停运动,再重新点击正确的目标物块进行取色。
  • 机器人运动异常:立即返回运行launch指令的终端并按“Ctrl+C”退出程序。

6.3 · 颜色追踪夹取

颜色追踪夹取

20~30分钟 · 入门/进阶

本实验使用颜色识别结果控制机器人靠近目标,并调用机械臂动作组完成夹取。基础实验使用固定颜色阈值夹取红色目标,进阶实验通过鼠标动态取色夹取其他纯色目标。如果机械臂夹取动作不合适,可查看“6.4.2 机械臂动作编辑(选看)”

预计时间 难度 前置内容
20~30分钟 入门/进阶 建议完成6.2

6.3.1 实验目标

完成本实验后,用户可以:

  • 启动颜色追踪夹取程序。
  • 指定夹取颜色并调用抓取服务,完成红色目标追踪夹取。
  • 使用鼠标动态选取需要夹取的目标颜色。
  • 根据画面标记、机器人运动和机械臂动作判断实验结果是否正确。
  • 在抓取停止位置出现偏差时,重新校准抓取停止像素坐标。

6.3.2 开始实验:固定颜色夹取

  1. 准备一个红色物块,将机器人放置在平整、开阔的地面上。

  2. 确认机械臂夹取动作已经测试完成,然后打开命令行终端,输入以下指令启动颜色追踪夹取程序:

Terminal
ros2 launch color_track_pick automatic_pick.launch.py pick_color:=red

当前命令行终端需要保持运行。

  1. 将红色物块放入摄像头视野,确认机器人周围没有障碍物。新建一个命令行终端,输入以下指令启动红色目标追踪与夹取:
Terminal
ros2 service call /automatic_pick/pick std_srvs/srv/Trigger "{}"

6.3.2.1 抓取停止位置校准(仅在出现偏差时)

如果机器人能够稳定识别红色物块,但停止位置不适合机械臂夹取,请先按“Ctrl+C”停止当前程序。将红色物块放在机械臂能够正确夹取的位置,然后输入以下指令:

Terminal
ros2 launch color_track_pick automatic_pick.launch.py \
  pick_color:=red \
  calibration:=pick

校准模式会识别红色目标。目标位置稳定后,程序将新的抓取停止像素坐标保存到automatic_pick_roi.yaml,然后停止校准,不会执行实际夹取。校准完成后按“Ctrl+C”退出,再使用正常启动指令重新进行抓取实验。

6.3.3 结果验证

依次观察红色目标抓取过程。

测试阶段 正确结果
识别红色目标 画面使用黄色轮廓和中心点标记红色物块。
追踪红色目标 机器人根据目标位置调整前后距离、左右方向和物块角度。
夹取红色目标 机器人停在合适位置,机械臂完成靠近、夹取和抬起动作。

当机器人能够稳定识别红色目标并完成追踪夹取,并且整个过程中没有持续摆动、碰撞或异常动作时,说明基础实验完成。

6.3.4 进阶实验:动态取色夹取

动态取色模式不需要预先指定颜色名称。用户在摄像头画面中点击目标后,程序会采集点击位置附近的颜色,并将其作为本次夹取目标。

  1. 确认固定颜色夹取程序已经停止,然后输入以下指令启动动态取色模式:
Terminal
ros2 launch color_track_pick automatic_pick.launch.py mode:=mouse
  1. 摄像头画面打开后,将需要夹取的纯色物体放入视野,使用鼠标左键点击物体上颜色均匀的位置。

  2. 确认画面中的黄色轮廓和中心点能够稳定标记目标,并确认机器人周围没有障碍物。

  3. 新建一个命令行终端,输入以下指令启动目标追踪与夹取:

Terminal
ros2 service call /automatic_pick/pick std_srvs/srv/Trigger "{}"

当程序能够持续识别鼠标选取的目标,并完成追踪、靠近和夹取时,说明动态取色夹取实验完成。

6.3.4.1 动态取色抓取停止位置校准

如果动态取色后能够稳定识别目标,但机器人停止的位置不适合机械臂夹取,请先按“Ctrl+C”停止当前程序。将目标放在机械臂能够正确夹取的位置,然后输入以下指令:

Terminal
ros2 launch color_track_pick automatic_pick.launch.py \
  mode:=mouse \
  calibration:=pick

摄像头画面打开后,使用鼠标左键点击目标上颜色均匀的位置。取色完成后,程序会自动识别目标并保存新的抓取停止像素坐标,不需要调用/automatic_pick/pick服务。校准完成后按“Ctrl+C”退出,再使用正常的动态取色启动指令进行夹取实验。

6.3.5 拓展任务:追踪夹取袜子

准备一只颜色均匀、与背景区别明显的纯色袜子,尝试让机器人完成追踪、靠近和夹取。

参考思路 点击展开袜子追踪夹取步骤

建议使用动态取色模式夹取袜子。该模式不需要在程序中预先指定袜子的颜色;如果需要重复夹取同一种颜色的袜子,也可以在lab_config.yaml中配置对应阈值,并通过pick_color参数使用固定颜色模式。

  1. 将袜子放置在平整地面上。
  2. 使用mode:=mouse启动动态取色模式,点击袜子上颜色均匀的位置,确认袜子能够被完整识别,背景不会被大面积误识别。
  3. 打开上位机软件,运行机械臂动作查看效果,然后参考“6.4.2 机械臂动作编辑(选看)”修改夹取动作,直到机械臂能够合适地夹取袜子。
  4. 如果抓取停止位置不合适,参考“6.3.4.1 动态取色抓取停止位置校准”,重新校准适合折叠袜子的停止像素坐标。
  5. 调用/automatic_pick/pick服务,观察机器人能否稳定追踪袜子、停在合适位置并完成夹取。

6.4 · 颜色追踪夹取

辅助工具(选看)

选看工具

以下工具不属于主线实验步骤。颜色识别出现阈值问题时查看LAB颜色阈值工具;机械臂夹取动作不合适时查看机械臂动作编辑。

6.4.1 LAB颜色阈值工具(选看)

在不同光源下,物体颜色的呈现效果是不同的,而这一现象会对涉及颜色识别的功能玩法产生一定程度的影响。针对这一问题,本节课将学习如何使用LAB TOOL工具进行颜色阈值的调节。

6.4.1.1 LAB颜色空间简介

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

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

6.4.1.2 启动LAB TOOL

  1. 按照“6.0.4 通用启动与退出方法”连接机器人,然后点击系统桌面的图标,打开命令行终端。

  2. 输入停止APP自启服务的指令,并按下回车。

Terminal
sudo systemctl stop start_app_node.service
  1. 输入指令,启动相机节点:
Terminal
ros2 launch peripherals depth_camera.launch.py
  1. 新建一个命令行终端,输入启动LAB TOOL的指令,然后按下回车执行。
Terminal
python3 /home/ubuntu/software/lab_tool/main.py

图:LAB TOOL启动成功后的完整界面。

6.4.1.3 LAB TOOL的界面说明

LAB TOOL软件的界面分为图中1画面显示区和图中2识别调节区两个部分。

6.4.1.4 调节颜色阈值

  1. 打开LAB TOOL工具,在识别调节区的颜色列表选择需要调节阈值的颜色,此处以红色(red)为例。
  1. 将L、A、B分量的“min”值都设置为“0”、“max”值都设置为“255”。
  1. 将颜色物体放置在摄像头的视野范围内,参考LAB颜色空间分布图,将L、A、B分量向目标识别颜色的区间进行调整。

红色靠近“+a”,则需增加A分量,即保持A分量的“max”值不变,增大其“min”值,直至画面显示区左侧画面内的颜色物体区域变为白色,其它区域变为黑色。

  1. 根据所处环境调整剩余的L、B分量。若红色偏浅,则增大L分量的“min”值;偏深,则减小L分量的“max”值;若红色偏暖,则增大B分量的“min”值;偏冷,则减小B分量的“max”值。

下表为LAB阈值调节的参数信息:

颜色分量 颜色分量取值范围 对应颜色区间
L 0~255 黑-白(-L ~ +L)
A 0~255 绿-红(-a ~ +a)
B 0~255 蓝-黄(-b ~ +b)
  1. 点击识别调节区的“保存设置”按键,保存颜色阈值的调节参数。

6.4.1.5 新增识别颜色

除了内置的识别颜色外,用户还可自行增加其它可识别颜色,此处以黄色(yellow)为例,具体操作步骤如下:

  1. 打开LAB TOOL工具,点击“新增颜色”按键。
  1. 在“name”一栏填写颜色名称,并点击“确定”按键。
  1. 在颜色列表处选择新增的颜色。
  1. 将颜色物体放置在摄像头的视野范围内,拖动L、A、B分量滑杆调整阈值,直至画面显示区左侧画面内的颜色物体区域变为白色,其它区域变为黑色。
  1. 点击识别调节区的“保存设置”按键,保存颜色阈值的调节参数。

6.4.1.6 保存与退出

  1. 完成阈值调节后,点击识别调节区的“保存设置”按钮,保存当前颜色阈值。

  2. 点击LAB TOOL右下角的“关闭软件”按钮,关闭工具界面。

  1. 回到启动相机节点的命令行终端,按“Ctrl+C”关闭相机服务。

6.4.1.7 常见问题

LAB TOOL为什么没有显示相机画面?

检查深度相机连接线是否连接正常,必要时重新插拔连接线后再启动相机节点。

为什么目标颜色区域不完整?

将L、A、B分量的范围恢复到0~255,再根据当前光线环境逐步缩小阈值范围。

为什么背景中出现较多白色区域?

移除画面中颜色相近的物体,并继续缩小对应颜色分量的阈值范围。

6.4.2 机械臂动作编辑(选看)

颜色追踪夹取由两部分组成:先在 Arm 工具中确认机械臂的夹取动作组,再启动颜色追踪夹取程序。默认追踪红色目标;当目标进入可夹取位置时,机器人会调用已配置的夹取动作。

6.4.2.1 编辑修改夹取动作

下面的视频演示如何打开 navigation_pick.d6a、检查动作行,并运行一次夹取动作进行确认。

机械臂动作编辑演示:打开动作文件、检查舵机参数并运行测试。

6.4.2.2 打开夹取动作文件

  1. 在机器人远程桌面双击 Arm 图标,打开机械臂动作编辑工具。
  2. 点击“打开动作文件”。
  3. 在动作文件列表中选择 navigation_pick.d6a,然后点击右上角的 Open

打开后,工具上方会显示动作行列表;下方会显示当前动作组的舵机控制区域和操作按钮。

6.4.2.3 修改并测试夹取动作

  1. 在上方动作行列表中单击需要调整的一行。

    在动作行列表中选择需要修改的动作
  2. 调整对应舵机的位置参数和该动作行的运行时间;每次只修改少量数值,便于判断变化。

    拖动或者直接编辑修改数值

    调整舵机位置参数
  3. 将数值记录到对应动作的id上

    确认动作行对应的舵机ID
  4. 点击“运行”测试动作组,观察机械臂是否按预期完成靠近、夹取和抬起动作。

  5. 出现“运行结束”提示后点击 OK,继续选择下一行动作检查或调整。

  6. 夹取效果确认无误后,使用“保存动作文件”保存修改。

    点击保存动作文件按钮

    选择替换原来的动作文件

    确认替换原来的动作文件