Skip to content

feature:F8 ハンコン軸割り当て設定(軸index + 生レンジ校正 + GT_WheelProbe + Web UI) #45

Description

@GT-karny

背景

feature:F8 — ハンコン接続時の軸割り当て(ペダル系・ステア)を設定可能にする。

F8 以前、SDL2WheelInput は軸の並び(0=ステア/1=スロットル/2=ブレーキ/3=クラッチ)と G29 のペダル生値規約(解放=+32767, 全踏み=-32768)をコードに固定していた。どちらもデバイス側の事実であり、Logitech G923 は軸の並びが異なることが観測されたため、「ブレーキを踏むとクラッチが動く」状態を設定で回避できなかった。

実装内容

  • WheelAxisMapping(SDL非依存の純関数): 軸index + 生レンジ校正。ペダルは raw_released/raw_full のペアで極性を内包(invertフラグを持たない)。ステアのみ steer_invert
  • manual_drive.json / virtual_driver.json に設定キー(既定値は G29 レイアウト=F8以前と同一挙動)
  • SDL2WheelInput / SDLFFBSink を mapping 経由に。steer_invertSignFactor() 1か所から読み、軸読み戻しと CONSTANT 出力の両方に同じ係数を掛ける(feature:F7 のサーボが目標から遠ざかる正のフィードバックになるのを防ぐ)
  • GT_WheelProbe(新規・読み取り専用SDL2プローブ)+ Web UI「Axis Mapping」節(ライブバー・Detect・生値校正)
  • ブラウザ Gamepad API は軸には使わない(独自index空間のため誤割り当てを生む)

検証: gate:unit-ctesttest_WheelAxisMapping 16ケース(GT_ENABLE_SDL2 非依存)、backend pytest 12ケース。

残タスク

  • 実機 G923 での軸レイアウト確認と実走行検証(手元は G29、かつ後述の理由で現在値を報告していない)
  • FFB 反転(steer_invert=true)の実機確認。初回は ffb.safety_max_saturation_seconds を有効にして実施
  • ボタン割り当ての learn も Gamepad API 依存のまま(probe 経由に寄せる余地あり・別件)
  • simulation_runner._write_manual_drive_config が base の adas/adas_buttons/input_scripted ブロックを落とす既存不具合(GUI起動の手動走行でADAS設定が消える・別件)

実機の非自明な観測(2026-08-06)

接続済み G29 が列挙(名前・軸数4・ボタン数25すべて正しく取得)されるのに全軸 raw=0 を返し続けた。独立計器(PySDL2 / SDL 2.32.10)でも同一、SDLバックエンドヒント(HIDAPI/RAWINPUT/DINPUT)を振っても同一 → コード側ではなくデバイス状態(電源系の疑い)。

G29 のペダル規約では raw=0 は正規化 0.4999…(≒半踏み)になるため、正規化値だけを描く UI は「何も言っていないホイール」を「ペダル半踏み」と表示してしまう。対策として probe は軸ごとの reported(開始以降に非ゼロを報告したか)を返し、UI は未報告軸を no report と表示する。

関連: feature:F7 gate:unit-ctest

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions