自动对焦流程图.html 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>自动对焦标定流程图 · AutoFocusTool</title>
  7. <style>
  8. * { box-sizing: border-box; margin: 0; padding: 0; }
  9. body { font-family: "Microsoft YaHei", sans-serif; background: #1e1e1e; color: #ddd; padding: 30px; line-height: 1.6; }
  10. h1 { color: #4ec9b0; font-size: 26px; margin-bottom: 6px; }
  11. h2 { color: #9cdcfe; font-size: 20px; margin: 28px 0 12px; border-left: 4px solid #4ec9b0; padding-left: 10px; }
  12. .sub { color: #888; font-size: 13px; margin-bottom: 20px; }
  13. .flow { display: flex; flex-direction: column; align-items: center; gap: 0; }
  14. .step { background: #2d2d30; border: 2px solid #3c3c3c; border-radius: 8px; padding: 14px 20px; width: 760px; position: relative; }
  15. .step.start { border-color: #1a7f37; background: #14301c; }
  16. .step.phase { border-color: #4ec9b0; background: #18302c; }
  17. .step.decision { border-color: #d79a3c; background: #332a18; border-radius: 30px; }
  18. .step.done { border-color: #0e639c; background: #15293a; }
  19. .step .t { font-size: 16px; font-weight: bold; color: #fff; margin-bottom: 6px; }
  20. .step.phase .t { color: #4ec9b0; }
  21. .step .d { font-size: 13px; color: #bbb; }
  22. .step .p { font-size: 12px; color: #dcdcaa; margin-top: 8px; background: #1e1e1e; padding: 6px 10px; border-radius: 4px; font-family: Consolas, monospace; }
  23. .arrow { width: 0; height: 0; border-left: 9px solid transparent; border-right: 9px solid transparent; border-top: 14px solid #555; margin: 4px 0; }
  24. .arrow-label { font-size: 12px; color: #888; margin: 2px 0; }
  25. table { border-collapse: collapse; width: 100%; margin: 12px 0; font-size: 13px; }
  26. th, td { border: 1px solid #3c3c3c; padding: 8px 10px; text-align: left; }
  27. th { background: #252526; color: #9cdcfe; }
  28. td.param { font-family: Consolas, monospace; color: #dcdcaa; white-space: nowrap; }
  29. td.val { font-family: Consolas, monospace; color: #4ec9b0; white-space: nowrap; }
  30. .note { background: #332a18; border-left: 4px solid #d79a3c; padding: 10px 14px; margin: 14px 0; font-size: 13px; border-radius: 4px; }
  31. .loop { border: 1px dashed #d79a3c; border-radius: 8px; padding: 10px; width: 800px; margin: 4px 0; }
  32. .loop-title { color: #d79a3c; font-size: 13px; margin-bottom: 8px; text-align: center; }
  33. </style>
  34. </head>
  35. <body>
  36. <h1>自动对焦标定流程图</h1>
  37. <div class="sub">AutoFoczool · CalibrationEngine.CalibrateWell · 生成于 2026-06-16 · 所有参数取自当前代码真实默认值</div>
  38. <h2>一、整体流程(一键全自动初始化)</h2>
  39. <div class="flow">
  40. <div class="step start"><div class="t">开始:一键全自动初始化</div><div class="d">扫描设备 → 连接舱室(相机+串口) → 勾选 well → 点击启动</div>
  41. <div class="p">相机分辨率 2592×1944 · 串口 9600 8N1 · 移动读超时 12000ms / 查询读超时 3000ms</div></div>
  42. <div class="arrow"></div>
  43. <div class="step phase"><div class="t">开灯 + 准备</div><div class="d">OpenLED() → 等待 200ms → 创建 CalibrationEngine</div></div>
  44. <div class="arrow"></div>
  45. <div class="loop">
  46. <div class="loop-title">↓↓↓ 对每个勾选的 well 循环执行 ↓↓↓</div>
  47. <div class="flow">
  48. <div class="step"><div class="t">读取该 well 的 EEPROM 参数</div>
  49. <div class="d">ReadWellHorizontalPos(well) → 水平位置;ReadWellFocusZero(well) → Z零点(仅记录,粗对焦不依赖它)</div></div>
  50. <div class="arrow"></div>
  51. <div class="step"><div class="t">移到 EEPROM 水平位置 + 设中低曝光</div>
  52. <div class="d">HorizontalMoveTo(钳位后位置),失败重试最多 3 次;SetExposure(60)</div>
  53. <div class="p">水平钳位范围 [0, 220000] · 中低曝光 CenterScanExposure=60 (×100µs)</div></div>
  54. <div class="arrow"></div>
  55. <div class="arrow-label">① 粗对焦</div>
  56. <div class="step phase"><div class="t">① 粗对焦(找大致焦面)</div>
  57. <div class="d">先移到扫描起点并额外停稳,再固定中心大窗口逐层扫描,中央40%ROI算清晰度(Tenengrad÷mean),取最高分层;每层分数落盘便于排查伪峰</div>
  58. <div class="p">中心 90000 · 半幅 ±30000 → 区间 [60000,120000] · 步距 2000 → 31层 · 每层等 350ms + 丢1帧 · 开扫前额外停稳 CoarseSettleMs=2000ms</div></div>
  59. <div class="arrow"></div>
  60. <div class="arrow-label">② 水平居中</div>
  61. <div class="step phase"><div class="t">② 水平微调居中(优化Y偏移)</div>
  62. <div class="d">以EEPROM水平位为中心小范围扫描,检测well圆,选|Y偏移|最小且完整的位置</div>
  63. <div class="p">半幅 ±2000 (远小于well间距9000的一半) · 9步 → 步距≈500 · 每步等800ms · 居中容差 |Y|<12%</div></div>
  64. <div class="arrow"></div>
  65. <div class="arrow-label">③ 曝光</div>
  66. <div class="step phase"><div class="t">③ 曝光二分(well内ROI测光)</div>
  67. <div class="d">二分搜索曝光值,使well盘面亮度适中(不过曝/不死黑),按 Over/Good/Under 判定</div>
  68. <div class="p">曝光范围 [10, 800] (×100µs) · 每次设曝光后等 max(200, e/5)ms + 丢1帧</div></div>
  69. <div class="arrow"></div>
  70. <div class="arrow-label">④ 精对焦</div>
  71. <div class="step phase"><div class="t">④ 精对焦(围绕粗焦点细扫 + 平滑插值)</div>
  72. <div class="d">围绕粗对焦Z小范围密扫,well圆内0.95r ROI(未检出降级中央40%),3点平滑+抛物线插值求峰顶</div>
  73. <div class="p">半幅 ±6000 · 步距 500 → 25层 · 中心=粗对焦Z · 每层等350ms+丢1帧 · Z钳位[0,125000]</div></div>
  74. <div class="arrow"></div>
  75. <div class="step"><div class="t">移到最清晰Z + 存图 + 记录结果</div>
  76. <div class="d">VerticalMoveTo(focusZ);存标定后BMP;记录 水平/Y偏/曝光/focusZ/峰比</div>
  77. <div class="p">合格判定:|Y偏|<12% 且 检出圆 且 峰比(max/mean)>1.2</div></div>
  78. </div>
  79. </div>
  80. <div class="arrow"></div>
  81. <div class="arrow-label">所有 well 完成</div>
  82. <div class="step done"><div class="t">关灯 + 存档</div><div class="d">CloseLED();写 calibration.json;刷新缓存(转well立即用新结果)</div></div>
  83. </div>
  84. <h2>二、四个对焦阶段参数详表</h2>
  85. <table>
  86. <tr><th>阶段</th><th>电机轴</th><th>中心</th><th>范围/半幅</th><th>步距(脉冲)</th><th>层数/步数</th><th>每步延时</th><th>ROI</th></tr>
  87. <tr><td>①粗对焦</td><td>垂直Z</td><td class="val">90000(固定)</td><td class="val">±30000</td><td class="val">2000</td><td class="val">31</td><td class="val">350ms<br>(开扫前额外停稳2000ms)</td><td>中央40%</td></tr>
  88. <tr><td>②水平居中</td><td>水平</td><td class="val">EEPROM水平位</td><td class="val">±2000</td><td class="val">≈500</td><td class="val">9</td><td class="val">800ms</td><td>well圆检测</td></tr>
  89. <tr><td>③曝光二分</td><td>—</td><td>—</td><td class="val">[10,800]</td><td>二分</td><td class="val">~log₂</td><td class="val">max(200,e/5)ms</td><td>well内</td></tr>
  90. <tr><td>④精对焦</td><td>垂直Z</td><td class="val">粗对焦Z</td><td class="val">±6000</td><td class="val">500</td><td class="val">25</td><td class="val">350ms</td><td>well圆0.95r</td></tr>
  91. </table>
  92. <h2>三、电机行程限位(安全钳位)</h2>
  93. <table>
  94. <tr><th>轴</th><th>下限</th><th>上限</th><th>说明</th></tr>
  95. <tr><td>水平(皿孔旋转)</td><td class="val">0</td><td class="val">220000</td><td>实测16个well EEPROM位置 70800~205800,间距约9000</td></tr>
  96. <tr><td>垂直Z(对焦)</td><td class="val">0</td><td class="val">125000</td><td>旧工程软上限;实测焦面集中在 86000~92000</td></tr>
  97. </table>
  98. <div class="note">所有 HorizontalMoveTo / VerticalMoveTo 调用前都经 ClampH / ClampZ 钳位,越界写日志并截断到边界,防止撞机械限位。</div>
  99. <h2>四、清晰度算法(Sharpness.Compute)</h2>
  100. <table>
  101. <tr><th>项</th><th>值/说明</th></tr>
  102. <tr><td>主指标</td><td class="val">Tenengrad(Sobel梯度幅值平方和)</td></tr>
  103. <tr><td>归一化</td><td class="val">sumSq / 像素数 / mean(除以亮度均值一次方)</td></tr>
  104. <tr><td>峰值精修</td><td>3点滑动平均平滑 + 抛物线插值峰顶</td></tr>
  105. <tr><td>对焦质量</td><td>峰比 max/mean,&lt;1.2 判定弱峰(可能空well/对焦失败)并告警</td></tr>
  106. </table>
  107. <div class="note">注:归一化用 ÷mean 而非 ÷mean²。早期用 ÷mean² 会因 Z 增大时画面变亮而把清晰帧压垮,导致选错最暗最糊层。改 ÷mean 后峰值正确落在真实焦面。</div>
  108. <h2>五、串口协议关键参数</h2>
  109. <table>
  110. <tr><th>项</th><th>值</th></tr>
  111. <tr><td>波特率</td><td class="val">9600 8N1</td></tr>
  112. <tr><td>移动类命令读超时(CMD_MOTOR=0x05)</td><td class="val">12000ms(覆盖大行程移动到位耗时)</td></tr>
  113. <tr><td>查询类命令读超时(握手/读EEPROM/读位置)</td><td class="val">3000ms</td></tr>
  114. <tr><td>电机到位延时 MotorDelayMs</td><td class="val">默认1500ms(扫描时用更短的350/800ms提速)</td></tr>
  115. </table>
  116. <div class="note">移动命令是开环+固定延时:下位机回复只代表"收到指令",机械到位靠延时保证。大行程移动耗时随距离增长,故移动类读超时给到12秒。</div>
  117. </body>
  118. </html>