滑鼠轉向標定(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 |
手動係數(正數自動取負修正) |
二、功能演進史
- 只標定(13:15 起)→ 無 W 長按,讀數全 0,無效。
- 加 W 長按重新整理朝向(13:26)→ 標定資料首次有效。
- 加單角度驗證(16:43)→ +90° 驗證閉環。
- 加多角度驗證(16:49)→ 4 個角度列表。
- 加多位移標定(16:55)→ 200/400/600/1000 計劃。
- 加轉向後等待(17:01)→ 解耦轉向完成與 W 重新整理朝向,用於排除時序假設。
- 加左右成對驗證(17:09)→ 每角度自動補反方向,用於排查左右不對稱。
- 加手動係數自動取負(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°,與此輪起點位置的地形影響一致。
四、跨輪穩定結論
- 左轉(dx<0)表现稳定:各轮 -400→+30
32°、-600→+45.550.5°、-1000→+76.587°,大位移 k 稳定在 **-0.076-0.084**。 - 右转(dx>0)受起點/地形影響大:同一位移在不同起點差 8~12°。
- 推薦係數 ≈ -0.082 ~ -0.084 °/px(17:13 輪最對稱、std 最小 0.004)。
- 1000px ≈ 84°,600px ≈ 50°,400px ≈ 33°,90° ≈ 1080px。
- +200 是小位移異常區(k 偏大 40%),已從標定列表移除。
- 大角度(99°)誤差始終偏大(±4~14°)→ 正式使用建議分段轉向。
五、鏡頭偏心假設分析(使用者提出:畫面裡角色始終偏左)
使用者的觀察本身成立——很多 3D 遊戲鏡頭偏心(給前方更多視野),角色顯得偏左/偏下。但資料上排除固定鏡頭偏心:
- 固定偏心在 Δyaw 中相消:若鏡頭固定偏心造成箭頭讀數帶上固定偏差 δ(不隨朝向變),則
(after+δ) - (before+δ) = after - before,δ 直接消失,不影響 k。 - 決定性證據——不對稱隨起點反轉:固定偏心是空間固定、方向無關的量,若它讓右轉偏大,換任何起點都應右轉偏大。但 112°→257°(差約 145°)偏大方向整個反轉。沒有任何固定偏心能解釋。
- 唯一自洽解釋仍是地形:箭頭讀的是角色按 W 前進的面朝方向,坡度把角色帶偏;不同起點走過坡的方式不同 → 偏大方向隨之反轉。
- 程式碼層已排除傳送不對稱:
send_mouse_delta用user32.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 日誌,杜絕再犯。
七、後續建議
- 換平地重測確認地形假設(當前唯一待辦實驗)。
- 起點朝向對齊:正式轉向任務建議先對齊起點朝向再轉向,降低地形影響。
- 正式轉向用小角度分段:每步 ≤30°(≈360px),並按方向分系數(k_pos / k_neg)使用。
- 狀態判定小修:建議「兩次驗證都 FAIL 才判 FAIL,單次 FAIL 判 WARN」改為「兩次都 FAIL 判 FAIL」更嚴格,當前實現可能漏報。
附:相關檔案
- 任務原始碼:
src/tasks/test/MouseRotationCalibration.py - 執行配置:
configs/MouseRotationCalibration.json - 單元測試:
tests/TestMouseRotationCalibration.py(12 個用例全過) - 滑鼠傳送層:
src/interaction/Mouse.py(send_mouse_delta,正負對稱) - 核心 API:
src/core/base_mixin/runtime_mixin.py(get_arrow_angle/press_key/active_and_send_mouse_delta)