From a7142ee737a38fda111e8618fcddfe63859c6c64 Mon Sep 17 00:00:00 2001 From: Siarhei Fedartsou Date: Mon, 31 Oct 2022 21:47:48 +0100 Subject: [PATCH] Take stop signs into account during routing --- include/extractor/extraction_turn.hpp | 4 +-- src/extractor/edge_based_graph_factory.cpp | 9 +++--- src/extractor/graph_compressor.cpp | 33 ++++++++++++---------- src/extractor/node_based_graph_factory.cpp | 8 ++++-- 4 files changed, 31 insertions(+), 23 deletions(-) diff --git a/include/extractor/extraction_turn.hpp b/include/extractor/extraction_turn.hpp index d0873738a..61cdf8d6a 100644 --- a/include/extractor/extraction_turn.hpp +++ b/include/extractor/extraction_turn.hpp @@ -77,8 +77,8 @@ struct ExtractionTurn const std::vector &roads_on_the_right, const std::vector &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), diff --git a/src/extractor/edge_based_graph_factory.cpp b/src/extractor/edge_based_graph_factory.cpp index 1e5e9e4f8..aebfab689 100644 --- a/src/extractor/edge_based_graph_factory.cpp +++ b/src/extractor/edge_based_graph_factory.cpp @@ -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; diff --git a/src/extractor/graph_compressor.cpp b/src/extractor/graph_compressor.cpp index 2d3e85c9a..b547b2348 100644 --- a/src/extractor/graph_compressor.cpp +++ b/src/extractor/graph_compressor.cpp @@ -220,8 +220,6 @@ void GraphCompressor::Compress(const std::unordered_set &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 &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 &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(extraction_turn.duration * SECOND_TO_DECISECOND); - weight_penalty = to_alias(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(extraction_turn.duration * + SECOND_TO_DECISECOND); + weight_penalty = + to_alias(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); } diff --git a/src/extractor/node_based_graph_factory.cpp b/src/extractor/node_based_graph_factory.cpp index e4a6bbfef..018b54f18 100644 --- a/src/extractor/node_based_graph_factory.cpp +++ b/src/extractor/node_based_graph_factory.cpp @@ -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(); }