Consider acceleration profile of vehicle travelling - particularly affects very short routes.
This commit is contained in:
committed by
Daniel Patterson
parent
23c69f4c3d
commit
3d4d51d6b7
@@ -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_)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user