26 std::shared_ptr<JsonConf> sp_conf,
27 std::shared_ptr<PoseCollectionAgent> sp_pose_collection_agent) {
29 sp_pose_collection_agent_ = sp_pose_collection_agent;
35 AINFO <<
"LoopsVerifyAgent request is: " << request->DebugString();
36 switch (request->
cmd()) {
38 StartVerify(request, response);
41 CheckVerify(request, response);
44 StopVerify(request, response);
47 response->set_progress(0.0);
51 AINFO <<
"LoopsVerifyAgent response is: " << response->DebugString();
52 return grpc::Status::OK;
57 AINFO <<
"Call StartVerify";
59 AINFO <<
"Verify is working, do not need start again";
60 response->set_progress(0.0);
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();
72 response->set_progress(0.0);
75void LoopsVerifyAgent::CheckVerify(LoopsVerifyRequest *request,
76 LoopsVerifyResponse *response) {
77 AINFO <<
"Call CheckVerify";
79 AINFO <<
"Verify does not work, start first";
80 response->set_progress(0.0);
85 if (sp_laps_checker_ ==
nullptr) {
86 AINFO <<
"sp_laps_checker_ is preparing, check later";
87 response->set_progress(0.0);
92 if (sp_laps_checker_->GetReturnState() != 0) {
93 response->set_progress(0.0);
94 response->set_code(sp_laps_checker_->GetReturnState());
98 double progress = sp_laps_checker_->GetProgress();
99 response->set_progress(progress);
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();
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);
114 loop_result->set_loop_num(
115 static_cast<double>(sp_conf_->laps_number_additional));
117 loop_result->set_loop_num(
118 lap - sp_conf_->laps_number >= 0
119 ?
static_cast<double>(lap - sp_conf_->laps_number)
126void LoopsVerifyAgent::StopVerify(LoopsVerifyRequest *request,
127 LoopsVerifyResponse *response) {
128 AINFO <<
"call StopVerify";
131 if (sp_laps_checker_ ==
nullptr) {
132 response->set_progress(0.0);
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);
148 loop_result->set_loop_num(
149 static_cast<double>(sp_conf_->laps_number_additional));
151 loop_result->set_loop_num(
152 lap - sp_conf_->laps_number >= 0
153 ?
static_cast<double>(lap - sp_conf_->laps_number)
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()));
170size_t LoopsVerifyAgent::GetLoopsToCheck(LoopsVerifyRequest *request) {
171 size_t loops_to_check = 0;
174 loops_to_check += sp_conf_->laps_number;
176 loops_to_check += sp_conf_->laps_number;
177 loops_to_check += sp_conf_->laps_number_additional;
179 return loops_to_check;
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";
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
200 if (range[i].first < min_time) {
201 min_time = range[i].first;
203 if (range[i].second > max_time) {
204 max_time = range[i].second;
207 AINFO <<
"[get_range_index] min_time:" << min_time <<
", max_time"
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);
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;
232 AINFO <<
"returned min_time:" << min_time;
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";
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";
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();
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;
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)) {
267 if (time >= 0 && range_index[time]) {
268 poses.push_back(vec_poses[i]);
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);
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();
285 double duration = (
static_cast<double>(clock() - start)) / CLOCKS_PER_SEC;
286 AINFO <<
"checking laps cost " << duration <<
" seconds";
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)
@ ERROR_CHECK_BEFORE_START