소스 검색

fix(focus): 粗对焦开扫前先到位+停稳2秒,修复复位后大行程运动帧伪峰

根因(日志逐层分数实锤):手动复位把Z打到远端2000,正式标定Z大行程冲到起点60000,
粗对焦每层仅等350ms,前几层在电机未停稳时抓到运动拖影帧,z=74000拍到5.30伪峰
骗过粗对焦(精对焦回到同一Z仅3.21无峰);未复位时86000真峰6.76完好。
- 开扫前先VerticalMoveTo(起点)+Thread.Sleep(CoarseSettleMs=2000)+丢帧
- 新增可配置 CoarseSettleMs(默认2000)
- 后续可改轮询回读位置确认到位,更精准(暂用延时)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
huangjie 1 주 전
부모
커밋
516f02a240
1개의 변경된 파일12개의 추가작업 그리고 0개의 파일을 삭제
  1. 12 0
      Calib/CalibrationEngine.cs

+ 12 - 0
Calib/CalibrationEngine.cs

@@ -63,6 +63,9 @@ namespace AutoFocusTool.Calib
         public int ZCoarseHalf = 30000;
         /// <summary>Z 粗对焦步距 → 约 31 层。</summary>
         public int ZCoarseStep = 2000;
+        /// <summary>粗对焦开扫前的额外停稳等待(ms)。复位后Z大行程冲到起点需充分停稳,
+        /// 否则前几层抓到运动拖影帧形成伪峰。默认2000。</summary>
+        public int CoarseSettleMs = 2000;
 
         // ── Z 精对焦(围绕粗峰)──
         /// <summary>精对焦半幅(覆盖粗扫 ±2000 峰定位误差并留余量)。</summary>
@@ -342,6 +345,15 @@ namespace AutoFocusTool.Calib
             // P0-6: 粗对焦使用中央40%区域ROI,避免背景干扰
             var centerROI = CenterRoi40();
 
+            // 【偶发伪峰修复 2026-06-16】先移到扫描起点并额外等待,确保大行程移动停稳后再开扫。
+            // 根因:手动复位会把 Z 打到远端(2000),正式标定时 Z 要大行程冲到 lo(60000);
+            // 若直接逐层扫描,前几层在电机尚未停稳时抓到“运动拖影帧”,高频被放大成伪峰
+            // (实测 z=74000 拍到 5.30 伪峰,骗过粗对焦;精对焦回到同一 Z 仅 3.21 无峰)。
+            // 故开扫前先到位 + 额外停稳等待。(后续可改“轮询回读位置确认到位”更精准,暂用延时。)
+            _motor.VerticalMoveTo(ClampZ(lo), ScanDelayMs);
+            Thread.Sleep(CoarseSettleMs);
+            Grab(); // 丢弃到位前的残留帧
+
             int layers = 0;
             for (int z = lo; z <= hi; z += ZCoarseStep)
             {