自动对焦标定流程图

AutoFoczool · CalibrationEngine.CalibrateWell · 生成于 2026-06-16 · 所有参数取自当前代码真实默认值

一、整体流程(一键全自动初始化)

开始:一键全自动初始化
扫描设备 → 连接舱室(相机+串口) → 勾选 well → 点击启动
相机分辨率 2592×1944 · 串口 9600 8N1 · 移动读超时 12000ms / 查询读超时 3000ms
开灯 + 准备
OpenLED() → 等待 200ms → 创建 CalibrationEngine
↓↓↓ 对每个勾选的 well 循环执行 ↓↓↓
读取该 well 的 EEPROM 参数
ReadWellHorizontalPos(well) → 水平位置;ReadWellFocusZero(well) → Z零点(仅记录,粗对焦不依赖它)
移到 EEPROM 水平位置 + 设中低曝光
HorizontalMoveTo(钳位后位置),失败重试最多 3 次;SetExposure(60)
水平钳位范围 [0, 220000] · 中低曝光 CenterScanExposure=60 (×100µs)
① 粗对焦
⏱ 开扫前停稳(防运动拖影伪峰)
先把 Z 移到扫描起点(60000),再额外等待停稳 + 丢弃到位前残留帧,然后才开始逐层扫描。
修复偶发问题:手动复位会把 Z 打到远端,正式标定大行程冲到起点,若不停稳,前几层抓到运动拖影帧会形成伪峰(如74000)带偏对焦。
移到起点 lo=60000 · 额外停稳 CoarseSettleMs=2000ms · 丢1帧
① 粗对焦(找大致焦面)
固定中心大窗口逐层扫描,中央40%ROI算清晰度(Tenengrad÷mean),取最高分层;每层分数落盘便于排查伪峰
中心 90000 · 半幅 ±30000 → 区间 [60000,120000] · 步距 2000 → 31层 · 每层移动后等 350ms + 丢1帧
② 水平居中
② 水平微调居中(优化Y偏移)
以EEPROM水平位为中心小范围扫描,检测well圆,选|Y偏移|最小且完整的位置
半幅 ±2000 (远小于well间距9000的一半) · 9步 → 步距≈500 · 每步等800ms · 居中容差 |Y|<12%
③ 曝光
③ 曝光二分(well内ROI测光)
二分搜索曝光值,使well盘面亮度适中(不过曝/不死黑),按 Over/Good/Under 判定
曝光范围 [10, 800] (×100µs) · 每次设曝光后等 max(200, e/5)ms + 丢1帧
④ 精对焦
④ 精对焦(围绕粗焦点细扫 + 平滑插值)
围绕粗对焦Z小范围密扫,well圆内0.95r ROI(未检出降级中央40%),3点平滑+抛物线插值求峰顶
半幅 ±6000 · 步距 500 → 25层 · 中心=粗对焦Z · 每层等350ms+丢1帧 · Z钳位[0,125000]
移到最清晰Z + 存图 + 记录结果
VerticalMoveTo(focusZ);存标定后BMP;记录 水平/Y偏/曝光/focusZ/峰比
合格判定:|Y偏|<12% 且 检出圆 且 峰比(max/mean)>1.2
所有 well 完成
关灯 + 存档
CloseLED();写 calibration.json;刷新缓存(转well立即用新结果)

二、四个对焦阶段参数详表

阶段电机轴中心范围/半幅步距(脉冲)层数/步数每步延时ROI
①粗对焦垂直Z90000(固定)±30000200031350ms
(开扫前额外停稳2000ms)
中央40%
②水平居中水平EEPROM水平位±2000≈5009800mswell圆检测
③曝光二分[10,800]二分~log₂max(200,e/5)mswell内
④精对焦垂直Z粗对焦Z±600050025350mswell圆0.95r

三、电机行程限位(安全钳位)

下限上限说明
水平(皿孔旋转)0220000实测16个well EEPROM位置 70800~205800,间距约9000
垂直Z(对焦)0125000旧工程软上限;实测焦面集中在 86000~92000
所有 HorizontalMoveTo / VerticalMoveTo 调用前都经 ClampH / ClampZ 钳位,越界写日志并截断到边界,防止撞机械限位。

四、清晰度算法(Sharpness.Compute)

值/说明
主指标Tenengrad(Sobel梯度幅值平方和)
归一化sumSq / 像素数 / mean(除以亮度均值一次方)
峰值精修3点滑动平均平滑 + 抛物线插值峰顶
对焦质量峰比 max/mean,<1.2 判定弱峰(可能空well/对焦失败)并告警
注:归一化用 ÷mean 而非 ÷mean²。早期用 ÷mean² 会因 Z 增大时画面变亮而把清晰帧压垮,导致选错最暗最糊层。改 ÷mean 后峰值正确落在真实焦面。

五、串口协议关键参数

波特率9600 8N1
移动类命令读超时(CMD_MOTOR=0x05)12000ms(覆盖大行程移动到位耗时)
查询类命令读超时(握手/读EEPROM/读位置)3000ms
电机到位延时 MotorDelayMs默认1500ms(扫描时用更短的350/800ms提速)
移动命令是开环+固定延时:下位机回复只代表"收到指令",机械到位靠延时保证。大行程移动耗时随距离增长,故移动类读超时给到12秒。

六、设备发现流程(扫描设备按钮)

点击「扫描设备」
① 枚举相机
相机索引 0..9 逐个 Init 读序列号(SN),建 index→SN 字典
最多枚举 10 台 · 分辨率 2592×1944 · 初始曝光 400(×100µs)
② 扫描串口
遍历所有 COM 口(跳过 COM1/COM2),逐个握手得 houseSn,读 EEPROM 的 CCDSN
握手命令 5E 01... · 读CCDSN(EEPROM)
③ 配对
用 CCDSN 把舱室(串口)配对到相机 index,得到「舱室+相机+串口」三元组
填入舱室下拉框 → 选舱室 → 连接
连接:打开串口 + 按界面增益(R/G/B)和曝光 Init 相机 + SetOpMode(0)拍照模式

七、手动测试台 — 全部控件与参数

相机参数

控件默认值范围作用
曝光 TxtExposure400[1,1000] ×100µs感光时间,越大越亮。对焦标定用中低曝光(~60)避免well盘过曝
增益 R TxtGainR250-255红通道信号放大倍数
增益 G TxtGainG140-255绿通道放大(默认最低,因绿通道传感器灵敏度最高,压低防偏绿)
增益 B TxtGainB250-255蓝通道放大倍数
增益作用 = 整体提亮 + 白平衡校色偏。实测(曝光60):全低 R5G5B5→灰度均值92(偏暗),默认→219,全高 R60G60B60→255(过曝饱和丢细节)。对焦需中灰区(~120-220),过曝/过暗都会让清晰度算法失准。

Z 对焦轴(垂直电机)

控件默认值说明
步距 TxtZStep128Z+正转 / Z-反转 每次走的脉冲数
绝对位置 TxtZAbs0「移动」按钮:直接移到该 Z 绝对脉冲位置
Z复位复位脉冲 2000(0x07D0)固定帧 5E 05 00 0B 23...07 D0,回机械零点。脉冲值固化、不可配

水平轴(皿孔旋转电机)

控件默认值说明
步距 TxtHStep100正转/反转 每次走的脉冲数
到位延时 TxtMotorDelay1500 ms移动后等待机械稳定的时间(MotorDelayMs)
水平复位复位脉冲 3000(0x0BB8)固定帧 5E 05 00 0B 13...0B B8,回机械零点。脉冲值固化、不可配
转到该well读该well EEPROM水平位→移过去;若有合格标定结果则优先用标定的水平/Z/曝光

手动 Z 扫描(扫描选层,找最清晰层)

控件默认值说明
起点 TxtScanStart0扫描起始 Z 脉冲
层距 TxtScanStep128每层 Z 增量
层数 TxtScanCount11扫描层数(至少2)
流程:从起点起逐层 VerticalMoveTo(start + i×step),每层抓帧算清晰度,画清晰度曲线,选分数最高层。与自动粗对焦同理,但参数全手动、范围由用户定。

其他操作

按钮作用
开光源/关光源LED 开关(固定帧 5E 09...),对焦/拍照需开灯
抓一帧GrabRgb 抓单帧显示 + 算中央50%ROI清晰度
实时预览连续抓帧实时显示(切换开关)
存图把当前帧存为 BMP
设置(曝光/增益)把输入框的曝光/增益值下发给相机

八、标定结果与合格判定

记录项含义
HorizontalPulse居中后的水平脉冲位置
FocusZ精对焦求得的最清晰 Z(抛物线插值后)
Exposure曝光二分求得的曝光值
CenterOffsetPctwell圆 Y 方向偏移百分比
PeakRatio对焦峰强度 max/mean,<1.2 判弱峰告警
合格判定|Y偏移|<12% 且 检出圆 且 峰比>1.2
标定结果存 calibration.json;转well时优先用合格的标定参数(水平/Z/曝光),不合格则降级用 EEPROM 原始值。

九、错误处理与降级策略

情况检测处理
电机移动失败下位机无回复/超时RetryMove 重试最多 3 次(每次间隔400ms);仍失败→跳过该well,记 Note="电机移动失败"
抓帧失败GetSourceBuffer 返回空/异常Grab 重试最多 3 次(每次间隔50ms);仍失败→抛异常终止该well
精对焦未检出well圆WellDetector.Detect 未找到圆对焦ROI降级为中央40%(绝不用全图,避免背景/反光干扰),继续对焦
对焦峰过弱峰比 max/mean < 1.2告警"可能空well或对焦失败",记 Note;结果仍保留但标记不合格
粗对焦峰落区间边界bestZ ≤ 下界 或 ≥ 上界告警"真实焦面可能在窗口外,建议调整 ZCoarseCenter/ZCoarseHalf"
脉冲越界目标 < 下限 或 > 上限ClampH/ClampZ 钳到边界并写日志,不发越界指令(防撞机械限位)
水平全程未检出圆居中扫描所有位置都没well圆跳过该well,记 Note="水平全程未检出圆"
设计原则:单个well失败不中断整批标定(跳过并记Note继续下一个);所有降级都有日志,便于事后排查。