32const double MIN_INTERNAL_FOR_NODE = 0.01;
33const double kLenghtEpsilon = 1e-6;
35using apollo::common::util::FindPtrOrNull;
36using ::google::protobuf::RepeatedPtrField;
38void ConvertOutRange(
const RepeatedPtrField<CurveRange>& range_vec,
39 double start_s,
double end_s,
40 std::vector<NodeSRange>* out_range,
int* prefer_index) {
42 for (
const auto& c_range : range_vec) {
43 double s_s = c_range.start().s();
44 double e_s = c_range.end().s();
45 if (e_s < start_s || s_s > end_s || e_s < s_s) {
48 s_s = std::max(start_s, s_s);
49 e_s = std::min(end_s, e_s);
50 NodeSRange s_range(s_s, e_s);
51 out_range->push_back(std::move(s_range));
53 sort(out_range->begin(), out_range->end());
55 double max_diff = 0.0;
56 for (
size_t i = 0; i < out_range->size(); ++i) {
57 if (out_range->at(i).Length() > max_diff) {
58 max_index =
static_cast<int>(i);
59 max_diff = out_range->at(i).Length();
62 *prefer_index = max_index;
68 double start_s,
double end_s) {
75 int index_diff = end_index - start_index;
76 if (start_index < 0 || end_index < 0) {
83 double pre_s_s = std::max(start_s, range_vec[start_index].
StartS());
84 double suc_e_s = std::min(end_s, range_vec[end_index].
EndS());
86 if (index_diff == 1) {
87 double dlt = range_vec[start_index].EndS() - pre_s_s;
88 dlt += suc_e_s - range_vec[end_index].StartS();
91 if (index_diff == 0) {
98 : pb_node_(node), start_s_(0.0), end_s_(pb_node_.length()) {
100 <<
"Node length is invalid in pb: " << pb_node_.DebugString();
108 start_s_ = range.
StartS();
109 end_s_ = range.
EndS();
115void TopoNode::Init() {
116 if (!FindAnchorPoint()) {
117 AWARN <<
"Be attention!!! Find anchor point failed for lane: " <<
LaneId();
119 ConvertOutRange(pb_node_.
left_out(), start_s_, end_s_,
120 &left_out_sorted_range_, &left_prefer_range_index_);
122 is_left_range_enough_ =
123 (left_prefer_range_index_ >= 0) &&
124 left_out_sorted_range_[left_prefer_range_index_].IsEnoughForChangeLane();
126 ConvertOutRange(pb_node_.
right_out(), start_s_, end_s_,
127 &right_out_sorted_range_, &right_prefer_range_index_);
128 is_right_range_enough_ = (right_prefer_range_index_ >= 0) &&
129 right_out_sorted_range_[right_prefer_range_index_]
130 .IsEnoughForChangeLane();
133bool TopoNode::FindAnchorPoint() {
134 double total_size = 0;
136 total_size += seg.line_segment().point_size();
139 int anchor_index =
static_cast<int>(total_size * rate);
141 if (anchor_index < seg.line_segment().point_size()) {
142 SetAnchorPoint(seg.line_segment().point(anchor_index));
145 anchor_index -= seg.line_segment().point_size();
150void TopoNode::SetAnchorPoint(
const common::PointENU& anchor_point) {
151 anchor_point_ = anchor_point;
173 return left_out_sorted_range_;
177 return right_out_sorted_range_;
181 return in_from_all_edge_set_;
185 return in_from_left_edge_set_;
189 return in_from_right_edge_set_;
194 return in_from_left_or_right_edge_set_;
198 return in_from_pre_edge_set_;
202 return out_to_all_edge_set_;
206 return out_to_left_edge_set_;
210 return out_to_right_edge_set_;
215 return out_to_left_or_right_edge_set_;
219 return out_to_suc_edge_set_;
223 return FindPtrOrNull(in_edge_map_, from_node);
227 return FindPtrOrNull(out_edge_map_, to_node);
239 const TopoEdge* edge_for_type)
const {
241 return (is_left_range_enough_ &&
246 return (is_right_range_enough_ &&
257 if (edge->
ToNode() !=
this) {
260 if (in_edge_map_.count(edge->
FromNode()) != 0) {
263 switch (edge->
Type()) {
265 in_from_right_edge_set_.insert(edge);
266 in_from_left_or_right_edge_set_.insert(edge);
269 in_from_left_edge_set_.insert(edge);
270 in_from_left_or_right_edge_set_.insert(edge);
273 in_from_pre_edge_set_.insert(edge);
276 in_from_all_edge_set_.insert(edge);
277 in_edge_map_[edge->
FromNode()] = edge;
284 if (out_edge_map_.count(edge->
ToNode()) != 0) {
287 switch (edge->
Type()) {
289 out_to_left_edge_set_.insert(edge);
290 out_to_left_or_right_edge_set_.insert(edge);
293 out_to_right_edge_set_.insert(edge);
294 out_to_left_or_right_edge_set_.insert(edge);
297 out_to_suc_edge_set_.insert(edge);
300 out_to_all_edge_set_.insert(edge);
301 out_edge_map_[edge->
ToNode()] = edge;
314 : pb_edge_(edge), from_node_(from_node), to_node_(to_node) {}
const TopoNode * topo_node
bool IsEnoughForChangeLane() const
const TopoNode * ToNode() const
const Edge & PbEdge() const
const std::string & FromLaneId() const
const TopoNode * FromNode() const
TopoEdgeType Type() const
TopoEdge(const Edge &edge, const TopoNode *from_node, const TopoNode *to_node)
const std::string & ToLaneId() const
const std::unordered_set< const TopoEdge * > & InFromAllEdge() const
TopoNode(const Node &node)
const TopoNode * OriginNode() const
const std::unordered_set< const TopoEdge * > & OutToSucEdge() const
const Node & PbNode() const
const std::unordered_set< const TopoEdge * > & OutToRightEdge() const
const std::vector< NodeSRange > & LeftOutRange() const
bool IsOutToSucEdgeValid() const
void AddOutEdge(const TopoEdge *edge)
const std::string & LaneId() const
const std::vector< NodeSRange > & RightOutRange() const
bool IsInFromPreEdgeValid() const
static bool IsOutRangeEnough(const std::vector< NodeSRange > &range_vec, double start_s, double end_s)
const std::unordered_set< const TopoEdge * > & OutToLeftEdge() const
void AddInEdge(const TopoEdge *edge)
const TopoEdge * GetOutEdgeTo(const TopoNode *to_node) const
const std::unordered_set< const TopoEdge * > & InFromRightEdge() const
const hdmap::Curve & CentralCurve() const
const std::unordered_set< const TopoEdge * > & OutToLeftOrRightEdge() const
const std::unordered_set< const TopoEdge * > & InFromLeftEdge() const
const std::unordered_set< const TopoEdge * > & InFromPreEdge() const
const std::unordered_set< const TopoEdge * > & OutToAllEdge() const
const std::string & RoadId() const
const common::PointENU & AnchorPoint() const
const TopoEdge * GetInEdgeFrom(const TopoNode *from_node) const
const std::unordered_set< const TopoEdge * > & InFromLeftOrRightEdge() const
bool IsOverlapEnough(const TopoNode *sub_node, const TopoEdge *edge_for_type) const
int BinarySearchForSSmaller(const std::vector< T > &sorted_vec, double value_s)
int BinarySearchForSLarger(const std::vector< T > &sorted_vec, double value_s)
optional string from_lane_id
optional DirectionType direction_type
optional string to_lane_id
repeated CurveRange left_out
repeated CurveRange right_out
optional apollo::hdmap::Curve central_curve