mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-11-09 10:12:24 +01:00
Two changes that only work together: the first on its own lets a heavy freight train brake less on a descent than it needs (in testing an ET42 with 30 loaded wagons overran the stop signal by 16-48 m at 20 per mille), the second makes the hold on a descent what it should be. The comparison that decides whether the AI may skip its reaction time between two brake steps stays on the brake-only demand, as before: it is about how much brake is asked for, and a heavy train in G approaching a stop on a descent needs its brake built up at once. Compared in the resultant frame, that train built up its brake one step per reaction time and overran the signal (16 copies of the ET42 train, x20: 22 of 32 overruns with the comparison moved, 0 of 48 with it kept). 1. Compare the measured deceleration in the same frame. Going downhill, adjust_desired_speed_for_current_speed() subtracts the gravity component from AccDesired, so that IncBrake() sizes the handle position for what the brake alone has to deliver. control_braking_force() then compares that brake-only value with AbsAccS, which is the resultant acceleration and already contains the gravity. On a 20 per mille descent the two differ by about 0.2 m/s2, so the AI asked for more braking than the target needed and then released, and repeated that. Keep the subtracted part in fAccDesiredGravity and add it back wherever AccDesired is compared with AbsAccS. It is zero everywhere else (flat, uphill, braking test), so the behaviour there does not change. 2. Hold the speed with one continuous law. On a descent the AI looks ahead to decide whether it will exceed the target speed. The look-ahead was (1 - a0) * 30 / 3.6 s, a few seconds, while a pneumatic brake in G takes tens of seconds to apply or to release; the AI therefore acted on an estimate the train had already left behind. The demand then jumped between the braking threshold above the target and a lerp towards full acceleration below it, and with the brake that slow this turned into long alternating applications and releases. - look ahead for half the brake application time while the train is speeding up and half the release time while it is slowing down (brake_response_horizon), never less than before; - use one law on both sides of the target, proportional to the predicted difference, and hold a band just below the limit that widens with the gradient (pneumatic up to 3 km/h, EP/electric up to 1.5 km/h); - once below a lower limit ahead, hold that limit instead of speeding up towards the line speed and braking again.