80 {
81 if (complete_rtk_trajectory_.empty() || complete_rtk_trajectory_.size() < 2) {
82 const std::string msg =
83 "RTKReplayPlanner doesn't have a recorded trajectory or "
84 "the recorded trajectory doesn't have enough valid trajectory "
85 "points.";
87 return Status(ErrorCode::PLANNING_ERROR, msg);
88 }
89
90 std::uint32_t matched_index =
91 QueryPositionMatchedPoint(planning_init_point, complete_rtk_trajectory_);
92
93 std::uint32_t forward_buffer =
94 static_cast<std::uint32_t>(FLAGS_rtk_trajectory_forward);
95
96 std::uint32_t end_index = std::min<std::uint32_t>(
97 static_cast<std::uint32_t>(complete_rtk_trajectory_.size()),
98 matched_index + forward_buffer);
99
100
101 std::vector<TrajectoryPoint> trajectory_points(
102 complete_rtk_trajectory_.begin() + matched_index,
103 complete_rtk_trajectory_.begin() + end_index);
104
105
106 double zero_time = complete_rtk_trajectory_[matched_index].relative_time();
107 for (auto& trajectory_point : trajectory_points) {
108 trajectory_point.set_relative_time(trajectory_point.relative_time() -
109 zero_time);
110 }
111
112
113
114
115 while (trajectory_points.size() <
116 static_cast<size_t>(FLAGS_rtk_trajectory_forward)) {
117 const auto& last_point = trajectory_points.rbegin();
118 auto new_point = last_point;
119 new_point->set_relative_time(new_point->relative_time() +
120 FLAGS_rtk_trajectory_resolution);
121 trajectory_points.push_back(*new_point);
122 }
123 reference_line_info->SetTrajectory(DiscretizedTrajectory(trajectory_points));
125}