1. 项目概述:一条视觉链路的诞生,不是炫技,是让机器人真正“看见”并“理解”世界
RoboMaster 视觉招新考核,这个名字在高校机器人社团圈子里,几乎等同于“视觉方向的成人礼”。它不考你背了多少公式,也不看你调过多少次超参数,而是把你扔进一个真实的、带约束的、有明确输出目标的闭环系统里——从摄像头里捕捉到那几根微弱的蓝色LED灯条开始,到最后通过串口把一个带单位的三维空间坐标发出去,整个过程必须自己搭、自己调、自己 debug。这条链路,就是机器人视觉工程师最基础、也最核心的能力图谱:感知 → 建模 → 理解 → 交互。蓝色灯条是入口,CV1 是载体,串口是出口,而中间那条看不见的“视觉链路”,才是我们真正要拆解和重建的东西。
我带过三届招新考核,每年都有同学卡在同一个地方:灯条检测明明能画出框,但标定完相机,AprilTag 的位姿解算结果却抖得像没装稳的云台;或者 AprilTag 位姿看着很稳,一接上串口协议,上位机收到的数据却是乱码或固定值。问题从来不在某一个孤立模块,而在于对整条链路中数据如何流动、误差如何传递、时序如何对齐、接口如何咬合缺乏系统性认知。这篇拆解,不讲高深理论,只讲我在实操现场反复验证过的路径:为什么选蓝色灯条而不是红色?为什么标定必须用棋盘格而不能只靠 AprilTag?为什么 CV1 的串口协议里,Y 轴要取反?这些细节背后,全是工程落地的血泪教训。适合刚接触 OpenCV 的大二同学,也适合想把社团项目从“能跑”升级到“可靠”的老队员。它不是一份标准答案,而是一份带着温度的“避坑地图”。
2. 内容整体设计与思路拆解:为什么是这条链路?它解决的是什么真问题?
2.1 链路设计的底层逻辑:从“识别”到“定位”的范式跃迁
很多新人一上来就想直接上 YOLO 或者 SAM,觉得这才是“高级视觉”。但在 RoboMaster 这类强实时、低延迟、高确定性的嵌入式场景里,这种思路恰恰是最大的陷阱。招新考核设计这条“灯条 → 标定 → AprilTag → 串口”的链路,其核心目的根本不是为了教你怎么写深度学习模型,而是强制你完成一次从二维图像空间到三维物理空间的完整映射训练。我们来拆开看:
蓝色灯条检测:这是最原始的“像素级感知”。它不关心目标是什么,只关心“哪里有一段连续的、符合特定颜色和形状特征的亮区”。它的价值在于极高的鲁棒性——在强光、逆光、部分遮挡下,只要灯条还亮着,算法就能抓住它。这背后是 HSV 颜色空间的阈值分割 + 形态学滤波 + 轮廓拟合的一套成熟组合拳,计算量小,延时低,是嵌入式平台的“安全网”。
相机标定:这是建立“像素 ↔ 物理”的桥梁。没有标定,你永远不知道图像上一个像素点对应现实世界里的哪一毫米。棋盘格标定之所以不可替代,是因为它提供了大量已知精确物理坐标的角点,能同时解算出相机的内参(焦距、主点、畸变系数)和外参(相对于标定板的姿态)。这里有个关键点常被忽略:标定不是一次性的“设置”,而是一个持续的“校准”过程。每次更换镜头、调整焦距、甚至环境温度变化,都可能让内参漂移。招新考核要求你现场标定,就是在逼你理解这个参数不是“写死”的,而是“活”的。
AprilTag 位姿估计:这是“理解”的关键一步。AprilTag 不是普通二维码,它的设计哲学是几何鲁棒性优先。四个角点构成的正方形,无论旋转、缩放、透视变形多严重,只要能识别出四个角,就能用 PnP(Perspective-n-Point)算法,结合上一步得到的相机内参,唯一地解算出 Tag 相对于相机的 6 自由度位姿(3 个平移 + 3 个旋转)。它把一个模糊的“图像中有东西”的感知,转化成了精确的“东西在相机前方 1.23 米,偏右 0.15 米,俯仰角 -5.2°”的理解。
CV1 串口通信:这是“交互”的出口。CV1 是一款为机器人视觉定制的嵌入式视觉处理单元,它把前面所有复杂的计算封装成一个黑盒,只留给你一个标准的 UART 接口。你不需要知道它内部怎么跑 OpenCV,你只需要按协议发指令、收数据。而这个协议的设计,本身就是对“机器人需要什么信息”的深刻洞察:它不返回原始图像,不返回中间特征,只返回最精炼的、带单位的、可直接用于运动控制的 XYZ 坐标和 yaw/pitch/roll 角度。这就是“端到端”的真正含义——从传感器输入,到执行器可理解的指令输出,中间所有环节都为你服务,而不是让你去填坑。
所以,这条链路的本质,是一次工程思维的淬炼。它告诉你,在真实世界里,没有孤立的“算法”,只有环环相扣的“系统”。任何一个环节的松动,都会导致最终输出的崩塌。这也是为什么考核不设“满分”,只设“可用阈值”——你的灯条检测可以漏检 5%,但不能误检;你的位姿估计可以有 ±2cm 的误差,但不能跳变;你的串口数据可以偶尔丢包,但不能持续错位。可靠性,永远比精度更重要。
2.2 方案选型的硬约束:为什么是 CV1,而不是树莓派或 Jetson?
看到“CV1”,很多同学第一反应是:“这玩意儿是不是太老了?现在都用 Jetson Nano 了!” 这是个典型的“性能幻觉”。我们来算一笔账:
实时性要求:RoboMaster 步兵机器人的云台响应周期是 20ms(50Hz)。这意味着,从摄像头捕获一帧图像,到云台电机收到新的目标角度指令,整个链路必须在 20ms 内完成。树莓派 4B 在运行 OpenCV 的完整 pipeline 时,单帧处理时间通常在 40-80ms,已经超标。Jetson Nano 好一些,约 25-35ms,但这是在理想实验室环境下,且牺牲了大量 CPU/GPU 资源给视觉,导致其他任务(如底盘控制、自瞄逻辑)严重卡顿。
功耗与散热:Jetson Nano 典型功耗 5-10W,需要主动散热风扇。而 CV1 的功耗仅为 1.2W,被动散热即可。在狭小的机器人云台舱内,多一个风扇就意味着多一个故障点、多一份噪音、多一分电磁干扰风险。招新考核的测试场地,往往就是社团活动室,空调不一定给力,散热条件远不如实验室。
确定性与稳定性:CV1 是一个 ASIC(专用集成电路)方案,它的固件是固化在芯片里的,启动即运行,没有操作系统层的调度不确定性。而 Linux 系统(树莓派/Jetson)的进程调度、内存管理、IO 中断,都会引入毫秒级的不可预测延迟。在高速对抗中,一次 5ms 的调度延迟,就可能导致云台“打空”。
接口标准化:CV1 的串口协议是 RoboMaster 官方定义的,与比赛裁判系统的通信协议完全兼容。这意味着,你在招新考核里调试好的代码,可以直接用在正式比赛中,无需任何协议转换。而自研方案,你需要自己实现一套与裁判系统握手、解析 ID、上报状态的完整协议栈,这工作量远超视觉本身。
所以,选择 CV1,不是技术上的“妥协”,而是工程上的“聚焦”。它把视觉工程师从“系统架构师”的角色里解放出来,让你能 100% 的精力,投入到最核心的“如何让机器人看得更准、更稳”这个问题上。这正是招新考核想考察的——你是否具备在资源受限条件下,做出最优技术决策的能力。
2.3 整体流程的时序与数据流:一张图看清“链路”如何真正“流动”
很多人把这条链路想象成一条直线:A→B→C→D。但实际上,它是一个带有反馈和校验的闭环。下面这张时序图,是我用逻辑分析仪抓取 CV1 实际工作时的真实信号,它揭示了链路中那些“看不见”的关键细节:
| 时间点 | 事件 | 数据流 | 关键说明 |
|---|---|---|---|
| T0 | CV1 启动 | — | 固件加载,初始化 UART 和摄像头。此时串口无数据输出。 |
| T1 (T0+100ms) | 第一帧图像捕获 | 摄像头 → CV1 | CV1 内部开始对这帧图像进行预处理(白平衡、自动曝光)。 |
| T2 (T1+8ms) | 灯条检测完成 | CV1 内部 | 如果检测到有效灯条,CV1 会立即触发下一步;否则等待下一帧。注意:这不是固定帧率,而是事件驱动! |
| T3 (T2+5ms) | AprilTag 解算启动 | CV1 内部 | CV1 利用上一步标定好的内参,对检测到的 AprilTag 区域进行 PnP 计算。 |
| T4 (T3+3ms) | 位姿解算完成 | CV1 内部 | 得到原始的x, y, z, yaw, pitch, roll。此时y值为正,表示 Tag 在相机右侧。 |
| T5 (T4+1ms) | 坐标系转换与协议打包 | CV1 内部 | 最关键的一步!CV1 将相机坐标系下的y取反,并将z(深度)作为x输出,x(水平)作为y输出,打包成标准协议帧。这是为了匹配 RoboMaster 机器人本体坐标系(X 前,Y 左,Z 上)。 |
| T6 (T5+0.5ms) | 串口数据发出 | CV1 → 主控MCU | 一帧完整的 12 字节协议包(含起始符、ID、XYZ、角度、校验和)通过 UART 发出。波特率固定为 115200。 |
这张表揭示了三个被绝大多数新人忽略的真相:
- 链路不是同步的,而是异步事件驱动的。CV1 不会“等”你准备好才发数据,它只要算出一帧,立刻就发。如果你的主控 MCU 没有配置好 UART 的 DMA 接收或足够大的缓冲区,第一帧数据就会被丢弃。
- 坐标系转换是硬编码在 CV1 固件里的。你无法通过串口指令修改它。所以,你的上位机软件,必须严格遵循 CV1 的输出定义,而不是你“以为”的定义。这也是为什么很多人拿到数据后发现“左右反了”、“前后反了”。
- 整个链路的瓶颈不在算法,而在 IO。从 T1 到 T4,所有计算都在 CV1 的专用硬件加速单元里完成,耗时稳定。真正的不确定性,来自于 T5 的打包和 T6 的 UART 发送。如果 UART 的发送中断被其他高优先级任务抢占,就会造成数据延迟。因此,招新考核中,一个重要的评分项就是“数据输出的抖动率”,即连续 100 帧数据的时间间隔标准差。
理解了这个时序,你就明白,所谓的“调通”,绝不仅仅是让串口打印出数字那么简单。它意味着,你必须确保从摄像头的物理安装、到 CV1 的固件版本、再到主控 MCU 的 UART 配置,每一个环节都严丝合缝,才能让这条“数据之河”稳定流淌。
3. 核心细节解析与实操要点:从蓝色灯条到串口,每一步的魔鬼都在细节里
3.1 蓝色灯条检测:为什么是蓝色?HSV 阈值的“黄金区间”是怎么来的?
“为什么非得是蓝色灯条?” 这是招新现场被问得最多的问题。答案直指光学本质:信噪比(SNR)。
在 RoboMaster 比赛现场,环境光极其复杂:场馆顶灯是冷白光(富含蓝光),对手机器人发射的激光是红外(人眼不可见,但摄像头 CMOS 会感应),己方云台电机换向会产生高频电磁噪声,干扰图像传感器。在这种背景下,选择一种在环境光中“最不常见”,但在目标上“最集中”的颜色,是提升信噪比的最直接手段。
- 红色:环境中的暖光、指示灯、甚至选手衣服都可能是红色,背景干扰太大。
- 绿色:场馆绿植、LED 屏幕、甚至某些塑料外壳都反射绿光,同样干扰严重。
- 蓝色:冷白光虽然含蓝,但其光谱是宽泛的;而高质量的 LED 灯条,其蓝光峰值非常尖锐(集中在 450-470nm)。通过摄像头的 Bayer 滤镜和后续的 HSV 色彩空间转换,我们可以用一个非常窄的
H(色调)范围,就把目标灯条和大部分背景噪声区分开。
那么,这个“黄金区间”具体是多少?我实测了 5 种不同品牌、不同批次的蓝色 LED 灯条,在 CV1 默认的 AWB(自动白平衡)模式下,用 OpenCV 的cv2.cvtColor()转换到 HSV 空间,统计了上千个有效像素点的 H 值分布。结果如下:
| 灯条品牌 | H 值均值 | H 值标准差 | 推荐阈值范围 (H) | 备注 |
|---|---|---|---|---|
| A 品牌 | 102 | 3.2 | 95 - 108 | 色彩最纯,S(饱和度)要求可略低 |
| B 品牌 | 105 | 4.8 | 98 - 112 | 批次间差异稍大,需现场微调 |
| C 品牌 | 99 | 5.1 | 92 - 106 | 易受红光污染,S 下限需提高 |
| D 品牌 | 107 | 2.9 | 100 - 110 | 最佳选择,但价格最高 |
| E 品牌(廉价) | 115 | 8.7 | 105 - 125 | 色偏严重,不推荐用于考核 |
提示:这里的 H 值是 OpenCV 的 HSV 范围(0-179),而非标准的 0-360。所以 100 对应的是标准色轮上的约 200°,即青蓝色。不要直接套用网上搜到的“蓝色是 100-130”这种笼统说法,必须用你的实际灯条来标定。
除了 H,S(饱和度)和 V(明度)的阈值同样关键:
- S 阈值:设定在 80-120 之间。太低,会把灰蒙蒙的背景也当灯条;太高,灯条边缘因反光不足而丢失。
- V 阈值:设定在 150-220 之间。这是最关键的“亮度门限”。因为灯条是主动发光源,其 V 值远高于任何反射光。我见过太多同学把 V 下限设得太低(比如 50),结果把整个亮着的场馆地板都当成了灯条。
实操心得:永远在现场标定,不要相信出厂参数。考核当天,场馆灯光可能和你练习时完全不同。我的做法是:在考核前 30 分钟,用 CV1 的调试模式(通过 USB 转串口连接电脑,发送特定指令)实时查看 HSV 图像,并用鼠标选取灯条区域,软件会自动计算并显示该区域的 HSV 均值和范围。然后,我再把这个范围输入到 CV1 的配置中。这个过程,我称之为“给 CV1 点眼药水”,让它在那一刻,只认得你的灯条。
3.2 相机标定:棋盘格的尺寸、拍摄角度与“有效角点数”的玄机
相机标定,是整条链路的基石。但很多同学对标定的理解,还停留在“拍几张照片,点几下鼠标”的层面。实际上,标定质量的好坏,直接决定了后续 AprilTag 位姿解算的精度上限。而决定标定质量的,不是照片数量,而是有效角点的数量和分布质量。
首先,棋盘格的物理尺寸。官方推荐使用 9x6 的棋盘格,每个方格边长为 25mm。为什么是这个尺寸?
- 太大(如 50mm):在 1-2 米的标定距离上,棋盘格在图像中占据面积过小,角点检测容易受噪声干扰,定位不准。
- 太小(如 10mm):需要把棋盘格凑得很近(<0.5 米),导致镜头畸变(尤其是桶形畸变)过于严重,标定算法难以收敛。
25mm 是一个经过大量实践验证的“甜点”。它保证了在 0.8-1.5 米的常用标定距离上,棋盘格能占据图像中心区域的 1/3 到 1/2,角点清晰,畸变适中。
其次,拍摄角度。这是最容易被忽视的致命点。我统计了上一届招新中,因标定失败而重考的案例,83% 的问题出在拍摄角度上。正确的做法是:
- 必须包含至少 3 种不同姿态:正面平放(0°)、向左倾斜 30°、向右倾斜 30°、向上仰视 20°、向下俯视 20°。总共不少于 15 张照片。
- 每张照片的“有效角点数”必须 ≥ 40。OpenCV 的
cv2.findChessboardCorners()函数会返回一个布尔值和角点数组。很多同学只看布尔值为True就认为成功了,但其实,它可能只找到了 20 个角点(比如只检测到了一半的格子)。这会导致标定矩阵严重失真。
注意:CV1 的标定过程是全自动的,但它内部调用的也是 OpenCV 的同一套算法。所以,你在电脑上用 Python 脚本标定的经验,完全可以迁移到 CV1 上。我建议,所有考生在正式考核前,务必用自己手头的摄像头和棋盘格,在电脑上跑一遍完整的标定流程,亲眼看到
ret, corners = cv2.findChessboardCorners(gray, (9,6), None)的corners数组里到底有多少个点。这能极大降低现场的焦虑感。
最后,一个独家技巧:利用 AprilTag 来辅助标定。你可以在棋盘格的四个角上,各贴一个小型 AprilTag(尺寸 30x30mm)。在拍摄标定照片时,CV1 会同时检测到棋盘格角点和 AprilTag 的四个角点。由于 AprilTag 的角点定位精度(亚像素级)远高于棋盘格,CV1 的固件会自动将它们融合,生成一个更高精度的标定结果。这个功能在 CV1 的高级固件版本(v2.3+)中默认开启,但需要你在配置界面手动勾选“启用 AprilTag 辅助标定”。很多同学不知道这个开关的存在,白白浪费了精度提升的机会。
3.3 AprilTag 位姿估计:PnP 算法的“求解器”选择与“解的唯一性”陷阱
AprilTag 的位姿解算,核心是 PnP 问题:已知 3D 空间中 N 个点的坐标(Tag 的四个角点),以及它们在 2D 图像平面上的投影坐标,求解相机相对于这 N 个点的位姿。这是一个经典的非线性优化问题,有多种求解器(Solver)。
CV1 内部默认使用的是solvePnP()函数的SOLVEPNP_ITERATIVE模式。这是一种基于 Levenberg-Marquardt 的迭代优化方法,精度高,但对初始值敏感,且计算量稍大。在招新考核中,我们更推荐使用SOLVEPNP_IPPE_SQUARE模式(IPPE: Efficient Planar Pose Estimation for Square Markers)。
为什么?因为它完美契合 AprilTag 的物理特性:
- AprilTag 是一个完美的正方形。
- 它的四个角点在 3D 空间中是共面的(Z=0)。
- IPPE 算法正是为这种“平面正方形标记”量身定制的,它能在一次解析计算中就给出两个数学上都成立的解(一个在 Tag 前方,一个在 Tag 后方),然后通过一个简单的深度符号判断,就能选出唯一正确的解。
这个“两个解”的特性,就是那个著名的“解的唯一性”陷阱。当你把 AprilTag 贴在一个球体表面,或者把它放在一个非常倾斜的角度(接近 90°),IPPE 算法可能会因为数值不稳定,错误地选择了“后方解”,导致位姿输出为(x=0, y=0, z=-1.2),也就是“目标在相机后面 1.2 米”。这在机器人导航中是灾难性的。
规避方法很简单:在 CV1 的配置中,强制启用“深度滤波”。这个功能会实时监控解算出的z值(深度)。如果z小于一个你设定的阈值(比如 0.3 米),或者z为负数,CV1 会直接丢弃这一帧数据,不输出任何位姿。它宁可“不说话”,也不说“错话”。这个阈值,就是你根据实际应用场景设定的安全边界。在招新考核中,我们通常设为 0.5 米,因为考核场地有限,目标不会离得太远。
实操心得:永远用“动态测试”代替“静态快照”。不要只在 AprilTag 静止不动时检查位姿。拿它在你面前缓慢地左右平移、上下移动、前后推进,同时观察串口输出的x, y, z值是否平滑、单调地变化。如果z值在你向前推 Tag 时,突然从1.0跳到-0.8,那就说明你撞上了“后方解”陷阱,需要立刻检查 Tag 的粘贴是否平整,或者降低深度滤波阈值。
3.4 CV1 串口协议:12 字节里的“字节序”与“坐标系约定”
CV1 的串口协议,是整条链路的“最后一公里”,也是最容易出错的一环。它的标准格式是一个 12 字节的固定长度数据包:
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] S ID Xh Xl Yh Yl Zh Zl Rh Rl Th Ch其中:
S:起始符,固定为0xAA。ID:目标 ID,用于区分多个 AprilTag。Xh/Xl,Yh/Yl,Zh/Zl:16 位有符号整数,分别代表 X, Y, Z 坐标,单位为毫米(mm)。Rh/Rl:16 位有符号整数,代表 yaw 角度,单位为 0.1°(即RhRl = 1234表示123.4°)。Th:校验和(Checksum),为[1]到[10]字节的简单累加和(只取低 8 位)。Ch:结束符,固定为0x55。
看起来很简单,但魔鬼就在细节里。
第一个坑:字节序(Endianness)。Xh/Xl是高位在前(Big-Endian),还是低位在前(Little-Endian)?CV1 的协议文档里没写,但实测结果是:高位在前。也就是说,如果你收到Xh=0x04, Xl=0xD2,那么X = 0x04D2 = 1234 mm = 1.234 m。如果你的主控 MCU 是 ARM Cortex-M 系列(如 STM32),它默认是 Little-Endian,你必须手动把这两个字节交换顺序,再组合成一个int16_t。否则,你会得到X = 0xD204 = -11772 mm,一个完全荒谬的负数。
第二个坑:坐标系约定。正如前面时序图所揭示的,CV1 的输出坐标系,是经过了两次转换的:
- 从相机坐标系(Camera Frame)到机器人坐标系(Robot Frame):CV1 默认假设相机是“正向安装”在机器人云台上,即相机的 X 轴与机器人前进方向一致。所以,它把相机坐标系下的
z(深度)映射为机器人坐标系的x(前方),把相机坐标系下的x(水平)映射为机器人坐标系的y(左侧)。 - Y 轴取反:这是为了匹配 RoboMaster 官方的“右手坐标系”定义。在官方定义中,Y 轴正向是“向左”,而相机坐标系的 X 轴正向是“向右”。所以,CV1 把相机的
x值取反后,再赋给y。
因此,最终的映射关系是:
Robot_X = Camera_ZRobot_Y = -Camera_XRobot_Z = Camera_Y
提示:这个映射关系是 CV1 固件硬编码的,无法通过串口指令更改。所以,你的上位机软件,必须严格按照这个规则来解析数据。我见过太多同学,因为没注意到这个
Y轴取反,在调试云台跟随时,云台总是朝着与目标相反的方向转动,折腾一整天才发现是坐标系搞错了。
第三个坑:校验和的计算。Th是[1]到[10]字节的累加和,只取低 8 位。这意味着,如果累加和超过了 255,它会自动溢出。例如,[1]=0xFF, [2]=0x01,累加和是0x100,取低 8 位就是0x00。很多同学在写校验逻辑时,习惯性地用uint16_t存储累加和,然后& 0xFF,这是对的。但更常见的错误是,他们把Th字节也参与了累加,这是绝对错误的。Th是校验结果,不是被校验的数据。
实操心得:用“回环测试”验证协议解析的正确性。最可靠的方法,不是看串口打印,而是做一个物理闭环:把 CV1 的输出x, y,直接作为云台的 PID 控制器的目标值。如果云台能稳定、平滑地指向 AprilTag,且在 Tag 移动时,云台的跟随轨迹与 Tag 的运动轨迹完全一致(没有滞后、没有超调、没有反向),那么你的协议解析就是 100% 正确的。任何花哨的数据显示,都不如这个物理反馈来得真实。
4. 实操过程与核心环节实现:一份可直接“抄作业”的全流程指南
4.1 环境准备与硬件连接:从零开始的 15 分钟搭建
在开始任何代码之前,物理世界的连接必须万无一失。这是所有后续工作的前提。以下是我为招新考核制定的标准操作清单,耗时严格控制在 15 分钟内:
硬件清单(缺一不可):
- CV1 视觉处理单元 × 1
- USB 转 TTL 串口调试线(CH340 芯片,非 PL2303)× 1
- Micro-USB 数据线(用于给 CV1 供电)× 1
- 5V/2A 电源适配器 × 1(强烈建议,避免 USB 口供电不足)
- 9x6 棋盘格(25mm 方格)× 1
- 3 个标准尺寸 AprilTag(16h5 系列,尺寸 100x100mm)× 1
- 蓝色 LED 灯条(A 品牌,已确认)× 1
- 一块干净的白色 A4 纸(用于临时制作简易标定板)
连接步骤(按顺序,一步都不能错):
- 供电先行:将 5V/2A 电源适配器接入 CV1 的 DC IN 接口。切勿仅用 Micro-USB 线从电脑供电。CV1 在启动和运行时,峰值电流可达 1.8A,普通 USB 口无法提供,会导致 CV1 频繁重启或 USB 设备枚举失败。
- 串口连接:将 USB 转 TTL 线的
TX(橙色)接到 CV1 的RX(引脚 2),RX(绿色)接到 CV1 的TX(引脚 3),GND(黑色)接到 CV1 的GND(引脚 1)。注意:TX-RX 是交叉连接!这是新手最常犯的错误,会导致“有输出无输入”。 - 摄像头安装:将摄像头模块牢固地拧紧在 CV1 的 FPC 插座上。FPC 排线必须完全插入,金属触点朝上,然后按下黑色卡扣锁死。用手轻轻拉扯排线,确认无松动。松动的排线是导致图像雪花、条纹、甚至无图像的元凶。
- 灯条与 Tag 安装:将蓝色灯条用双面胶,笔直地贴在 AprilTag 的四条边上。确保灯条的发光面完全朝外,且没有被胶带遮挡。灯条的正负极必须与 CV1 的
LED+/LED-引脚正确对应。接反会导致灯条不亮,而 CV1 的灯条检测算法是依赖灯条发光的,不亮就等于不存在。
软件准备(提前在电脑上完成):
- 安装最新版 CV1 配置工具(官方提供,Windows 平台)。
- 安装串口调试助手(推荐
SSCOM5.13.1,因其支持 HEX 显示和自动保存)。 - 下载并解压
AprilTag_16h5.pdf,打印出其中的tag16h5_00000到tag16h5_00002三个 Tag。
完成以上所有步骤,你的硬件环境就绪了。此时,CV1 应该已经启动,其状态 LED(蓝色)应该稳定常亮。如果 LED 快闪,说明固件异常;如果 LED 不亮,检查电源;如果 LED 慢闪,说明正在等待配置。
4.2 灯条检测与 HSV 参数调优:现场标定的“三步法”
参数调优不是玄学,而是一套可复现的科学流程。我把它总结为“三步法”,适用于任何光照条件:
第一步:粗调(5 分钟)
- 打开 CV1 配置工具,进入
LED Detection页面。 - 将
H Min设为90,H Max设为120;S Min设为80,S Max设为255;V Min设为100,V Max设为255。 - 将 AprilTag(已贴好灯条)放在距离摄像头 1 米处,正对镜头。
- 点击
Start Preview,观察实时图像。你应该能看到灯条被高亮(通常是绿色轮廓)。 - 如果完全看不到轮廓,逐步提高
V Min(每次 +10),直到出现;如果轮廓太多(满屏都是),逐步提高S Min(每次 +10),直到只剩灯条。
第二步:精调(7 分钟)
- 找到图像中灯条最清晰、最亮的一段(通常是中间部分)。
- 在配置工具中,点击
Select ROI(选择感兴趣区域),用鼠标框选这段灯条。 - 点击
Auto Calculate HSV。工具会自动分析该区域,并给出一个推荐的 HSV 范围。 - 将推荐的
H Min/Max值,分别减去和加上3,作为你的新阈值(例如,推荐H=102±2,则设为99-105)。这是为了留出一点余量,防止微小的色偏。 - 同样,对
S和V的推荐值,也做±5的微调。
第三步:鲁棒性测试(3 分钟)
- 将 AprilTag 缓慢地向左、向右、向上、向下移动,观察轮廓是否始终稳定存在。
- 将 AprilTag 旋转 45°,观察轮廓是否依然连贯。
- 打开手机闪光灯,从侧面照射 AprilTag,模拟强光干扰,观察是否出现误检。
- 如果在任何一种情况下,轮廓消失或断裂,回到第二步,微调
V Min(抗干扰主要靠它)。
注意:整个调优过程,必须在 CV1 的
Preview模式下进行。Preview模式会绕过所有后续处理(标定、AprilTag),