# StampFly Physical Parameters — Single Source of Truth (SSOT)
# StampFly 物理パラメータ — 唯一の正（Single Source of Truth）
#
# This file is read by `sf params generate` (tools/params_audit/generate.py),
# which machine-generates:
#   - tools/sysid/_generated_params.py           (flat Python constants)
#   - simulator/sils/plant/generated_params.hpp   (C++ constexpr constants)
#   - the <!-- AUTO-GENERATED:params --> marker table in
#     docs/architecture/stampfly-parameters.md (JP + EN)
#
# To change a value: edit this file, run `sf params generate`, then commit
# both this file and the regenerated outputs. Never hand-edit a generated
# file directly — `sf params generate --check` (also run in CI) fails if a
# generated file has drifted from this source.
#
# 本ファイルは `sf params generate`（tools/params_audit/generate.py）が読み込み、
# 以下を機械生成する:
#   - tools/sysid/_generated_params.py           （フラットな Python 定数）
#   - simulator/sils/plant/generated_params.hpp   （C++ constexpr 定数）
#   - docs/architecture/stampfly-parameters.md 内の
#     <!-- AUTO-GENERATED:params --> マーカー表（日本語・英語）
#
# 値を変更する手順: 本ファイルを編集 → `sf params generate` を実行 →
# 本ファイルと生成物の両方をコミットする。生成物を直接手編集しないこと —
# `sf params generate --check`（CIでも実行）が、生成物が本ファイルから
# 乖離していれば失敗する。

meta:
  updated: "2026-08-03"
  description:
    ja: >
      StampFly の機体物理パラメータ（幾何・剛体慣性・モータ／プロペラの
      電気機械係数）を集約する。control/README.md が定義する models/
      の用途（数学モデル・同定結果置き場）に沿う。較正（モータ実測）に
      依存しない値は constants に、実測キャンペーンごとに連動する値の
      組は calibration_sets に分ける。
    en: >
      Consolidates StampFly's vehicle physical parameters (geometry, rigid-
      body inertia, motor/propeller electromechanical coefficients).
      Matches the role of models/ documented in control/README.md
      (mathematical models and system-identification results). Values that
      do not depend on a motor-measurement campaign live under constants;
      values that are coupled within one measurement campaign are grouped
      under calibration_sets.

# ==============================================================================
# Calibration-independent geometry & rigid-body inertia.
# 較正（モータ実測キャンペーン）に依存しない機体形状・剛体慣性。
#
# NOTE: as of Phase 1 these constants are NOT yet wired into
# tools/sysid/defaults.py's DEFAULT_PARAMS (which keeps its own hand-written
# literals for mass/Ixx/Iyy/Izz/arm_length, per the Phase-1 task scope) — only
# tools/params_audit/params_manifest.py's EXPECTED_* comparison values and
# simulator/sils/plant/generated_params.hpp draw from here. Wiring
# DEFAULT_PARAMS itself to this file is left to a future phase.
# 注: Phase 1 時点ではこれらの定数は tools/sysid/defaults.py の
# DEFAULT_PARAMS（mass/Ixx/Iyy/Izz/arm_length は引き続き手書きリテラルを保持、
# Phase 1 のタスク範囲による）へは未配線 — ここから値を引くのは
# tools/params_audit/params_manifest.py の EXPECTED_* 比較値と
# simulator/sils/plant/generated_params.hpp のみ。DEFAULT_PARAMS 自体の配線は
# 将来フェーズに委ねる。
# ==============================================================================
constants:
  mass:
    value: 0.037
    unit: "kg"
    date: "2026-03-31"
    source: >
      実測36.8g。ファームウェア反映は commit 43841314
      "fix(control): update vehicle mass to 37g for accurate hover thrust"
      （2026-03-31）。シミュレータ側（旧0.035kg）は2026-07-24に統一
      （更新漏れであり個体差ではないと確認済み）。
  Ixx:
    value: 9.16e-6
    unit: "kg·m²"
    date: "unknown"
    source: >
      Roll慣性モーメント。出所文書は未特定（tools/sysid/defaults.py 由来、
      全実装で既に一致済み — params_manifest.py の「既に一致済みの正常
      参照ケース」コメント参照）。
  Iyy:
    value: 13.3e-6
    unit: "kg·m²"
    date: "unknown"
    source: "Pitch慣性モーメント。出所文書は未特定（全実装で既に一致済み）。"
  Izz:
    value: 20.4e-6
    unit: "kg·m²"
    date: "unknown"
    source: "Yaw慣性モーメント。出所文書は未特定（全実装で既に一致済み）。"
  arm_offset:
    value: 0.023
    unit: "m"
    date: "unknown"
    source: >
      モーメントアーム（重心→モータの X/Y オフセット）。出所文書は未特定
      （全実装で既に一致済み）。対角のモーター間距離は 2×arm_offset/√2×2
      = 0.065 m（アーム長 0.0325 m = arm_offset×√2、docs/architecture/
      stampfly-parameters.md §2「機体形状」参照）。
  urdf_base_mass:
    value: 0.033
    unit: "kg"
    date: "2026-07-24"
    source: >
      simulator/shared/assets/meshes/parts/stampfly.urdf の base_link
      単体質量。base_link(0.033) + 4×プロペラリンク(各0.001) = mass(0.037)。
      独立した実測値ではなく mass からの差し引きで決まる表現上の値
      （tools/params_audit/params_manifest.py EXPECTED_URDF_BASE_MASS 参照）。

# ==============================================================================
# Motor/propeller electromechanical coefficient sets. Values inside ONE set
# are coupled (derived/cross-checked together) — never swap a single member
# of a set without re-deriving the others.
# モータ／プロペラの電気機械係数セット。1セット内の値は連動しており
# （互いに導出・整合検証されているため）、セット内の1値だけを差し替えては
# ならない。
# ==============================================================================
calibration_sets:
  # Current adopted family — Cq/Jmp/Dm/Qf/Rm/Km are confirmed by the
  # 2026-07-15..17 measurement campaign (multicopter_introduction qa_log
  # Q4-9..13) plus the 2026-07-26 coast-down 3-term refit (Dm/Qf). Ct is a
  # PROVISIONAL value as of 2026-08-03 (see the Ct entry's own note below --
  # the 2026-07-15 thrust-stand figure was retracted for lack of a valid
  # simultaneous voltage/RPM/thrust measurement on the new propeller). As of
  # 2026-07-26 (backlog #2, motor ODE) simulator/sils/plant/plant.hpp sources
  # Ct/Cq/Jmp/Dm/Qf/Rm/Km/kappa directly from this set via
  # generated_params.hpp (sils_params::adopted::*) -- the legacy_motor_curve
  # set below (Am/Bm/Cm static V-omega curve) is retired from plant.hpp
  # entirely, replaced by the electromechanical ODE.
  # firmware/vehicle/components/sf_actuator/actuator.cpp's MOTOR_CT now
  # matches this set's adopted (provisional) Ct value -- numerically
  # unchanged across the 2026-08-03 retraction, since the provisional value
  # happens to equal the pre-2026-07-15 legacy_motor_curve.Ct below.
  # 現行採用ファミリ — Cq/Jmp/Dm/Qf/Rm/Km は2026-07-15〜17測定キャンペーン
  # （multicopter_introduction qa_log Q4-9..13）に加え、2026-07-26 の
  # コーストダウン3項再フィット（Dm/Qf）で確定。Ct は2026-08-03時点で暫定値
  # （下の Ct エントリの note 参照 -- 2026-07-15 のthrust stand値は、新
  # プロペラでの電圧/回転数/推力の有効な同時計測を欠くため撤回）。
  # 2026-07-26（バックログ#2、モータODE化）時点で simulator/sils/plant/
  # plant.hpp は Ct/Cq/Jmp/Dm/Qf/Rm/Km/kappa を全て本セットから
  # generated_params.hpp（sils_params::adopted::*）経由で直接参照する --
  # 下記 legacy_motor_curve（Am/Bm/Cm 静的V-ω曲線）は plant.hpp から完全
  # 撤退し ODE に置換された。
  # firmware/vehicle/components/sf_actuator/actuator.cpp の MOTOR_CT は
  # 本セットの採用（暫定）Ct 値と一致する -- 暫定値がたまたま下記
  # legacy_motor_curve.Ct（2026-07-15以前の旧値）と同値のため、
  # 2026-08-03の撤回をまたいで数値上の変更はない。
  measured_2026_07:
    status: adopted
    coupled: true
    params:
      Ct:
        value: 1.00e-8
        unit: "N/(rad/s)²"
        method: "暫定採用（同径プロペラの過去実測＋理論シミュレーション整合、ベンチ同時計測待ち）"
        method_en: "Provisional adoption (past same-diameter-propeller measurement + theoretical simulation consistency; pending bench co-measurement)"
        date: "2026-08-03"
        note: >
          新プロペラでは印加電圧・回転数・推力の3量同時計測が一度も行われて
          おらず、2026-07-15のthrust stand値は撤回（計測待ち）。暫定値
          1.00e-8 の拠り所: (1) 同径プロペラでの過去の確からしい実測、(2)
          理論に基づくシミュレーションとの整合。ベンチでのV-ω-T同時計測に
          より確定させること。T = Ct·ω²。simulator/sils/plant/plant.hpp は
          本値へ切替済み（2026-07-26 ODE化、backlog #2、値自体は2026-08-03
          改定）。firmware actuator.cpp の MOTOR_CT は本値と数値一致
          （backlog #3 のファーム側切替を待たず、暫定値が旧リテラルと
          一致したため実質的に揃っている）。
      Cq:
        value: 4.10e-11
        unit: "N·m/(rad/s)²"
        method: "コーストダウン法"
        method_en: "Coast-down method"
        date: "2026-07-15"
        note: "Q = Cq·ω²。plant.hpp は独立した Cq 定数を持たない（反トルクは kappa·T で計算）。"
      Jmp:
        value: 1.375e-8
        unit: "kg·m²"
        method: "写真法+諸元法（プロペラ写真デジタイズ+画素積分＋コーストダウン）"
        method_en: "Photographic + spec-sheet method (propeller photo digitization + pixel integration + coast-down)"
        date: "2026-07-15"
      Rm:
        value: 0.593
        unit: "Ω"
        method: "論文LCRメータ実測"
        method_en: "Paper's LCR meter measurement"
        date: "2026-07-15"
        decision: "先生決定、commit 9a656a9f（実測2026-07-15／決着2026-07-24）"
        note: >
          旧候補0.34Ω（別個体疑いの旧LCR実測）・0.63Ω（vpython側の更新漏れの
          旧初期値）は競合する実測ではなく更新漏れと判明。0.593Ωに統一。
      Km:
        value: 5.682e-4
        unit: "V/(rad/s)"
        method: "コーストダウン開回路EMF実測（SCPI公式換算）"
        method_en: "Coast-down open-circuit EMF measurement (SCPI-formula conversion)"
        date: "2026-07-16"
        note: >
          式 Cq×Rm/Am による参考計算（4.51e-4）とは約20.6%ずれるが、
          docs/architecture/stampfly-parameters.md §3「派生パラメータ」の
          脚注で解明済み（Am/Bm/Cmが旧ファミリの代数的言い換えのため）。
          採用値は本直接実測。
      Dm:
        value: 0.0
        unit: "N·m·s/rad"
        method: "コーストダウン3項フィット ω̇=−a·ω²−b·ω−c の b 項（下限拘束）"
        method_en: "Coast-down 3-term fit ω̇=−a·ω²−b·ω−c, b term (lower-bound constrained)"
        date: "2026-07-26"
        note: >
          コーストダウン3項フィット ω̇=−a·ω²−b·ω−c の b≈0（下限拘束・粘性摩擦は
          検出されず）／c=691.41 rad/s² × J_total、2026-07-26 再実行で数値確定。
          τ_eff検算: ホバ点 ω_h=3670 rad/s で τ_eff=Jmp/(Km²/Rm+Dm+2·Cq·ω_h)=
          16.26ms（qa_logの16.3msと一致）。legacy_motor_curve.Dm(3.69e-8、旧
          Am/Bm/Cmの代数的言い換え)とは別系統のフィット——単独差し替え不可。
      Qf:
        value: 9.507e-6
        unit: "N·m"
        method: "コーストダウン3項フィット ω̇=−a·ω²−b·ω−c の c 項 × Jmp"
        method_en: "Coast-down 3-term fit ω̇=−a·ω²−b·ω−c, c term × Jmp"
        date: "2026-07-26"
        note: >
          c=691.41 rad/s² × Jmp(1.375e-8 kg·m²) = 9.507e-6 N·m。既知の
          τ_c≈9.5e-6（旧知見）と一致。2026-07-26 再実行で数値確定。
      kappa_adopted:
        value: 4.10e-3
        unit: "m"
        method: "kappa = Cq/Ct（丸め不要、厳密値）"
        method_en: "kappa = Cq/Ct (exact, no rounding needed)"
        date: "2026-08-03"
        note: >
          Cq/Ct = 4.10e-11/1.00e-8 = 4.10e-3、丸め誤差なしで derived.kappa
          と厳密一致（Ct が2026-08-03に上記の暫定値へ改定されたため、割り
          切れる関係になった）。旧採用値は撤回された2026-07-15のthrust
          stand Ct から導かれていたため、2026-08-03にこの値へ改定。ファーム
          は rate.yaw.kp / rate.yaw.max_torque を旧κとの比で同率再スケール
          し、物理ヨートルク出力を恒等に保って切替（2026-07-17の同種
          再スケール前例に倣う。firmware/vehicle/components/sf_core/
          params.cpp 参照）。
    derived:
      # Computed by the generator — do not hand-write a numeric literal here.
      # 生成器が計算する — ここに数値リテラルを手書きしないこと。
      kappa: "Cq / Ct"                # 完全精度。_generated_params.py の _KAPPA_VALUE に対応
      Am_consistent: "Rm * Cq / Km"   # 参考値のみ（バックログ#3用）。どの生成物からも実消費されない

  # Legacy electrical family. As of 2026-07-26 (backlog #2, motor ODE)
  # simulator/sils/plant/plant.hpp no longer references ANY member of this set
  # (Config::motor_Am/motor_Bm/motor_Cm and the static-curve Config::Ct were
  # removed together with solveOmega() -- replaced by the electromechanical
  # ODE sourced from measured_2026_07 above). Am/Bm/Cm still have a surviving
  # consumer (firmware/vehicle/components/sf_actuator/actuator.cpp's
  # MOTOR_AM/MOTOR_BM/MOTOR_CM). This set's Ct (1.00e-8) is no longer just a
  # historical value: as of 2026-08-03 it IS the adopted family's provisional
  # Ct too (measured_2026_07.Ct above) -- see that entry's note for why. Kept
  # in the SSOT for historical reference (V-ω curve coefficients, pre-
  # 2026-07-14 measurement) and pending the ongoing bench V-ω-T
  # co-measurement that will confirm or replace the provisional Ct.
  # UPDATE (2026-08-22): "surviving consumer" above must now be read as
  # "consumer of the same functional form", not a literal numeric match --
  # actuator.cpp's MOTOR_AM/MOTOR_BM/MOTOR_CM hold the flight_anchored_
  # motor_curve values below (this family's Am/Bm/Cm folded together with the
  # flight-verified hover.thrust_corr=1.12), not these raw Am/Bm/Cm anymore.
  # This family's Am/Bm/Cm are kept UNCHANGED as the historical experimental-
  # identification record (do not edit their numeric values) -- see
  # flight_anchored_motor_curve below for what the firmware currently loads
  # and why.
  # 旧電気系ファミリ。2026-07-26（バックログ#2、モータODE化）時点で
  # simulator/sils/plant/plant.hpp は本セットのどのメンバーも参照しない
  # （Config::motor_Am/motor_Bm/motor_Cm と静的曲線版 Config::Ct は
  # solveOmega() と共に撤去——上の measured_2026_07 由来の電気機械ODEに
  # 置換済み）。Am/Bm/Cm は引き続き消費者が残る（firmware/vehicle/
  # components/sf_actuator/actuator.cpp の MOTOR_AM/MOTOR_BM/MOTOR_CM）。
  # 本セットの Ct（1.00e-8）はもはや単なる歴史的な値ではない——2026-08-03
  # 時点で採用ファミリの暫定 Ct（上の measured_2026_07.Ct）と同じ値になった
  # （理由は同エントリの note 参照）。歴史的参照（V-ω曲線係数、
  # 2026-07-14以前の実測）として、また進行中のベンチ V-ω-T 同時計測が
  # 暫定 Ct を確定／置換するまでの参照用に SSOT に残す。
  # 追記（2026-08-22）: 上記「消費者が残る」は「同じ関数形の消費者」という
  # 意味に読み替えること——数値が一致するわけではない。actuator.cpp の
  # MOTOR_AM/MOTOR_BM/MOTOR_CM は現在、下記 flight_anchored_motor_curve の値
  # （本ファミリの Am/Bm/Cm と、飛行実証済みの hover.thrust_corr=1.12 を
  # 畳み込んだもの）を保持しており、本ファミリの生の Am/Bm/Cm ではない。
  # 本ファミリの Am/Bm/Cm は実験同定の記録として値を変更せず保存する
  # （数値は編集しないこと）——ファームが現在読み込む値とその理由は
  # 下記 flight_anchored_motor_curve を参照。
  legacy_motor_curve:
    status: frozen_for_implementation
    coupled: true
    params:
      Ct:
        value: 1.00e-8
        unit: "N/(rad/s)²"
        note: >
          旧モータ曲線（〜2026-07-14）。2026-08-03、measured_2026_07.Ct の
          暫定採用値としても採用（同径プロペラでの過去の確からしい実測+
          理論シミュレーション整合が拠り所、詳細は measured_2026_07.Ct の
          note 参照）。firmware actuator.cpp の MOTOR_CT も本値のまま
          （2026-07-26 モータODE化で plant.hpp からは撤去済み。上の
          ファミリ冒頭コメント参照）。ベンチでの V-ω-T 同時計測により
          確定・置換されるまでの値。
      Cq:
        value: 9.71e-11
        unit: "N·m/(rad/s)²"
        note: "旧トルク係数（〜2026-07-16、docs/architecture/stampfly-parameters.md §3派生パラメータ脚注 参照）。"
      Am:
        value: 5.39e-8
        unit: "V/(rad/s)²"
        note: >
          V = Am·ω² + Bm·ω + Cm。実験同定。firmware actuator.cpp の MOTOR_AM
          は2026-08-22までこの値をそのまま使用していた（plant.hpp からは
          2026-07-26 モータODE化で撤去済み）。ファームは 2026-08-22 以降
          flight_anchored_motor_curve を使用（hover.thrust_corr=1.12 の畳み
          込み、下記セット参照）——本値自体は実験同定の記録として変更していない。
      Bm:
        value: 6.33e-4
        unit: "V/(rad/s)"
        note: >
          実験同定。firmware actuator.cpp の MOTOR_BM は2026-08-22までこの
          値をそのまま使用していた（plant.hpp からは 2026-07-26 モータODE化
          で撤去済み）。ファームは 2026-08-22 以降 flight_anchored_motor_curve
          を使用（hover.thrust_corr=1.12 の畳み込み、下記セット参照）——
          本値自体は実験同定の記録として変更していない。
      Cm:
        value: 1.53e-2
        unit: "V"
        note: >
          実験同定。firmware actuator.cpp の MOTOR_CM は2026-08-22までこの
          値をそのまま使用していた（plant.hpp からは 2026-07-26 モータODE化
          で撤去済み）。ファームは 2026-08-22 以降 flight_anchored_motor_curve
          を使用するが、Cm は畳み込み式で不変のため数値上の変更はない
          （下記セット参照）。本値自体は実験同定の記録として変更していない。
      Rm:
        value: 0.34
        unit: "Ω"
        note: "旧LCRメータ実測（別個体の疑い）。2026-07-24決着で measured_2026_07.Rm(0.593)が採用値。"
      Km:
        value: 6.125e-4
        unit: "V/(rad/s)"
        note: >
          旧ファミリの逆起電力定数。Am/Bm/Cmは本ファミリの代数的言い換え
          （Am=Rm·Cq/Km, Bm=Rm·Dm/Km+Km, Cm=Rm·Qf/Km — 3値とも厳密一致、
          docs/architecture/stampfly-parameters.md §3派生パラメータ脚注で検算済み）。
      Dm:
        value: 3.69e-8
        unit: "N·m·s/rad"
        note: "粘性摩擦係数（旧ファミリ）。tools/sysid/defaults.py DEFAULT_PARAMS.motor.Dm と同値だが、Phase 1では未配線（今回の決定事項に含まれない）。"
      Qf:
        value: 2.76e-5
        unit: "N·m"
        note: "静止摩擦トルク（旧ファミリ）。tools/sysid/defaults.py DEFAULT_PARAMS.motor.Qf と同値だが、Phase 1では未配線。"

  # Flight-anchored motor curve (2026-08-22) -- a mechanical fold of
  # legacy_motor_curve's Am/Bm/Cm above with the flight-verified correction
  # hover.thrust_corr=1.12. What was actually validated on real hardware was
  # never the legacy curve alone -- per the firmware's own long-standing
  # comment ("the ideal motor curve overestimates thrust, so real hardware
  # only hovers after a x1.12 correction"), it was ALWAYS "legacy curve x
  # corr 1.12" as one combined mapping, split across two constants: a static
  # curve in firmware/vehicle/components/sf_actuator/actuator.cpp and a
  # runtime NVS parameter hover.thrust_corr in params.cpp. This set folds
  # that combination into a single curve so hover.thrust_corr can revert to
  # its intended meaning (per-unit trim, nominal 1.0) instead of silently
  # carrying a systematic motor-curve correction on every vehicle.
  # Derivation: holding duty identical while corr goes 1.12 -> 1.0 requires,
  # at every thrust T, omega_new = sqrt(T/1.0/Ct) = omega_legacy / sqrt(1.12).
  # Substituting into V = Am*omega^2 + Bm*omega + Cm shows that
  # Am_new = Am_legacy x 1.12, Bm_new = Bm_legacy x sqrt(1.12), and
  # Cm_new = Cm_legacy (unchanged) reproduce V_new(omega_new) =
  # V_legacy(omega_legacy) EXACTLY across the whole thrust range -- not an
  # approximation. firmware/vehicle/components/sf_actuator/actuator.cpp's
  # MOTOR_AM/MOTOR_BM/MOTOR_CM are the sole consumer of this set as of
  # 2026-08-22 (previously they held the legacy_motor_curve literals above).
  #
  # IMPORTANT CAVEAT (read before citing either curve family as "the" motor
  # model): this static V-omega curve family (legacy_motor_curve, and this
  # flight_anchored derivative of it) is an algebraic paraphrase of a
  # DIFFERENT electrical family than the one measured_2026_07/plant.hpp's ODE
  # uses (Am = Rm*Cq/Km etc., see docs/architecture/stampfly-parameters.md
  # section 3 "Derived Parameters" footnote). The two families describe TWO
  # DIFFERENT MOTORS -- they diverge by a factor of approximately 1.252x in
  # thrust at the hover operating point. No V-omega-T simultaneous
  # measurement exists on the new propeller (see measured_2026_07.Ct's note
  # above), so which family (if either) is physically correct remains
  # UNDECIDED (backlog #3). This fold does NOT assert new physics and does
  # NOT resolve that gap -- it only consolidates the single flight-validated
  # (legacy curve + corr 1.12) mapping into one place so it stops being split
  # across two constants that could silently drift apart.
  #
  # フライト実証済みモータ曲線（2026-08-22）—— legacy_motor_curve の
  # Am/Bm/Cm と、実飛行で検証済みの補正 hover.thrust_corr=1.12 を機械的に
  # 畳み込んだもの。ファーム側の従来からのコメント通り「理想モータ曲線は
  # 推力を過大評価するため、実機は×1.12の補正をしないとホバーしない」——
  # 実飛行で検証されていたのは legacy 曲線単体ではなく、常に「legacy 曲線 +
  # corr 1.12」という組み合わせ全体であり、それが2つの定数（firmware/
  # vehicle/components/sf_actuator/actuator.cpp の静的曲線と、params.cpp の
  # 実行時NVSパラメータ hover.thrust_corr）に分割して持たれていた。本セットは
  # この組み合わせを1つの曲線に畳み込み、hover.thrust_corr が本来の意味
  # （個体差トリム、公称=1.0）へ戻れるようにする——そうしなければ全機体が
  # 気づかれないままモータ曲線の系統的補正を黙って抱え続けることになる。
  # 導出: duty を変えずに corr を 1.12→1.0 にするには、全推力域で
  # ω_new=√(T/1.0/Ct)=ω_legacy/√1.12 が必要で、V = Am·ω²+Bm·ω+Cm に代入すると
  # Am_new=Am_legacy×1.12、Bm_new=Bm_legacy×√1.12、Cm_new=Cm_legacy（変更なし）
  # とすれば V_new(ω_new)=V_legacy(ω_legacy) が近似ではなく全推力域で厳密に
  # 成立することが分かる。firmware/vehicle/components/sf_actuator/
  # actuator.cpp の MOTOR_AM/MOTOR_BM/MOTOR_CM が2026-08-22時点で本セットの
  # 唯一の消費者（それ以前は上記 legacy_motor_curve のリテラルを保持して
  # いた）。
  #
  # 重要な注記（どちらの曲線ファミリも「唯一のモータモデル」として引用する前に
  # 必読）: この静的 V-ω 曲線ファミリ（legacy_motor_curve、および本
  # derivative である flight_anchored）は、measured_2026_07/plant.hpp の
  # ODE が使う電気系ファミリとは別物の代数的言い換え（Am=Rm·Cq/Km 等、
  # docs/architecture/stampfly-parameters.md §3「派生パラメータ」脚注参照）
  # である。両ファミリは別のモータを記述しており、ホバー点で約1.252倍の
  # 推力差がある。新プロペラでの V-ω-T 同時計測が一度も行われていないため
  # （measured_2026_07.Ct の note 参照）、どちらのファミリが（あるいは
  # どちらも）物理的に正しいかは未決着のまま（バックログ#3）。本畳み込みは
  # 新しい物理を主張するものでも、その未決着を解消するものでもなく、単一の
  # 飛行実証済み写像（legacy曲線+corr1.12）を1箇所に集約しただけである。
  flight_anchored_motor_curve:
    status: frozen_for_implementation
    coupled: true
    params:
      Am:
        value: 6.0368e-8
        unit: "V/(rad/s)²"
        date: "2026-08-22"
        note: >
          legacy_motor_curve.Am(5.39e-8) × 1.12 の機械的な畳み込み——ホバーに
          必須だった hover.thrust_corr=1.12 をモータ曲線側へ吸収した値
          （このファミリ冒頭コメントの導出参照）。5.39e-8×1.12=6.0368e-8。
          legacy_motor_curve.Am の値からの機械的導出であり、新しい実測では
          ない。firmware/vehicle/components/sf_actuator/actuator.cpp の
          MOTOR_AM が現在の唯一の消費者（2026-08-22〜）。
      Bm:
        value: 6.699042e-4
        unit: "V/(rad/s)"
        date: "2026-08-22"
        note: >
          legacy_motor_curve.Bm(6.33e-4) × √1.12 の機械的な畳み込み
          （このファミリ冒頭コメントの導出参照、根拠は Am と同一）。
          6.33e-4×√1.12=6.33e-4×1.058300...=6.699042e-4。
          legacy_motor_curve.Bm の値からの機械的導出であり、新しい実測では
          ない。firmware/vehicle/components/sf_actuator/actuator.cpp の
          MOTOR_BM が現在の唯一の消費者（2026-08-22〜）。
      Cm:
        value: 1.53e-2
        unit: "V"
        date: "2026-08-22"
        note: >
          legacy_motor_curve.Cm と数値変更なし——畳み込み式は
          Cm_new=Cm_legacy であり、定数項は corr の影響を受けない（Am/Bm の
          note 参照）。firmware/vehicle/components/sf_actuator/actuator.cpp
          の MOTOR_CM が現在の唯一の消費者（2026-08-22〜、値は
          legacy_motor_curve.Cm と同一）。
