滑鼠轉向標定(MouseRotationCalibration)調查彙總

日期:2026-08-08 涉及任務:src/tasks/test/MouseRotationCalibration.py 結論狀態:核心結論已定,待平地複測確認地形假設

一、任務簡介

MouseRotationCalibration 是 debug 可見的測試任務,用於標定「滑鼠橫向位移畫素 ↔ 角色視角轉動角度」的換算係數:

$$k = \frac{\Delta yaw}{dx} = \frac{after - before}{dx}$$

  • 滑鼠右移 dx>0 → 視角左轉 Δyaw<0,故 k 恆為負
  • 係數為「°/px」,標定後可用於把目標轉向角度換算為滑鼠位移:dx = round(target_yaw / k)
  • 不持久化,每次執行標定;也支援手動填係數跳過標定直接驗證。

配置鍵(13 個)

配置鍵 當前值 說明
标定位移dx 400 單位移標定時用
标定位移列表(逗号分隔) 400,600,1000 多位移標定計劃
重复次数 4 每位移取樣次數
W长按时间(秒) 0.2 按 W 重新整理朝向的保持時長
角度刷新等待(秒) 1.0 按 W 後等箭頭重新整理
转向后等待(秒) 0.3 發滑鼠位移後等轉向穩定
最低置信度 0.6 箭頭 OCR 置信度門檻
验证目标角度(度) 90.0 單角度驗證用
验证角度列表(逗号分隔) 44,55,77,99 多角度驗證計劃
验证次数 2 每角度驗證次數
验证误差容差(度) 5.0 PASS 容差
左右方向成对验证 true 每個角度自動補反方向
手动yaw_per_pixel(留空用标定) -0.083 手動係數(正數自動取負修正)

二、功能演進史

  1. 只標定(13:15 起)→ 無 W 長按,讀數全 0,無效。
  2. 加 W 長按重新整理朝向(13:26)→ 標定資料首次有效。
  3. 加單角度驗證(16:43)→ +90° 驗證閉環。
  4. 加多角度驗證(16:49)→ 4 個角度列表。
  5. 加多位移標定(16:55)→ 200/400/600/1000 計劃。
  6. 加轉向後等待(17:01)→ 解耦轉向完成與 W 重新整理朝向,用於排除時序假設。
  7. 加左右成對驗證(17:09)→ 每角度自動補反方向,用於排查左右不對稱。
  8. 加手動係數自動取負(17:31 前)→ 防止符號填錯。

三、全部執行輪次資料

3.1 除錯期(13:15-13:26)——無有效資料

時間 配置 現象
13:15 dx=100, refresh=0.1 角度幾乎不動(Δ≈0)→ W 未長按,朝向不重新整理
13:16 dx=400, refresh=1.0 前 2 樣本 Δ=0,後 2 樣本 Δ=7~9° → 重新整理不穩
13:17 dx=400 全部 Δ=0,完全沒反應
13:26 w_hold=0.3 ✅ 首次有效:+400→-39.5°、-400→+34.5°

關鍵結論:加 W长按时间=0.3 後測量才成立——瞬時按鍵不足以讓角色位移重新整理箭頭。

3.2 正式標定期(16:34-16:56)

時間 配置 mean_k k_pos k_neg 驗證
16:34 dx=400×4 -0.08063 -0.08625 -0.07500
16:43 dx=400×4 -0.09937 -0.12375* -0.07500 +90° ✅ 誤差 0.5°
16:49 dx=400×4 -0.08063 -0.08625 -0.07500 +44/55/77/99 全 PASS
16:55 多位移 200..1000 -0.08493 -0.09527 -0.07458 +44/55/77/99 全 PASS

* 16:43 的 sample1 因 before=142(起點未復位)產生異常 k=-0.16125。

3.3 時序實驗期(17:01-17:05)——排除時序

時間 配置 mean_k k_pos k_neg
17:01 turn_settle=1.3 -0.08522 -0.09590 -0.07454
17:05 去 +200,6 樣本 -0.08224 -0.08842 -0.07606

結論:1.3s 與 0.3s 資料逐位一致 → 排除「轉向沒轉完就被 W 打斷」的時序假設。 另:+200 兩次 k=-0.115/-0.1175(偏大 40%),刪除後 std 從 0.0143 降到 0.0071。

3.4 左右成對驗證期(17:09-17:23)——發現地形真相

時間 起點yaw mean_k k_pos k_neg 差距 驗證亮點
17:09 ~112° -0.08369 -0.09133 -0.07606 右大 20% -44° FAIL(-6°)
17:13 ~4° -0.08253 -0.08217 -0.08289 幾乎對稱 +44 FAIL(-7°), -99 FAIL(-11°)
17:22 ~257° -0.09031 -0.08258 -0.09803 左大 19% 大角度 3 項 WARN

決定性發現:不對稱方向隨起點約 180° 反轉 → 排除遊戲左右靈敏度不對稱;真兇是測試點地形(按 W 前進時角色被坡度帶偏)。

3.5 手動係數期(17:27-17:32)——符號事故 + 驗證成功

時間 手動係數 結果
17:27 +0.083(符號反了 8/8 全 FAIL,誤差 84~207°(方向全反)
17:30 +0.083(未改) 繼續全 FAIL
17:31 -0.083 方向恢復,誤差收斂到 ±7° 內

17:31 輪(手動 -0.083)逐角度明細:

角度 實際均值 誤差 狀態
+44° +43.0° -1.0° PASS
-44° -50.5° -6.5° WARN
+55° +55.5° +0.5° PASS
-55° -60.0° -5.0° PASS
+77° +80.5° +3.5° PASS
-77° -83.5° -6.5° WARN
+99° +93.5° -5.5° WARN
-99° -103.0° -4.0° WARN

正方向基本正常(≤3.5°),負方向普遍偏 5~6.5°,與此輪起點位置的地形影響一致。

四、跨輪穩定結論

  1. 左轉(dx<0)表现稳定:各轮 -400→+3032°、-600→+45.550.5°、-1000→+76.587°,大位移 k 稳定在 **-0.076-0.084**。
  2. 右转(dx>0)受起點/地形影響大:同一位移在不同起點差 8~12°。
  3. 推薦係數 ≈ -0.082 ~ -0.084 °/px(17:13 輪最對稱、std 最小 0.004)。
    • 1000px ≈ 84°,600px ≈ 50°,400px ≈ 33°,90° ≈ 1080px。
  4. +200 是小位移異常區(k 偏大 40%),已從標定列表移除。
  5. 大角度(99°)誤差始終偏大(±4~14°)→ 正式使用建議分段轉向。

五、鏡頭偏心假設分析(使用者提出:畫面裡角色始終偏左)

使用者的觀察本身成立——很多 3D 遊戲鏡頭偏心(給前方更多視野),角色顯得偏左/偏下。但資料上排除固定鏡頭偏心:

  1. 固定偏心在 Δyaw 中相消:若鏡頭固定偏心造成箭頭讀數帶上固定偏差 δ(不隨朝向變),則 (after+δ) - (before+δ) = after - before,δ 直接消失,不影響 k。
  2. 決定性證據——不對稱隨起點反轉:固定偏心是空間固定、方向無關的量,若它讓右轉偏大,換任何起點都應右轉偏大。但 112°→257°(差約 145°)偏大方向整個反轉。沒有任何固定偏心能解釋。
  3. 唯一自洽解釋仍是地形:箭頭讀的是角色按 W 前進的面朝方向,坡度把角色帶偏;不同起點走過坡的方式不同 → 偏大方向隨之反轉。
  4. 程式碼層已排除傳送不對稱send_mouse_deltauser32.mouse_event(MOUSEEVENTF_MOVE, dx, 0, 0, 0) 正負直接透傳,完全對稱。

一錘定音驗證方法

找一塊完全平坦、開闊的地方(廣場/平地)重跑「標定 + 左右成對驗證」:

  • k_pos ≈ k_neg(差 < 2%)、8 角度基本全 PASS → 地形假設確認,鏡頭偏心排除;
  • 仍明顯不對稱 → 才輪到鏡頭/遊戲機制問題。

肉眼輔助:按 W 前進時盯箭頭方向,若箭頭慢慢漂移(而非紋絲不動),即地形在帶偏角色——最直接的證據。

六、符號事故復盤

  • 使用者曾在 手动yaw_per_pixel"0.083"(應為負數)。
  • 症狀:+44° 目標用 dx=+530 右移反而轉到 -41°,誤差 84°~207°,方向全反。
  • 處理:1) 配置檔案修正為 "-0.083";2) 程式碼在手動係數為正時自動取負修正並 notify 日誌,杜絕再犯。

七、後續建議

  1. 換平地重測確認地形假設(當前唯一待辦實驗)。
  2. 起點朝向對齊:正式轉向任務建議先對齊起點朝向再轉向,降低地形影響。
  3. 正式轉向用小角度分段:每步 ≤30°(≈360px),並按方向分系數(k_pos / k_neg)使用。
  4. 狀態判定小修:建議「兩次驗證都 FAIL 才判 FAIL,單次 FAIL 判 WARN」改為「兩次都 FAIL 判 FAIL」更嚴格,當前實現可能漏報。

附:相關檔案

  • 任務原始碼:src/tasks/test/MouseRotationCalibration.py
  • 執行配置:configs/MouseRotationCalibration.json
  • 單元測試:tests/TestMouseRotationCalibration.py(12 個用例全過)
  • 滑鼠傳送層:src/interaction/Mouse.pysend_mouse_delta,正負對稱)
  • 核心 API:src/core/base_mixin/runtime_mixin.pyget_arrow_angle / press_key / active_and_send_mouse_delta
在 GitHub 查看來源 ↗ · 頁面產生時間: 2026年8月10日