diff --git a/brouter-core/src/main/java/btools/router/KinematicModel.java b/brouter-core/src/main/java/btools/router/KinematicModel.java index 82a12a6..0df2621 100644 --- a/brouter-core/src/main/java/btools/router/KinematicModel.java +++ b/brouter-core/src/main/java/btools/router/KinematicModel.java @@ -23,7 +23,7 @@ final class KinematicModel extends OsmPathModel return new KinematicPath(); } - public double turnAngleDecayLength; + public double turnAngleDecayTime; public double f_roll; public double f_air; public double f_recup; @@ -70,7 +70,7 @@ final class KinematicModel extends OsmPathModel params = extraParams; - turnAngleDecayLength = getParam( "turnAngleDecayLength", 50.f ); + turnAngleDecayTime = getParam( "turnAngleDecayTime", 5.f ); f_roll = getParam( "f_roll", 232.f ); f_air = getParam( "f_air", 0.4f ); f_recup = getParam( "f_recup", 400.f ); diff --git a/brouter-core/src/main/java/btools/router/KinematicPath.java b/brouter-core/src/main/java/btools/router/KinematicPath.java index 2093562..54a88e2 100644 --- a/brouter-core/src/main/java/btools/router/KinematicPath.java +++ b/brouter-core/src/main/java/btools/router/KinematicPath.java @@ -58,22 +58,22 @@ final class KinematicPath extends OsmPath { double turnspeed = 999.; // just high - if ( km.turnAngleDecayLength != 0. ) // process turn-angle slowdown + if ( km.turnAngleDecayTime != 0. ) // process turn-angle slowdown { - double decayFactor = FastMath.exp( - dist / km.turnAngleDecayLength ); - floatingAngleLeft = (float)( floatingAngleLeft * decayFactor ); - floatingAngleRight = (float)( floatingAngleRight * decayFactor ); if ( angle < 0 ) floatingAngleLeft -= (float)angle; else floatingAngleRight += (float)angle; float aa = Math.max( floatingAngleLeft, floatingAngleRight ); - if ( aa > 130. ) turnspeed = 0.; - else if ( aa > 100. ) turnspeed = 1.; - else if ( aa > 70. ) turnspeed = 2.; - else if ( aa > 50. ) turnspeed = 4.; - else if ( aa > 30. ) turnspeed = 8.; - else if ( aa > 20. ) turnspeed = 14.; - else if ( aa > 10. ) turnspeed = 20.; + double curveSpeed = aa > 10. ? 200. / aa : 20.; + double distanceTime = dist / curveSpeed; + double decayFactor = FastMath.exp( - distanceTime / km.turnAngleDecayTime ); + floatingAngleLeft = (float)( floatingAngleLeft * decayFactor ); + floatingAngleRight = (float)( floatingAngleRight * decayFactor ); + + if ( curveSpeed < 20. ) + { + turnspeed = curveSpeed; + } } if ( nsection == 0 ) // process slowdown by crossing geometry diff --git a/misc/profiles2/car-eco.brf b/misc/profiles2/car-eco.brf index e936db7..a600d6a 100644 --- a/misc/profiles2/car-eco.brf +++ b/misc/profiles2/car-eco.brf @@ -267,4 +267,5 @@ assign maxspeed = switch greater way:priorityclassifier 22 3 switch greater way:priorityclassifier 20 1 0 + else if railway=level_crossing then 0 else 999 diff --git a/misc/profiles2/car-fast.brf b/misc/profiles2/car-fast.brf index 8e0e614..33fad3e 100644 --- a/misc/profiles2/car-fast.brf +++ b/misc/profiles2/car-fast.brf @@ -267,4 +267,5 @@ assign maxspeed = switch greater way:priorityclassifier 22 3 switch greater way:priorityclassifier 20 1 0 + else if railway=level_crossing then 0 else 999 diff --git a/misc/profiles2/car-vario.brf b/misc/profiles2/car-vario.brf index e936db7..a600d6a 100644 --- a/misc/profiles2/car-vario.brf +++ b/misc/profiles2/car-vario.brf @@ -267,4 +267,5 @@ assign maxspeed = switch greater way:priorityclassifier 22 3 switch greater way:priorityclassifier 20 1 0 + else if railway=level_crossing then 0 else 999