Apollo 10.0
自动驾驶开放平台
loops_verify_agent.cc
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2019 The Apollo Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
17
18#include <limits>
19#include <utility>
20#include <vector>
21
22namespace apollo {
23namespace hdmap {
24
26 std::shared_ptr<JsonConf> sp_conf,
27 std::shared_ptr<PoseCollectionAgent> sp_pose_collection_agent) {
28 sp_conf_ = sp_conf;
29 sp_pose_collection_agent_ = sp_pose_collection_agent;
30}
31
33 grpc::ServerContext *context, LoopsVerifyRequest *request,
34 LoopsVerifyResponse *response) {
35 AINFO << "LoopsVerifyAgent request is: " << request->DebugString();
36 switch (request->cmd()) {
37 case CmdType::START:
38 StartVerify(request, response);
39 break;
40 case CmdType::CHECK:
41 CheckVerify(request, response);
42 break;
43 case CmdType::STOP:
44 StopVerify(request, response);
45 break;
46 default:
47 response->set_progress(0.0);
48 response->set_code(ErrorCode::ERROR_REQUEST);
49 AERROR << "command error";
50 }
51 AINFO << "LoopsVerifyAgent response is: " << response->DebugString();
52 return grpc::Status::OK;
53}
54
55void LoopsVerifyAgent::StartVerify(LoopsVerifyRequest *request,
56 LoopsVerifyResponse *response) {
57 AINFO << "Call StartVerify";
58 if (GetState() == LoopsVerifyAgentState::RUNNING) {
59 AINFO << "Verify is working, do not need start again";
60 response->set_progress(0.0);
61 response->set_code(ErrorCode::ERROR_REPEATED_START);
62 }
63
64 std::shared_ptr<std::vector<std::pair<double, double>>> sp_range =
65 get_verify_range(request);
66 double loops_to_check = static_cast<double>(GetLoopsToCheck(request));
67 std::thread loop_verify_thread(
68 [=]() { this->DoStartVerify(sp_range, loops_to_check); });
69 loop_verify_thread.detach();
71 response->set_code(ErrorCode::SUCCESS);
72 response->set_progress(0.0);
73}
74
75void LoopsVerifyAgent::CheckVerify(LoopsVerifyRequest *request,
76 LoopsVerifyResponse *response) {
77 AINFO << "Call CheckVerify";
78 if (GetState() == LoopsVerifyAgentState::IDLE) {
79 AINFO << "Verify does not work, start first";
80 response->set_progress(0.0);
81 response->set_code(ErrorCode::ERROR_CHECK_BEFORE_START);
82 return;
83 }
84
85 if (sp_laps_checker_ == nullptr) {
86 AINFO << "sp_laps_checker_ is preparing, check later";
87 response->set_progress(0.0);
88 response->set_code(ErrorCode::SUCCESS);
89 return;
90 }
91
92 if (sp_laps_checker_->GetReturnState() != 0) {
93 response->set_progress(0.0);
94 response->set_code(sp_laps_checker_->GetReturnState());
95 return;
96 }
97
98 double progress = sp_laps_checker_->GetProgress();
99 response->set_progress(progress);
100 response->set_code(ErrorCode::SUCCESS);
101 if (std::abs(1.0 - progress) < 1e-8) {
102 double confidence = sp_laps_checker_->GetConfidence();
103 size_t lap = sp_laps_checker_->GetLap();
104 AINFO << "acquired lap: " << lap << ", conf: " << confidence;
105 LoopResult *loop_result = response->mutable_loop_result();
106
107 loop_result->set_loop_num(static_cast<double>(lap));
108 bool is_reached = lap >= GetLoopsToCheck(request);
109 loop_result->set_is_reached(is_reached);
110
111 DataType data_type = request->type();
113 if (is_reached) {
114 loop_result->set_loop_num(
115 static_cast<double>(sp_conf_->laps_number_additional));
116 } else {
117 loop_result->set_loop_num(
118 lap - sp_conf_->laps_number >= 0
119 ? static_cast<double>(lap - sp_conf_->laps_number)
120 : 0.0);
121 }
122 }
123 }
124}
125
126void LoopsVerifyAgent::StopVerify(LoopsVerifyRequest *request,
127 LoopsVerifyResponse *response) {
128 AINFO << "call StopVerify";
129 response->set_code(ErrorCode::SUCCESS);
131 if (sp_laps_checker_ == nullptr) {
132 response->set_progress(0.0);
133 return;
134 }
135 response->set_progress(sp_laps_checker_->GetProgress());
136 if (std::abs(1.0 - sp_laps_checker_->GetProgress()) < 1e-8) {
137 double conf = sp_laps_checker_->GetConfidence();
138 size_t lap = sp_laps_checker_->GetLap();
139 AINFO << "acquired lap: " << lap << ", conf: " << conf;
140 LoopResult *loop_result = response->mutable_loop_result();
141 loop_result->set_loop_num(static_cast<double>(lap));
142 bool is_reached = lap >= GetLoopsToCheck(request);
143 loop_result->set_is_reached(is_reached);
144
145 DataType data_type = request->type();
147 if (is_reached) {
148 loop_result->set_loop_num(
149 static_cast<double>(sp_conf_->laps_number_additional));
150 } else {
151 loop_result->set_loop_num(
152 lap - sp_conf_->laps_number >= 0
153 ? static_cast<double>(lap - sp_conf_->laps_number)
154 : 0.0);
155 }
156 }
157 }
158}
159
160std::shared_ptr<std::vector<std::pair<double, double>>>
161LoopsVerifyAgent::get_verify_range(LoopsVerifyRequest *request) {
162 std::shared_ptr<std::vector<std::pair<double, double>>> sp_range(
163 new std::vector<std::pair<double, double>>());
164 for (const VerifyRange &range : request->range()) {
165 sp_range->push_back(std::make_pair(range.start_time(), range.end_time()));
166 }
167 return sp_range;
168}
169
170size_t LoopsVerifyAgent::GetLoopsToCheck(LoopsVerifyRequest *request) {
171 size_t loops_to_check = 0;
172 DataType data_type = request->type();
174 loops_to_check += sp_conf_->laps_number;
175 } else if (data_type == DataType::MAP_CHECKOUT) {
176 loops_to_check += sp_conf_->laps_number;
177 loops_to_check += sp_conf_->laps_number_additional;
178 }
179 return loops_to_check;
180}
181
182double LoopsVerifyAgent::GetRangeIndex(
183 std::shared_ptr<std::vector<std::pair<double, double>>> sp_range,
184 std::vector<bool> *sp_range_index,
185 std::shared_ptr<std::vector<FramePose>> sp_vec_poses) {
186 if (sp_range == nullptr) {
187 AINFO << "error, sp_range is null";
188 return -1.0;
189 }
190 std::vector<std::pair<double, double>> &range = *sp_range;
191 size_t size = range.size();
192 double min_time = std::numeric_limits<double>::max();
193 double max_time = std::numeric_limits<double>::min();
194 for (size_t i = 0; i < size; ++i) {
195 if (range[i].first >= range[i].second) {
196 AINFO << "range error, [" << range[i].first << "," << range[i].second
197 << "]";
198 continue;
199 }
200 if (range[i].first < min_time) {
201 min_time = range[i].first;
202 }
203 if (range[i].second > max_time) {
204 max_time = range[i].second;
205 }
206 }
207 AINFO << "[get_range_index] min_time:" << min_time << ", max_time"
208 << max_time;
209
210 std::vector<bool> &range_index = *sp_range_index;
211 if (size == 0 || max_time <= 0) {
212 AINFO << "time range vector size is 0 or time range error";
213 if (sp_vec_poses->size() > 0) {
214 AINFO << "set index to check all poses";
215 min_time = sp_vec_poses->front().time_stamp;
216 max_time = sp_vec_poses->back().time_stamp;
217 int index_size = static_cast<int>(max_time - min_time + 1);
218 range_index.resize(index_size, true);
219 }
220 } else {
221 AINFO << "time range vector size > 0";
222 int index_size = static_cast<int>(max_time - min_time + 1);
223 range_index.resize(index_size, false);
224 for (int i = 0; i < static_cast<int>(size); ++i) {
225 int start_time = static_cast<int>(range[i].first - min_time);
226 int end_time = static_cast<int>(range[i].second - min_time);
227 for (int j = start_time; j <= end_time; ++j) {
228 range_index[j] = true;
229 }
230 }
231 }
232 AINFO << "returned min_time:" << min_time;
233 return min_time;
234}
235
236int LoopsVerifyAgent::GetPosesToCheck(
237 std::shared_ptr<std::vector<std::pair<double, double>>> sp_range,
238 std::vector<FramePose> *sp_poses) {
239 if (sp_pose_collection_agent_ == nullptr) {
240 AINFO << "error, sp_pose_collection_agent is null";
241 return -1;
242 }
243 std::shared_ptr<std::vector<FramePose>> sp_vec_poses =
244 sp_pose_collection_agent_->GetPoses();
245 if (sp_vec_poses == nullptr || sp_vec_poses->size() == 0) {
246 AINFO << "error, no pose";
247 return -1;
248 }
249
250 std::vector<bool> range_index;
251 double min_time = GetRangeIndex(sp_range, &range_index, sp_vec_poses);
252 if (min_time == std::numeric_limits<double>::max() || range_index.empty()) {
253 AINFO << "min_time: " << min_time
254 << ", range_index size: " << range_index.size();
255 return -1;
256 }
257 std::vector<FramePose> &vec_poses = *sp_vec_poses;
258 size_t pose_size = vec_poses.size();
259 size_t range_size = range_index.size();
260 std::vector<FramePose> &poses = *sp_poses;
261 poses.clear();
262 for (size_t i = 0; i < pose_size; ++i) {
263 int time = static_cast<int>(vec_poses[i].time_stamp - min_time);
264 if (time >= static_cast<int>(range_size)) {
265 break;
266 }
267 if (time >= 0 && range_index[time]) {
268 poses.push_back(vec_poses[i]);
269 }
270 }
271 return 0;
272}
273
274int LoopsVerifyAgent::DoStartVerify(
275 std::shared_ptr<std::vector<std::pair<double, double>>> sp_range,
276 double loops_to_check) {
277 clock_t start = clock();
278 std::vector<FramePose> all_poses;
279 GetPosesToCheck(sp_range, &all_poses);
280
281 sp_laps_checker_ = std::shared_ptr<LapsChecker>(
282 new LapsChecker(all_poses, static_cast<int>(loops_to_check), sp_conf_));
283 sp_laps_checker_->Check();
284
285 double duration = (static_cast<double>(clock() - start)) / CLOCKS_PER_SEC;
286 AINFO << "checking laps cost " << duration << " seconds";
287 return 0;
288}
289
290void LoopsVerifyAgent::SetState(LoopsVerifyAgentState state) { state_ = state; }
291LoopsVerifyAgentState LoopsVerifyAgent::GetState() { return state_; }
292
293} // namespace hdmap
294} // namespace apollo
LoopsVerifyAgent(std::shared_ptr< JsonConf > sp_conf, std::shared_ptr< PoseCollectionAgent > sp_pose_collection_agent)
grpc::Status ProcessGrpcRequest(grpc::ServerContext *context, LoopsVerifyRequest *request, LoopsVerifyResponse *response)
#define AERROR
Definition log.h:44
#define AINFO
Definition log.h:42
class register implement
Definition arena_queue.h:37