66 {
67 if (raw_points_.size() <= 2) {
68 AERROR <<
"the original point size is " << raw_points_.size();
69 return false;
70 }
71 size_t i = 1;
72 {
73 std::vector<ReferencePoint> ref_points;
74 double s = 0.0;
75 for (; s < FLAGS_smooth_length && i < raw_points_.size(); ++i) {
76 LineSegment2d segment(raw_points_[i - 1], raw_points_[i]);
77 ref_points.emplace_back(MapPathPoint(raw_points_[i], segment.heading()),
78 0.0, 0.0);
79 s += segment.length();
80 }
81 ReferenceLine init_ref(ref_points);
82
83
84 auto smoother_ptr =
85 std::make_unique<QpSplineReferenceLineSmoother>(config_);
86 auto anchors =
87 CreateAnchorPoints(init_ref.reference_points().front(), init_ref);
88 smoother_ptr->SetAnchorPoints(anchors);
89 ReferenceLine smoothed_init_ref;
90 if (!smoother_ptr->Smooth(init_ref, &smoothed_init_ref)) {
91 AERROR <<
"smooth initial reference line failed";
92 return false;
93 }
94 ref_points_ = smoothed_init_ref.reference_points();
95 }
96 for (; i < raw_points_.size(); ++i) {
97 double s = 0.0;
98 size_t j = ref_points_.size() - 1;
99 while (j > 0 && s < FLAGS_smooth_length / 2.0) {
100 s +=
DistanceXY(ref_points_[j - 1], ref_points_[j]);
101 --j;
102 }
103 ReferenceLine prev_half_ref(ref_points_.begin() + j, ref_points_.end());
104 ref_points_.erase(ref_points_.begin() + j, ref_points_.end());
105 common::SLPoint sl;
106 prev_half_ref.XYToSL(raw_points_[i], &sl);
107 while (sl.s() <= prev_half_ref.Length() && i + 1 < raw_points_.size()) {
108 prev_half_ref.XYToSL(raw_points_[i + 1], &sl);
109 ++i;
110 }
111 s = 0.0;
112 j = i;
113 auto ref_points = prev_half_ref.reference_points();
114 while (j + 1 < raw_points_.size() && s < FLAGS_smooth_length / 2.0) {
115 Vec2d vec = raw_points_[j + 1] - raw_points_[j];
116 s += vec.Length();
117 ref_points.emplace_back(MapPathPoint(raw_points_[j], vec.Angle()), 0.0,
118 0.0);
119 ++j;
120 }
121 i = j;
122 ReferenceLine local_ref(ref_points);
123 auto anchors = CreateAnchorPoints(ref_points.front(), local_ref);
124
125
126 auto smoother_ptr =
127 std::make_unique<QpSplineReferenceLineSmoother>(config_);
128 smoother_ptr->SetAnchorPoints(anchors);
129 ReferenceLine smoothed_local_ref;
130 if (!smoother_ptr->Smooth(local_ref, &smoothed_local_ref)) {
131 AERROR <<
"Failed to smooth reference line";
132 return false;
133 }
134 ref_points_.insert(ref_points_.end(),
135 smoothed_local_ref.reference_points().begin(),
136 smoothed_local_ref.reference_points().end());
137 }
138 return true;
139 }