40 lines
1.4 KiB
Python
40 lines
1.4 KiB
Python
# =============================
|
|
# 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))
|