This commit is contained in:
orin
2026-07-30 08:45:38 +08:00
commit 25b24ac4cd
1333 changed files with 170092 additions and 0 deletions
+51
View File
@@ -0,0 +1,51 @@
"""Virtual seat posture calibration shared by planning and state handling."""
from __future__ import annotations
from dataclasses import dataclass
@dataclass(frozen=True)
class AngleCalibration:
axis: str
minimum_deg: float
maximum_deg: float
ANGLE_CALIBRATIONS = {
"seat.set_backrest_recline": AngleCalibration(
axis="backrest_recline",
minimum_deg=95,
maximum_deg=140,
),
"seat.set_legrest_height": AngleCalibration(
axis="legrest_height",
minimum_deg=95,
maximum_deg=160,
),
}
AXIS_ANGLE_CALIBRATIONS = {
calibration.axis: calibration for calibration in ANGLE_CALIBRATIONS.values()
}
def angle_to_position_pct(capability: str, angle_deg: float) -> int:
calibration = ANGLE_CALIBRATIONS[capability]
normalized = (
(float(angle_deg) - calibration.minimum_deg)
/ (calibration.maximum_deg - calibration.minimum_deg)
)
return round(normalized * 100)
def position_pct_to_angle(axis: str, position_pct: float) -> float | None:
calibration = AXIS_ANGLE_CALIBRATIONS.get(axis)
if calibration is None:
return None
return round(
calibration.minimum_deg
+ (calibration.maximum_deg - calibration.minimum_deg)
* float(position_pct)
/ 100,
1,
)