Take stop signs into account during routing

This commit is contained in:
Siarhei Fedartsou 2022-10-31 21:47:48 +01:00
parent eb72ca4941
commit a7142ee737
4 changed files with 31 additions and 23 deletions

View File

@ -77,8 +77,8 @@ struct ExtractionTurn
const std::vector<ExtractionTurnLeg> &roads_on_the_right,
const std::vector<ExtractionTurnLeg> &roads_on_the_left)
: angle(180. - angle), number_of_roads(number_of_roads), is_u_turn(is_u_turn),
has_traffic_light(has_traffic_light), has_stop_sign(has_stop_sign), has_give_way_sign(has_give_way_sign),
is_left_hand_driving(is_left_hand_driving),
has_traffic_light(has_traffic_light), has_stop_sign(has_stop_sign),
has_give_way_sign(has_give_way_sign), is_left_hand_driving(is_left_hand_driving),
source_restricted(source_restricted), source_mode(source_mode),
source_is_motorway(source_is_motorway), source_is_link(source_is_link),

View File

@ -55,9 +55,10 @@ EdgeBasedGraphFactory::EdgeBasedGraphFactory(
: m_edge_based_node_container(node_data_container), m_connectivity_checksum(0),
m_number_of_edge_based_nodes(0), m_coordinates(coordinates),
m_node_based_graph(node_based_graph), m_barrier_nodes(barrier_nodes),
m_traffic_signals(traffic_signals), m_stop_signs(stop_signs), m_give_way_signs(give_way_signs),
m_compressed_edge_container(compressed_edge_container), name_table(name_table),
segregated_edges(segregated_edges), lane_description_map(lane_description_map)
m_traffic_signals(traffic_signals), m_stop_signs(stop_signs),
m_give_way_signs(give_way_signs), m_compressed_edge_container(compressed_edge_container),
name_table(name_table), segregated_edges(segregated_edges),
lane_description_map(lane_description_map)
{
}
@ -634,7 +635,7 @@ void EdgeBasedGraphFactory::GenerateEdgeExpandedEdges(
const auto is_traffic_light = m_traffic_signals.Has(from_node, intersection_node);
const auto is_stop_sign = m_stop_signs.Has(from_node, intersection_node);
const auto is_give_way_sign = m_give_way_signs.Has(from_node, intersection_node);
const auto is_uturn =
guidance::getTurnDirection(turn_angle) == guidance::DirectionModifier::UTurn;

View File

@ -220,8 +220,6 @@ void GraphCompressor::Compress(const std::unordered_set<NodeID> &barrier_nodes,
const bool has_forward_give_way_sign = give_way_signs.Has(node_u, node_v);
const bool has_reverse_give_way_sign = give_way_signs.Has(node_w, node_v);
EdgeDuration forward_node_duration_penalty = MAXIMAL_EDGE_DURATION;
EdgeWeight forward_node_weight_penalty = INVALID_EDGE_WEIGHT;
EdgeDuration reverse_node_duration_penalty = MAXIMAL_EDGE_DURATION;
@ -241,7 +239,8 @@ void GraphCompressor::Compress(const std::unordered_set<NodeID> &barrier_nodes,
false,
has_forward_signal || has_reverse_signal,
has_forward_stop_sign || has_reverse_stop_sign,
has_forward_give_way_sign || has_reverse_give_way_sign,
has_forward_give_way_sign ||
has_reverse_give_way_sign,
false,
false,
TRAVEL_MODE_DRIVING,
@ -265,21 +264,25 @@ void GraphCompressor::Compress(const std::unordered_set<NodeID> &barrier_nodes,
roads_on_the_left);
scripting_environment.ProcessTurn(extraction_turn);
auto update_direction_penalty =
[&extraction_turn, weight_multiplier](bool has_traffic_control_node,
EdgeDuration &duration_penalty,
EdgeWeight &weight_penalty) {
if (has_traffic_control_node)
{
duration_penalty = to_alias<EdgeDuration>(extraction_turn.duration * SECOND_TO_DECISECOND);
weight_penalty = to_alias<EdgeWeight>(extraction_turn.weight * weight_multiplier);
}
};
auto update_direction_penalty = [&extraction_turn, weight_multiplier](
bool has_traffic_control_node,
EdgeDuration &duration_penalty,
EdgeWeight &weight_penalty) {
if (has_traffic_control_node)
{
duration_penalty = to_alias<EdgeDuration>(extraction_turn.duration *
SECOND_TO_DECISECOND);
weight_penalty =
to_alias<EdgeWeight>(extraction_turn.weight * weight_multiplier);
}
};
update_direction_penalty(has_forward_signal || has_forward_stop_sign || has_forward_give_way_sign,
update_direction_penalty(has_forward_signal || has_forward_stop_sign ||
has_forward_give_way_sign,
forward_node_duration_penalty,
forward_node_weight_penalty);
update_direction_penalty(has_reverse_signal || has_reverse_stop_sign || has_reverse_give_way_sign,
update_direction_penalty(has_reverse_signal || has_reverse_stop_sign ||
has_reverse_give_way_sign,
reverse_node_duration_penalty,
reverse_node_weight_penalty);
}

View File

@ -32,8 +32,12 @@ NodeBasedGraphFactory::NodeBasedGraphFactory(
coordinates(std::move(coordinates)), osm_node_ids(std::move(osm_node_ids))
{
BuildCompressedOutputGraph(edge_list);
Compress(
scripting_environment, turn_restrictions, maneuver_overrides, traffic_signals, stop_signs, give_way_signs);
Compress(scripting_environment,
turn_restrictions,
maneuver_overrides,
traffic_signals,
stop_signs,
give_way_signs);
CompressGeometry();
CompressAnnotationData();
}