644 {
645 if (segments.empty()) {
646 AERROR <<
"The input segments is empty";
647 return false;
648 }
649 CHECK_NOTNULL(truncated_segments);
651
652 if (start_s >= end_s) {
653 AERROR <<
"start_s(" << start_s <<
" >= end_s(" << end_s <<
")";
654 return false;
655 }
656 std::unordered_set<std::string> unique_lanes;
657 static constexpr double kRouteEpsilon = 1e-3;
658
659 if (start_s < 0) {
660 const auto &first_segment = *segments.begin();
661 auto lane = first_segment.lane;
662 double s = first_segment.start_s;
663 double extend_s = -start_s;
664 std::vector<hdmap::LaneSegment> extended_lane_segments;
665 while (extend_s > kRouteEpsilon) {
666 if (s <= kRouteEpsilon) {
667 lane = GetRoutePredecessor(lane);
668 if (lane == nullptr ||
669 unique_lanes.find(lane->id().id()) != unique_lanes.end()) {
670 break;
671 }
672 s = lane->total_length();
673 } else {
674 const double length = std::min(s, extend_s);
675 extended_lane_segments.emplace_back(lane, s - length, s);
676 extend_s -= length;
677 s -= length;
678 unique_lanes.insert(lane->id().id());
679 }
680 }
681 truncated_segments->insert(truncated_segments->begin(),
682 extended_lane_segments.rbegin(),
683 extended_lane_segments.rend());
684 }
685 bool found_loop = false;
686 double router_s = 0;
687 for (const auto &lane_segment : segments) {
688 const double adjusted_start_s = std::max(
689 start_s - router_s + lane_segment.start_s, lane_segment.start_s);
690 const double adjusted_end_s =
691 std::min(end_s - router_s + lane_segment.start_s, lane_segment.end_s);
692 if (adjusted_start_s < adjusted_end_s) {
693 if (!truncated_segments->empty() &&
694 truncated_segments->back().lane->id().id() ==
695 lane_segment.lane->id().id()) {
696 truncated_segments->back().end_s = adjusted_end_s;
697 } else if (unique_lanes.find(lane_segment.lane->id().id()) ==
698 unique_lanes.end()) {
699 truncated_segments->emplace_back(lane_segment.lane, adjusted_start_s,
700 adjusted_end_s);
701 unique_lanes.insert(lane_segment.lane->id().id());
702 } else {
703 found_loop = true;
704 break;
705 }
706 }
707 router_s += (lane_segment.end_s - lane_segment.start_s);
708 if (router_s > end_s) {
709 break;
710 }
711 }
712 if (found_loop) {
713 return true;
714 }
715
716
717 double last_lane_segment_length =
718 segments.back().end_s - segments.back().start_s;
719 auto last_lane = segments.back().lane;
720 bool last_lane_can_exit =
721 last_lane->id().id() == dest_lane_segment_.
id() &&
725 if (last_lane_can_exit) {
726 end_s =
727 std::max(router_s - kRouteEpsilon,
728 router_s - last_lane_segment_length +
729 dest_lane_segment_.
end_s() - dest_lane_segment_.
start_s() +
730 FLAGS_reference_line_endpoint_extend_length);
731 }
732
733
734 if (router_s < end_s && !truncated_segments->empty()) {
735 auto &back = truncated_segments->back();
736 if (back.lane->total_length() > back.end_s) {
737 double origin_end_s = back.end_s;
738 back.end_s =
739 std::min(back.end_s + end_s - router_s, back.lane->total_length());
740 router_s += back.end_s - origin_end_s;
741 }
742 }
743
744 while (router_s < end_s - kRouteEpsilon) {
745 last_lane = GetRouteSuccessor(last_lane);
746 if (last_lane == nullptr ||
747 unique_lanes.find(last_lane->id().id()) != unique_lanes.end()) {
748 break;
749 }
750
751 bool last_lane_can_exit =
752 last_lane->id().id() == dest_lane_segment_.
id() &&
756
757
758 if (last_lane_can_exit) {
759 end_s = std::max(router_s + 1.0,
760 router_s + dest_lane_segment_.
end_s() -
762 FLAGS_reference_line_endpoint_extend_length);
763 }
764
765 const double length = std::min(end_s - router_s, last_lane->total_length());
766 truncated_segments->emplace_back(last_lane, 0, length);
767 unique_lanes.insert(last_lane->id().id());
768 router_s += length;
769 AINFO << last_lane->id().id() <<
", add length: " << length <<
", router_s: " << router_s <<
", end_s: " << end_s;
770 }
771 return true;
772}
void SetProperties(const RouteSegments &other)
Copy the properties of other segments to current one
apollo::hdmap::LaneWaypoint adc_waypoint_
The waypoint of the autonomous driving car