15#include <unordered_set>
22 _waypoint(
std::move(waypoint)),
23 _transform(
_parent->GetMap().ComputeTransform(_waypoint)),
24 _mark_record(
_parent->GetMap().GetMarkRecord(_waypoint)) {}
38 return _parent->GetJunction(*
this);
62 std::vector<SharedPtr<Waypoint>> result;
63 result.reserve(waypoints.size());
64 for (
auto &waypoint : waypoints) {
72 std::vector<SharedPtr<Waypoint>> result;
73 result.reserve(waypoints.size());
74 for (
auto &waypoint : waypoints) {
81 std::vector<SharedPtr<Waypoint>> result;
84 while (next.size() == 1 && next.front()->GetRoadId() ==
GetRoadId()) {
85 result.emplace_back(next.front());
86 next = result.back()->GetNext(
distance);
90 current_s = result.back()->GetDistance();
92 double remaining_length;
93 double road_length =
_parent->GetMap().GetLane(
_waypoint).GetRoad()->GetLength();
95 remaining_length = road_length - current_s;
97 remaining_length = current_s;
99 remaining_length -= std::numeric_limits<double>::epsilon();
101 result.emplace_back(result.back()->GetNext(remaining_length).front());
103 result.emplace_back(
GetNext(remaining_length).front());
110 std::vector<SharedPtr<Waypoint>> result;
113 while (prev.size() == 1 && prev.front()->GetRoadId() ==
GetRoadId()) {
114 result.emplace_back(prev.front());
115 prev = result.back()->GetPrevious(
distance);
120 current_s = result.back()->GetDistance();
123 double remaining_length;
124 double road_length =
_parent->GetMap().GetLane(
_waypoint).GetRoad()->GetLength();
126 remaining_length = road_length - current_s;
128 remaining_length = current_s;
130 remaining_length -= std::numeric_limits<double>::epsilon();
132 result.emplace_back(result.back()->GetPrevious(remaining_length).front());
134 result.emplace_back(
GetPrevious(remaining_length).front());
141 auto right_lane_waypoint =
143 if (right_lane_waypoint.has_value()) {
150 auto left_lane_waypoint =
152 if (left_lane_waypoint.has_value()) {
161 if (lane_marking_right_info !=
nullptr) {
164 return std::optional<road::element::LaneMarking>{};
170 if (lane_marking_left_info !=
nullptr) {
173 return std::optional<road::element::LaneMarking>{};
176 template <
typename EnumT>
178 return static_cast<EnumT
>(
179 static_cast<typename std::underlying_type<EnumT>::type
>(lhs) &
180 static_cast<typename std::underlying_type<EnumT>::type
>(rhs));
183 template <
typename EnumT>
185 return static_cast<EnumT
>(
186 static_cast<typename std::underlying_type<EnumT>::type
>(lhs) |
187 static_cast<typename std::underlying_type<EnumT>::type
>(rhs));
196 lane_change_type c_right;
197 if (lane_change_right_info !=
nullptr) {
198 const auto lane_change_right = lane_change_right_info->GetLaneChange();
199 c_right =
static_cast<lane_change_type
>(lane_change_right);
201 c_right = lane_change_type::Both;
205 lane_change_type c_left;
206 if (lane_change_left_info !=
nullptr) {
207 const auto lane_change_left = lane_change_left_info->GetLaneChange();
208 c_left =
static_cast<lane_change_type
>(lane_change_left);
210 c_left = lane_change_type::Both;
215 if (c_right == lane_change_type::Right) {
216 c_right = lane_change_type::Left;
217 }
else if (c_right == lane_change_type::Left) {
218 c_right = lane_change_type::Right;
224 if (c_left == lane_change_type::Right) {
225 c_left = lane_change_type::Left;
226 }
else if (c_left == lane_change_type::Left) {
227 c_left = lane_change_type::Right;
231 return (c_right & lane_change_type::Right) | (c_left & lane_change_type::Left);
235 double distance,
bool stop_at_junction)
const {
236 std::vector<SharedPtr<Landmark>> result;
237 auto signals =
_parent->GetMap().GetSignalsInDistance(
239 std::unordered_set<const road::element::RoadInfoSignal*> added_signals;
240 for(
auto &signal_data : signals){
241 if(added_signals.count(signal_data.signal) > 0) {
244 added_signals.insert(signal_data.signal);
247 new Landmark(waypoint,
_parent, signal_data.signal, signal_data.accumulated_s));
253 double distance, std::string filter_type,
bool stop_at_junction)
const {
254 std::vector<SharedPtr<Landmark>> result;
255 std::unordered_set<const road::element::RoadInfoSignal*> added_signals;
256 auto signals =
_parent->GetMap().GetSignalsInDistance(
258 for(
auto &signal_data : signals){
259 if(signal_data.signal->GetSignal()->GetType() == filter_type) {
260 if(added_signals.count(signal_data.signal) > 0) {
265 new Landmark(waypoint,
_parent, signal_data.signal, signal_data.accumulated_s));
std::map< long long, long long > _parent
std::map< std::string, unsigned int > road
Class containing a reference to RoadInfoSignal.
SharedPtr< Waypoint > GetLeft() const
std::vector< SharedPtr< Landmark > > GetLandmarksOfTypeInDistance(double distance, std::string filter_type, bool stop_at_junction=false) const
Returns a list of landmarks from the current position to a certain distance Filters by specified type...
road::element::Waypoint _waypoint
SharedPtr< Waypoint > GetRight() const
std::optional< road::element::LaneMarking > GetLeftLaneMarking() const
SharedPtr< const Map > _parent
road::JuncId GetJunctionId() const
std::optional< road::element::LaneMarking > GetRightLaneMarking() const
bool IsPositiveDirection() const
double GetLaneWidth() const
SharedPtr< Lane > GetLane() const
The lane this waypoint samples.
std::vector< SharedPtr< Waypoint > > GetPrevious(double distance) const
Waypoint(SharedPtr< const Map > parent, road::element::Waypoint waypoint)
road::element::LaneMarking::LaneChange GetLaneChange() const
std::vector< SharedPtr< Waypoint > > GetNext(double distance) const
SharedPtr< Junction > GetJunction() const
std::vector< SharedPtr< Waypoint > > GetNextUntilLaneEnd(double distance) const
Returns a list of waypoints separated by distance from the current waypoint to the end of the lane.
std::vector< SharedPtr< Landmark > > GetAllLandmarksInDistance(double distance, bool stop_at_junction=false) const
Returns a list of landmarks from the current position to a certain distance.
std::vector< SharedPtr< Waypoint > > GetPreviousUntilLaneStart(double distance) const
Returns a list of waypoints separated by distance from the current waypoint to the start of the lane.
std::pair< const road::element::RoadInfoMarkRecord *, const road::element::RoadInfoMarkRecord * > _mark_record
SharedPtr< Road > GetRoad() const
The road this waypoint samples.
road::Lane::LaneType GetType() const
LaneType
Can be used as flags.
static EnumT operator&(EnumT lhs, EnumT rhs)
static EnumT operator|(EnumT lhs, EnumT rhs)
This file contains definitions of common data structures used in traffic manager.
std::shared_ptr< T > SharedPtr
LaneChange
Can be used as flags.