Skip to content

Commit 785ca9c

Browse files
committed
fixup! core: add etcs loa logic to etcs braking simulator
Signed-off-by: Erashin <alwenn.charpentier@gmail.com>
1 parent 33bf431 commit 785ca9c

File tree

2 files changed

+137
-85
lines changed

2 files changed

+137
-85
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,25 @@
11
package fr.sncf.osrd.envelope_sim.etcs
22

3+
/**
4+
* Formulas are found in `SUBSET-026-3v400.pdf` from the file at
5+
* https://www.era.europa.eu/system/files/2023-09/index004_-_SUBSET-026_v400.zip and in
6+
* `SUBSET-041_v400.pdf` from the file at
7+
* https://www.era.europa.eu/system/files/2023-09/index014_-_SUBSET-041_v400.pdf
8+
*/
9+
310
/**
411
* National Default Value: permission to inhibit the compensation of the speed measurement accuracy.
5-
* See Subset referenced in ETCSBrakingSimulator: table in Appendix A.3.2.
12+
* See Subset 026: table in Appendix A.3.2.
613
*/
714
const val qNvinhsmicperm = false
815

916
/**
1017
* Estimated acceleration during tBerem, worst case scenario (aEst2 is between 0 and 0.4), expressed
11-
* in m/s². See Subset referenced in ETCSBrakingSimulator: §3.13.9.3.2.9.
18+
* in m/s². See Subset 026: §3.13.9.3.2.9.
1219
*/
1320
const val aEst2 = 0.4
1421

15-
/** See Subset referenced in ETCSBrakingSimulator: table in Appendix A.3.1. */
22+
/** See Subset 026: table in Appendix A.3.1. */
1623
const val dvEbiMin = 7.5 / 3.6 // m/s
1724
const val dvEbiMax = 15.0 / 3.6 // m/s
1825
const val vEbiMin = 110.0 / 3.6 // m/s
@@ -22,23 +29,41 @@ const val tDriver = 4.0 // s
2229
const val mRotatingMax = 15.0 // %
2330
const val mRotatingMin = 2.0 // %
2431

25-
/** See https://www.era.europa.eu/system/files/2023-09/index014_-_SUBSET-041_v400.pdf: §5.3.1.2. */
32+
/** See Subset 041: §5.3.1.2. */
33+
const val vUraMinLimit = 30 / 3.6 // m/s
34+
const val vUraMaxLimit = 500 / 3.6 // m/s
35+
const val vUraMin = 2 / 3.6 // m/s
36+
const val vUraMax = 12 / 3.6 // m/s
37+
38+
/** See Subset 041: §5.3.1.2. */
2639
fun vUra(speed: Double): Double {
27-
return if (speed <= 30 / 3.6) 2 / 3.6
28-
// vUra(30km/h) = 2km/h & vUra(500km/h) = 12km/h with a linear interpolation in between
29-
// this gives the following equation : y = (x + 64) / 47, still in km/h
30-
else ((speed + 64) / 47) / 3.6
40+
return interpolateLinearSpeed(speed, vUraMinLimit, vUraMaxLimit, vUraMin, vUraMax)
3141
}
3242

33-
/** See Subset referenced in ETCSBrakingSimulator: §3.13.9.3.2.10. */
43+
/** See Subset 026: §3.13.9.3.2.10. */
3444
fun vDelta0(speed: Double): Double {
3545
return if (!qNvinhsmicperm) vUra(speed) else 0.0
3646
}
3747

38-
/** See Subset referenced in ETCSBrakingSimulator: §3.13.9.2.3. */
48+
/** See Subset 026: §3.13.9.2.3. */
3949
fun dvEbi(speed: Double): Double {
40-
return if (speed <= vEbiMin) dvEbiMin
41-
else if (speed < vEbiMax)
42-
(dvEbiMax - dvEbiMin) / (vEbiMax - vEbiMin) * (speed - vEbiMin) + dvEbiMin
43-
else dvEbiMax
50+
return interpolateLinearSpeed(speed, vEbiMin, vEbiMax, dvEbiMin, dvEbiMax)
51+
}
52+
53+
/**
54+
* The linear curve is the following: below minSpeedLimit = minSpeed, above maxSpeedLimit =
55+
* maxSpeed, in between is a linear curve. This method takes a speed input and converts it
56+
* accordingly.
57+
*/
58+
private fun interpolateLinearSpeed(
59+
speed: Double,
60+
minSpeedLimit: Double,
61+
maxSpeedLimit: Double,
62+
minSpeed: Double,
63+
maxSpeed: Double
64+
): Double {
65+
return if (speed <= minSpeedLimit) minSpeed
66+
else if (speed < maxSpeedLimit)
67+
(maxSpeed - minSpeed) / (maxSpeedLimit - minSpeedLimit) * (speed - minSpeedLimit) + minSpeed
68+
else maxSpeed
4469
}

0 commit comments

Comments
 (0)