# ============================= # app/simulation/modules/gearbox.py # ============================= from __future__ import annotations from app.simulation.simulator import Module, Vehicle class GearboxModule(Module): PRIO = 30 NAME = "gearbox" """Koppelt Engine-RPM ↔ Wheel-Speed; registriert speed_kmh/gear fürs Dashboard.""" def __init__(self): self.speed_tau = 0.3 self.rpm_couple = 0.2 def apply(self, v: Vehicle, dt: float) -> None: # Dashboard registration v.register_metric("speed_kmh", label="Geschwindigkeit", unit="km/h", fmt=".1f", source="gearbox", priority=30) v.register_metric("gear", label="Gang", source="gearbox", priority=25) g = int(v.ensure("gear", 0)) rpm = float(v.ensure("rpm", 1200)) speed = float(v.ensure("speed_kmh", 0.0)) ratios = v.config.get("gearbox", {}).get("kmh_per_krpm", [0.0]) if g <= 0 or g >= len(ratios): speed = max(0.0, speed - 6.0*dt) v.set("speed_kmh", speed) return kmh_per_krpm = float(ratios[g]) target_speed = (rpm/1000.0) * kmh_per_krpm alpha = min(1.0, dt / max(0.05, self.speed_tau)) speed = (1-alpha) * speed + alpha * target_speed v.set("speed_kmh", speed) wheel_rpm = (speed / max(0.1, kmh_per_krpm)) * 1000.0 rpm = (1-self.rpm_couple) * rpm + self.rpm_couple * wheel_rpm v.set("rpm", int(rpm))