12#include <unordered_set>
19 : _parent(
std::move(parent)),
20 _waypoint(
std::move(waypoint)),
21 _transform(_parent->GetMap().ComputeTransform(_waypoint)),
22 _mark_record(_parent->GetMap().GetMarkRecord(_waypoint)) {}
39 return _parent->GetJunction(*
this);
57 std::vector<SharedPtr<Waypoint>> result;
58 result.reserve(waypoints.size());
59 for (
auto &waypoint : waypoints) {
68 std::vector<SharedPtr<Waypoint>> result;
69 result.reserve(waypoints.size());
70 for (
auto &waypoint : waypoints) {
78 std::vector<SharedPtr<Waypoint>> result;
79 std::vector<SharedPtr<Waypoint>> next =
GetNext(distance);
82 while (next.size() == 1 && next.front()->GetRoadId() ==
GetRoadId()) {
83 result.emplace_back(next.front());
84 next = result.back()->GetNext(distance);
89 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();
103 result.emplace_back(result.back()->GetNext(remaining_length).front());
105 result.emplace_back(
GetNext(remaining_length).front());
113 std::vector<SharedPtr<Waypoint>> result;
114 std::vector<SharedPtr<Waypoint>> prev =
GetPrevious(distance);
117 while (prev.size() == 1 && prev.front()->GetRoadId() ==
GetRoadId()) {
118 result.emplace_back(prev.front());
119 prev = result.back()->GetPrevious(distance);
124 current_s = result.back()->GetDistance();
127 double remaining_length;
128 double road_length =
_parent->GetMap().GetLane(
_waypoint).GetRoad()->GetLength();
130 remaining_length = road_length - current_s;
132 remaining_length = current_s;
134 remaining_length -= std::numeric_limits<double>::epsilon();
138 result.emplace_back(result.back()->GetPrevious(remaining_length).front());
140 result.emplace_back(
GetPrevious(remaining_length).front());
148 auto right_lane_waypoint =
150 if (right_lane_waypoint.has_value()) {
158 auto left_lane_waypoint =
160 if (left_lane_waypoint.has_value()) {
171 return boost::optional<road::element::LaneMarking>{};
179 return boost::optional<road::element::LaneMarking>{};
182 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));
190 template <
typename EnumT>
193 return static_cast<EnumT
>(
194 static_cast<typename std::underlying_type<EnumT>::type
>(lhs) |
195 static_cast<typename std::underlying_type<EnumT>::type
>(rhs));
203 lane_change_type c_right;
204 if (lane_change_right_info !=
nullptr) {
205 const auto lane_change_right = lane_change_right_info->GetLaneChange();
206 c_right =
static_cast<lane_change_type
>(lane_change_right);
208 c_right = lane_change_type::Both;
212 lane_change_type c_left;
213 if (lane_change_left_info !=
nullptr) {
214 const auto lane_change_left = lane_change_left_info->GetLaneChange();
215 c_left =
static_cast<lane_change_type
>(lane_change_left);
217 c_left = lane_change_type::Both;
222 if (c_right == lane_change_type::Right) {
223 c_right = lane_change_type::Left;
224 }
else if (c_right == lane_change_type::Left) {
225 c_right = lane_change_type::Right;
231 if (c_left == lane_change_type::Right) {
232 c_left = lane_change_type::Left;
233 }
else if (c_left == lane_change_type::Left) {
234 c_left = lane_change_type::Right;
239 return (c_right & lane_change_type::Right) | (c_left & lane_change_type::Left);
243 double distance,
bool stop_at_junction)
const {
245 std::vector<SharedPtr<Landmark>> result;
246 auto signals =
_parent->GetMap().GetSignalsInDistance(
248 std::unordered_set<const road::element::RoadInfoSignal*> added_signals;
249 for(
auto &signal_data : signals){
250 if(added_signals.count(signal_data.signal) > 0) {
253 added_signals.insert(signal_data.signal);
256 new Landmark(waypoint,
_parent, signal_data.signal, signal_data.accumulated_s));
262 double distance, std::string filter_type,
bool stop_at_junction)
const {
264 std::vector<SharedPtr<Landmark>> result;
266 std::unordered_set<const road::element::RoadInfoSignal*> added_signals;
268 auto signals =
_parent->GetMap().GetSignalsInDistance(
271 for(
auto &signal_data : signals){
273 if(signal_data.signal->GetSignal()->GetType() == filter_type) {
274 if(added_signals.count(signal_data.signal) > 0) {
281 new Landmark(waypoint,
_parent, signal_data.signal, signal_data.accumulated_s));
Landmark 类表示地图中的一个地标,该地标与某个信号相关联。 包含关于地标的各种属性和信息,可以用来在地图上找到该地标以及获取其相关数据。
SharedPtr< Waypoint > GetLeft() const
获取当前路径点左侧的路径点。
std::vector< SharedPtr< Landmark > > GetLandmarksOfTypeInDistance(double distance, std::string filter_type, bool stop_at_junction=false) const
获取从当前位置到指定距离内,按指定类型筛选的地标列表。
bool IsJunction() const
判断当前路径点是否在交叉路口。
road::element::Waypoint _waypoint
存储OpenDrive中的路径点信息。
SharedPtr< Waypoint > GetRight() const
获取当前路径点右侧的路径点。
SharedPtr< const Map > _parent
指向父Map对象的共享指针。
boost::optional< road::element::LaneMarking > GetLeftLaneMarking() const
获取当前路径点左侧的车道标记。
boost::optional< road::element::LaneMarking > GetRightLaneMarking() const
获取当前路径点右侧的车道标记。
road::JuncId GetJunctionId() const
获取交叉路口ID。
auto GetRoadId() const
获取道路ID。
double GetLaneWidth() const
获取车道宽度。
std::vector< SharedPtr< Waypoint > > GetPrevious(double distance) const
获取指定距离内的上一个路径点列表。
auto GetDistance() const
获取沿车道的距离(s值)。
Waypoint(SharedPtr< const Map > parent, road::element::Waypoint 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
获取从当前位置开始,沿车道方向直到道路终点的路径点列表。
std::vector< SharedPtr< Landmark > > GetAllLandmarksInDistance(double distance, bool stop_at_junction=false) const
获取从当前位置到指定距离内的所有地标列表。
std::vector< SharedPtr< Waypoint > > GetPreviousUntilLaneStart(double distance) const
获取从当前位置开始,沿车道反方向直到道路起点的路径点列表。
std::pair< const road::element::RoadInfoMarkRecord *, const road::element::RoadInfoMarkRecord * > _mark_record
分别指向右侧和左侧标记记录的指针对。
road::Lane::LaneType GetType() const
获取车道类型。
static EnumT operator&(EnumT lhs, EnumT rhs)
static EnumT operator|(EnumT lhs, EnumT rhs)
boost::shared_ptr< T > SharedPtr
使用这个SharedPtr(boost::shared_ptr)以保持与boost::python的兼容性, 但未来如果可能的话,我们希望能为std::shared_ptr制作一个Python适配器。