lanelet2_route_planning v2.0.0
Loading...
Searching...
No Matches
utils.hpp
Go to the documentation of this file.
1// Copyright Institute for Automotive Engineering (ika), RWTH Aachen University
2// SPDX-License-Identifier: Apache-2.0
3
4#pragma once
5
6#include <array>
7#include <cstddef>
8#include <cstdint>
9#include <optional>
10#include <utility>
11#include <vector>
12
13#include <lanelet2_core/primitives/Lanelet.h>
14#include <lanelet2_routing/LaneletPath.h>
15#include <lanelet2_routing/RoutingGraph.h>
16#include <lanelet2_traffic_rules/TrafficRules.h>
17#include <Eigen/Core>
18#include <geometry_msgs/msg/point.hpp>
19#include <geometry_msgs/msg/quaternion.hpp>
20#include <rclcpp/rclcpp.hpp>
21#include <route_planning_msgs/msg/route.hpp>
22#include <route_planning_msgs/msg/route_element.hpp>
23
25
30 route_planning_msgs::msg::Route route;
31 size_t first_global_idx = 0;
32};
33
41std::optional<lanelet::routing::Route> getRoute(const lanelet::routing::RoutingGraphUPtr& routing_graph,
42 const std::vector<lanelet::ConstLanelet>& route_lanelets);
43
53LocalRouteWindow extractLocalRouteWindow(const route_planning_msgs::msg::Route& full_route,
54 size_t current_global_idx,
55 double distance_behind,
56 double distance_ahead);
57
69size_t indexOfLineStringPointClosestToPoint(const std::vector<Eigen::Vector2d>& line_string,
70 const Eigen::Vector2d& point,
71 const bool consider_order = false,
72 const bool behind = true);
73
93size_t matchPointToLineString(const std::vector<Eigen::Vector2d>& line_string,
94 const Eigen::Vector2d& point,
95 const size_t idx_indication,
96 const bool consider_order = false,
97 const bool behind = true);
98
111size_t considerOrderForPointMatchedToLineString(const std::vector<Eigen::Vector2d>& line_string,
112 const Eigen::Vector2d& point,
113 const size_t idx_closest,
114 const bool behind);
115
127bool changesLaneFromPointToPoint(const Eigen::Vector2d& point, const Eigen::Vector2d& next_point, const double sampling_distance);
128
140std::vector<lanelet::ConstLanelet> adjacentLeftOrRightLanelets(const lanelet::ConstLanelet& lanelet,
141 const lanelet::routing::RoutingGraphUPtr& routing_graph,
142 bool left,
143 bool sort_from_left = true);
144
149 Eigen::Vector2d left_bound_point;
150 Eigen::Vector2d centerline_point;
151 Eigen::Vector2d right_bound_point;
152};
153
166std::vector<ProjectedLaneletPoints> projectPointToLaneletLines(
167 const Eigen::Vector2d& point,
168 const Eigen::Vector2d& prev_point,
169 const Eigen::Vector2d& next_point,
170 const std::vector<lanelet::ConstLanelet>& lanelets,
171 const rclcpp::Logger& logger = rclcpp::get_logger("lanelet2_route_planning"));
172
192std::optional<int> computeFollowingLaneIdxOffset(const lanelet::ConstLanelet& lanelet,
193 const lanelet::ConstLanelet& lanelet_of_next_point,
194 const lanelet::routing::RoutingGraphUPtr& routing_graph);
195
208route_planning_msgs::msg::RouteElement createMinimalRouteElement(const geometry_msgs::msg::Point& position,
209 const geometry_msgs::msg::Quaternion& orientation,
210 double s = 0.0,
211 bool will_change_suggested_lane = false,
212 uint8_t speed_limit = 0);
213
218 Eigen::Vector2d prev;
219 Eigen::Vector2d current;
220 Eigen::Vector2d next;
221
229 PointSequence(const Eigen::Vector2d& prev, const Eigen::Vector2d& current, const Eigen::Vector2d& next)
230 : prev(prev), current(current), next(next) {}
231};
232
246std::pair<Eigen::Vector2d, Eigen::Vector2d> extractDrivableSpace(const lanelet::LineStringLayer& line_string_layer,
247 const PointSequence& point_sequence,
248 const double max_distance);
249
275bool isLineStringDrivable(const lanelet::ConstLineString3d& line_string);
276
281 std::vector<route_planning_msgs::msg::RegulatoryElement>
283 std::vector<uint8_t> regulatory_element_idcs;
284 std::vector<std::vector<uint8_t>>
286 std::vector<std::vector<uint8_t>>
288};
289
304ExtractRegulatoryElementsResult extractRegulatoryElements(const lanelet::ConstLanelet& lanelet,
305 const std::vector<lanelet::ConstLanelet>& adjacent_left_lanelets,
306 const std::vector<lanelet::ConstLanelet>& adjacent_right_lanelets,
307 const PointSequence& point_sequence);
308
318std::optional<std::array<geometry_msgs::msg::Point, 2>> regulatoryElementReferenceLine(
319 const std::shared_ptr<const lanelet::RegulatoryElement>& regulatory_element);
320
330std::optional<std::array<geometry_msgs::msg::Point, 2>> regulatoryElementCancelLine(
331 const std::shared_ptr<const lanelet::RegulatoryElement>& regulatory_element);
332
341std::vector<geometry_msgs::msg::Point> regulatoryElementPositions(
342 const std::shared_ptr<const lanelet::RegulatoryElement>& regulatory_element);
343
354std::pair<uint8_t, uint8_t> regulatoryElementType(const std::shared_ptr<const lanelet::RegulatoryElement>& regulatory_element);
355
364uint8_t regulatoryElementSpeedLimit(const std::shared_ptr<const lanelet::RegulatoryElement>& regulatory_element);
365
374uint8_t laneBoundaryType(const lanelet::ConstLineString2d& line);
375
392uint8_t speedLimit(const lanelet::ConstLanelet& lanelet, const bool consider_regulatory_elements = true);
393
413uint8_t speedLimit(const lanelet::ConstLanelet& lanelet, const Eigen::Vector2d& point);
414
425std::tuple<uint8_t, int> suggestedTurnSignal(const lanelet::ConstLanelet& lanelet, const rclcpp::Logger& logger);
426
432lanelet::traffic_rules::TrafficRulesPtr getTrafficRules();
433
445std::optional<lanelet::ConstLanelet> laneletAtPoint(
446 const Eigen::Vector2d& point,
447 const lanelet::LaneletMapConstPtr& map,
448 const std::optional<lanelet::traffic_rules::TrafficRulesPtr> traffic_rules = std::nullopt);
449
461lanelet::ConstLanelet followLaneletsAlongRoutingGraph(const lanelet::routing::RoutingGraphUPtr& routing_graph,
462 const lanelet::ConstLanelet& lanelet,
463 const Eigen::Vector2d& position,
464 const double distance);
465
470 std::vector<Eigen::Vector3d> centerline;
471 std::vector<size_t> lanelet_idx_by_point;
472};
473
482ResampleCenterlinesAlongPathResult resampleCenterlinesAlongPath(const lanelet::routing::LaneletPath& path,
483 const double delta_s,
484 bool monotonically);
485
495double distanceTraveled(const route_planning_msgs::msg::Route& route);
496
506double distanceRemaining(const route_planning_msgs::msg::Route& route);
507
515double estimateRemainingTime(const route_planning_msgs::msg::Route& route, const double reference_speed = 50.0 / 3.6);
516
528 route_planning_msgs::msg::Route& route_msg,
529 std::vector<std::vector<int>>& suggested_turn_signal_distance_ahead_by_route_element_by_lane_element);
530
543void sortLaneletsByMatchingCost(const lanelet::BasicPoint2d& point,
544 std::vector<std::pair<double, lanelet::ConstLanelet>>& lanelets_with_distances,
545 const std::optional<lanelet::traffic_rules::TrafficRulesPtr>& traffic_rules = std::nullopt);
546
547} // namespace lanelet2_route_planning
uint8_t laneBoundaryType(const lanelet::ConstLineString2d &line)
Extracts the lane boundary type of a lanelet line.
Definition utils.cpp:666
lanelet::ConstLanelet followLaneletsAlongRoutingGraph(const lanelet::routing::RoutingGraphUPtr &routing_graph, const lanelet::ConstLanelet &lanelet, const Eigen::Vector2d &position, const double distance)
Follows a lanelet's and following lanelets' centerline for a given distance.
Definition utils.cpp:914
double distanceTraveled(const route_planning_msgs::msg::Route &route)
Computes the traveled distance along the route.
Definition utils.cpp:993
lanelet::traffic_rules::TrafficRulesPtr getTrafficRules()
Get traffic rules.
Definition utils.cpp:879
bool changesLaneFromPointToPoint(const Eigen::Vector2d &point, const Eigen::Vector2d &next_point, const double sampling_distance)
Identifies a lane change based on the distance between two reference line points.
Definition utils.cpp:177
std::optional< lanelet::routing::Route > getRoute(const lanelet::routing::RoutingGraphUPtr &routing_graph, const std::vector< lanelet::ConstLanelet > &route_lanelets)
Computes a route from start to destination along intermediate destinations.
Definition utils.cpp:26
std::optional< std::array< geometry_msgs::msg::Point, 2 > > regulatoryElementReferenceLine(const std::shared_ptr< const lanelet::RegulatoryElement > &regulatory_element)
Extracts the reference/effect line of a regulatory element.
Definition utils.cpp:559
std::vector< geometry_msgs::msg::Point > regulatoryElementPositions(const std::shared_ptr< const lanelet::RegulatoryElement > &regulatory_element)
Extracts the sign/signal positions of a regulatory element.
Definition utils.cpp:589
bool isLineStringDrivable(const lanelet::ConstLineString3d &line_string)
Checks if lanelet line string has a type that is considered drivable.
Definition utils.cpp:461
size_t matchPointToLineString(const std::vector< Eigen::Vector2d > &line_string, const Eigen::Vector2d &point, const size_t idx_indication, const bool consider_order=false, const bool behind=true)
Finds the index of a point in a line string that is locally closest to another point.
Definition utils.cpp:94
LocalRouteWindow extractLocalRouteWindow(const route_planning_msgs::msg::Route &full_route, size_t current_global_idx, double distance_behind, double distance_ahead)
Extracts a local route window while preserving absolute route data.
Definition utils.cpp:1169
ExtractRegulatoryElementsResult extractRegulatoryElements(const lanelet::ConstLanelet &lanelet, const std::vector< lanelet::ConstLanelet > &adjacent_left_lanelets, const std::vector< lanelet::ConstLanelet > &adjacent_right_lanelets, const PointSequence &point_sequence)
Extracts regulatory element information for a route element.
Definition utils.cpp:481
double estimateRemainingTime(const route_planning_msgs::msg::Route &route, const double reference_speed=50.0/3.6)
Estimate remaining time for a route based on speed limits.
Definition utils.cpp:1015
route_planning_msgs::msg::RouteElement createMinimalRouteElement(const geometry_msgs::msg::Point &position, const geometry_msgs::msg::Quaternion &orientation, double s=0.0, bool will_change_suggested_lane=false, uint8_t speed_limit=0)
Create a minimal route element message.
Definition utils.cpp:345
uint8_t speedLimit(const lanelet::ConstLanelet &lanelet, const bool consider_regulatory_elements=true)
Extracts the speed limit of a lanelet.
Definition utils.cpp:704
std::optional< std::array< geometry_msgs::msg::Point, 2 > > regulatoryElementCancelLine(const std::shared_ptr< const lanelet::RegulatoryElement > &regulatory_element)
Extracts the cancel line of a regulatory element.
Definition utils.cpp:574
std::optional< int > computeFollowingLaneIdxOffset(const lanelet::ConstLanelet &lanelet, const lanelet::ConstLanelet &lanelet_of_next_point, const lanelet::routing::RoutingGraphUPtr &routing_graph)
Computes the offset of lane element indices from current to next route element.
Definition utils.cpp:252
void sortLaneletsByMatchingCost(const lanelet::BasicPoint2d &point, std::vector< std::pair< double, lanelet::ConstLanelet > > &lanelets_with_distances, const std::optional< lanelet::traffic_rules::TrafficRulesPtr > &traffic_rules=std::nullopt)
Sorts lanelet candidates by their matching cost for a 2D point.
Definition utils.cpp:1132
size_t indexOfLineStringPointClosestToPoint(const std::vector< Eigen::Vector2d > &line_string, const Eigen::Vector2d &point, const bool consider_order=false, const bool behind=true)
Finds the index of a point in a line string that is closest to another point.
Definition utils.cpp:67
ResampleCenterlinesAlongPathResult resampleCenterlinesAlongPath(const lanelet::routing::LaneletPath &path, const double delta_s, bool monotonically)
Equidistantly resamples lanelet centerlines along a path to one joint centerline.
Definition utils.cpp:946
size_t considerOrderForPointMatchedToLineString(const std::vector< Eigen::Vector2d > &line_string, const Eigen::Vector2d &point, const size_t idx_closest, const bool behind)
Takes a closest point in a line string and guarantees that it is behind or ahead of the given point.
Definition utils.cpp:144
void postprocessRouteMessage(route_planning_msgs::msg::Route &route_msg, std::vector< std::vector< int > > &suggested_turn_signal_distance_ahead_by_route_element_by_lane_element)
Postprocesses a route message, filling missing information that can be inferred from other message co...
Definition utils.cpp:1031
std::pair< Eigen::Vector2d, Eigen::Vector2d > extractDrivableSpace(const lanelet::LineStringLayer &line_string_layer, const PointSequence &point_sequence, const double max_distance)
Extracts drivable space boundaries for a route element.
Definition utils.cpp:375
std::pair< uint8_t, uint8_t > regulatoryElementType(const std::shared_ptr< const lanelet::RegulatoryElement > &regulatory_element)
Extracts the type and meta value of a regulatory element.
Definition utils.cpp:603
std::vector< lanelet::ConstLanelet > adjacentLeftOrRightLanelets(const lanelet::ConstLanelet &lanelet, const lanelet::routing::RoutingGraphUPtr &routing_graph, bool left, bool sort_from_left=true)
Finds lanelets adjacent to the left or right of a given lanelet.
Definition utils.cpp:184
std::optional< lanelet::ConstLanelet > laneletAtPoint(const Eigen::Vector2d &point, const lanelet::LaneletMapConstPtr &map, const std::optional< lanelet::traffic_rules::TrafficRulesPtr > traffic_rules=std::nullopt)
Find lanelet at arbitrary point.
Definition utils.cpp:885
std::vector< ProjectedLaneletPoints > projectPointToLaneletLines(const Eigen::Vector2d &point, const Eigen::Vector2d &prev_point, const Eigen::Vector2d &next_point, const std::vector< lanelet::ConstLanelet > &lanelets, const rclcpp::Logger &logger=rclcpp::get_logger("lanelet2_route_planning"))
Projects a point to the centerline and bounds of a set of lanelets.
Definition utils.cpp:208
uint8_t regulatoryElementSpeedLimit(const std::shared_ptr< const lanelet::RegulatoryElement > &regulatory_element)
Extracts the speed limit of a regulatory element of subtype 'speed_limit'.
Definition utils.cpp:631
std::tuple< uint8_t, int > suggestedTurnSignal(const lanelet::ConstLanelet &lanelet, const rclcpp::Logger &logger)
Extracts the suggested turn signal of a lanelet.
Definition utils.cpp:833
double distanceRemaining(const route_planning_msgs::msg::Route &route)
Computes the remaining distance along the route.
Definition utils.cpp:1004
Return type of extractRegulatoryElements.
Definition utils.hpp:280
std::vector< std::vector< uint8_t > > adjacent_right_regulatory_element_idcs
indices of regulatory elements belonging to right adjacent lanes
Definition utils.hpp:287
std::vector< uint8_t > regulatory_element_idcs
indices of regulatory elements belonging to main lane
Definition utils.hpp:283
std::vector< std::vector< uint8_t > > adjacent_left_regulatory_element_idcs
indices of regulatory elements belonging to left adjacent lanes
Definition utils.hpp:285
std::vector< route_planning_msgs::msg::RegulatoryElement > regulatory_element_msgs
regulatory element messages for route element
Definition utils.hpp:282
A local route window and its offset in the complete route.
Definition utils.hpp:29
route_planning_msgs::msg::Route route
Definition utils.hpp:30
Helper type for a sequence of three points.
Definition utils.hpp:217
PointSequence(const Eigen::Vector2d &prev, const Eigen::Vector2d &current, const Eigen::Vector2d &next)
Constructs a point sequence from three consecutive points.
Definition utils.hpp:229
Eigen::Vector2d next
next point
Definition utils.hpp:220
Eigen::Vector2d prev
previous point
Definition utils.hpp:218
Eigen::Vector2d current
current point
Definition utils.hpp:219
Eigen::Vector2d centerline_point
projected centerline point
Definition utils.hpp:150
Eigen::Vector2d right_bound_point
projected right bound point
Definition utils.hpp:151
Eigen::Vector2d left_bound_point
projected left bound point
Definition utils.hpp:149
Return type of resampleCenterlinesAlongPath.
Definition utils.hpp:469
std::vector< Eigen::Vector3d > centerline
resampled centerline
Definition utils.hpp:470
std::vector< size_t > lanelet_idx_by_point
lanelet index in path for each point
Definition utils.hpp:471