Consider acceleration profile of vehicle travelling - particularly affects very short routes.

This commit is contained in:
Kevin Kreiser
2019-02-07 10:24:58 -05:00
committed by Daniel Patterson
parent 23c69f4c3d
commit 3d4d51d6b7
9 changed files with 373 additions and 8 deletions
+5 -2
View File
@@ -81,6 +81,8 @@ struct BaseParameters
bool generate_hints = true;
SnappingType snapping = SnappingType::Default;
// Whether or not to add acceleration/decelleration penalties at waypoints
double waypoint_acceleration_factor = 0.;
BaseParameters(const std::vector<util::Coordinate> coordinates_ = {},
const std::vector<boost::optional<Hint>> hints_ = {},
@@ -89,10 +91,11 @@ struct BaseParameters
std::vector<boost::optional<Approach>> approaches_ = {},
bool generate_hints_ = true,
std::vector<std::string> exclude = {},
const SnappingType snapping_ = SnappingType::Default)
const SnappingType snapping_ = SnappingType::Default,
bool waypoint_acceleration_factor_ = 0.)
: coordinates(coordinates_), hints(hints_), radiuses(radiuses_), bearings(bearings_),
approaches(approaches_), exclude(std::move(exclude)), generate_hints(generate_hints_),
snapping(snapping_)
snapping(snapping_), waypoint_acceleration_factor(waypoint_acceleration_factor_)
{
}
+42
View File
@@ -721,6 +721,48 @@ inline bool argumentsToParameter(const Nan::FunctionCallbackInfo<v8::Value> &arg
}
}
if (obj->Has(Nan::New("acceleration_profile").ToLocalChecked()))
{
v8::Local<v8::Value> acceleration_profile =
obj->Get(Nan::New("acceleration_profile").ToLocalChecked());
if (acceleration_profile.IsEmpty())
return false;
if (!acceleration_profile->IsNumber() || !acceleration_profile->IsString())
{
Nan::ThrowError("acceleration_profile must be a decimal number or one of 'car', 'fast_car', 'slow_car', 'truck', or 'tractor_trailer'");
return false;
}
if (acceleration_profile->IsString()) {
std::string ssaf = *v8::String::Utf8Value(acceleration_profile);
// If they say 'yes', they get the default
if (ssaf == "car") {
params->waypoint_acceleration_factor = ACCELERATION_ALPHA_CAR;
} else if (ssaf == "fast_car") {
params->waypoint_acceleration_factor = ACCELERATION_ALPHA_FAST_CAR;
} else if (ssaf == "slow_car") {
params->waypoint_acceleration_factor = ACCELERATION_ALPHA_SLOW_CAR;
} else if (ssaf == "truck") {
params->waypoint_acceleration_factor = ACCELERATION_ALPHA_TRUCK;
} else if (ssaf == "tractor_trailer") {
params->waypoint_acceleration_factor = ACCELERATION_ALPHA_TRACTOR_TRAILER;
} else {
Nan::ThrowError("acceleration_profile must be a decimal number or one of 'car', 'fast_car', 'slow_car', 'truck', or 'tractor_trailer'");
return false;
}
return true;
}
const auto value = acceleration_profile->NumberValue();
if (value < 0) {
Nan::ThrowError("acceleration_profile cannot be negative");
return false;
}
params->waypoint_acceleration_factor = value;
}
return true;
}
+18 -1
View File
@@ -135,6 +135,19 @@ struct BaseParametersGrammar : boost::spirit::qi::grammar<Iterator, Signature>
},
qi::_1)];
acceleration_alpha_defaults_rule =
qi::lit("car")[qi::_val = ACCELERATION_ALPHA_CAR] |
qi::lit("fast_car")[qi::_val = ACCELERATION_ALPHA_FAST_CAR] |
qi::lit("slow_car")[qi::_val = ACCELERATION_ALPHA_SLOW_CAR] |
qi::lit("truck")[qi::_val = ACCELERATION_ALPHA_TRUCK] |
qi::lit("tractor_trailer")[qi::_val = ACCELERATION_ALPHA_TRACTOR_TRAILER];
acceleration_profile_rule =
qi::lit("acceleration_profile=") >
(qi::double_ | acceleration_alpha_defaults_rule)
[ph::bind(&engine::api::BaseParameters::waypoint_acceleration_factor, qi::_r1) =
qi::_1];
query_rule =
((location_rule % ';') | polyline_rule |
polyline6_rule)[ph::bind(&engine::api::BaseParameters::coordinates, qi::_r1) = qi::_1];
@@ -179,7 +192,8 @@ struct BaseParametersGrammar : boost::spirit::qi::grammar<Iterator, Signature>
| generate_hints_rule(qi::_r1) //
| approach_rule(qi::_r1) //
| exclude_rule(qi::_r1) //
| snapping_rule(qi::_r1);
| snapping_rule(qi::_r1) //
| acceleration_profile_rule(qi::_r1);//
}
protected:
@@ -196,6 +210,7 @@ struct BaseParametersGrammar : boost::spirit::qi::grammar<Iterator, Signature>
qi::rule<Iterator, Signature> generate_hints_rule;
qi::rule<Iterator, Signature> approach_rule;
qi::rule<Iterator, Signature> exclude_rule;
qi::rule<Iterator, Signature> acceleration_profile_rule;
qi::rule<Iterator, osrm::engine::Bearing()> bearing_rule;
qi::rule<Iterator, osrm::util::Coordinate()> location_rule;
@@ -207,6 +222,8 @@ struct BaseParametersGrammar : boost::spirit::qi::grammar<Iterator, Signature>
qi::rule<Iterator, double()> unlimited_rule;
qi::rule<Iterator, Signature> snapping_rule;
qi::rule<Iterator, double()> acceleration_alpha_defaults_rule;
qi::symbols<char, engine::Approach> approach_type;
qi::symbols<char, engine::api::BaseParameters::SnappingType> snapping_type;
};
+2 -2
View File
@@ -488,8 +488,8 @@ inline void Prettify(char *buffer, int length, int k)
inline void dtoa_milo(double value, char *buffer)
{
// Not handling NaN and inf
assert(!isnan(value));
assert(!isinf(value));
assert(!std::isnan(value));
assert(!std::isinf(value));
if (value == 0)
{
+8
View File
@@ -118,6 +118,14 @@ static const TurnPenalty INVALID_TURN_PENALTY = std::numeric_limits<TurnPenalty>
static const EdgeDistance INVALID_EDGE_DISTANCE = std::numeric_limits<EdgeDistance>::max();
static const EdgeDistance INVALID_FALLBACK_SPEED = std::numeric_limits<double>::max();
// Recommended value for passenger vehicles from
// https://fdotwww.blob.core.windows.net/sitefinity/docs/default-source/content/rail/publications/studies/safety/accelerationresearch.pdf?sfvrsn=716a4bb1_0
static const double ACCELERATION_ALPHA_CAR = 6.0;
static const double ACCELERATION_ALPHA_FAST_CAR = 18;
static const double ACCELERATION_ALPHA_SLOW_CAR = 2;
static const double ACCELERATION_ALPHA_TRUCK = 1.5;
static const double ACCELERATION_ALPHA_TRACTOR_TRAILER = 0.5;
// FIXME the bitfields we use require a reduced maximal duration, this should be kept consistent
// within the code base. For now we have to ensure that we don't case 30 bit to -1 and break any
// min() / operator< checks due to the invalid truncation. In addition, using signed and unsigned