Apollo 11.0
自动驾驶开放平台
message_process.cc
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2020 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 *****************************************************************************/
16
18
19#include <algorithm>
20#include <cmath>
21#include <memory>
22#include <string>
23
24#include "modules/common_msgs/map_msgs/map_lane.pb.h"
25
26#include "cyber/common/file.h"
28#include "cyber/time/clock.h"
36
37namespace apollo {
38namespace planning {
39
44using apollo::dreamview::HMIStatus;
61
62bool MessageProcess::Init(const PlanningConfig& planning_config) {
63 planning_config_.CopyFrom(planning_config);
64
65 map_m_["Sunnyvale"] = "sunnyvale";
66 map_m_["Sunnyvale Big Loop"] = "sunnyvale_big_loop";
67 map_m_["Sunnyvale With Two Offices"] = "sunnyvale_with_two_offices";
68 map_m_["Gomentum"] = "gomentum";
69 map_m_["Sunnyvale Loop"] = "sunnyvale_loop";
70 map_m_["San Mateo"] = "san_mateo";
71
72 map_name_ = FLAGS_map_dir.substr(FLAGS_map_dir.find_last_of("/") + 1);
73
74 obstacle_history_map_.clear();
75
76 if (FLAGS_planning_offline_learning) {
77 // offline process logging
78 log_file_.open(FLAGS_planning_data_dir + "/learning_data.log",
79 std::ios_base::out | std::ios_base::app);
80 start_time_ = std::chrono::system_clock::now();
81 std::time_t now = std::time(nullptr);
82 log_file_ << "UTC date and time: " << std::asctime(std::gmtime(&now))
83 << "Local date and time: " << std::asctime(std::localtime(&now));
84 }
85 return true;
86}
87
88bool MessageProcess::Init(const PlanningConfig& planning_config,
89 const std::shared_ptr<DependencyInjector>& injector) {
90 injector_ = injector;
91 return Init(planning_config);
92}
93
96
97 if (FLAGS_planning_offline_learning) {
98 // offline process logging
99 const std::string msg = absl::StrCat("Total learning_data_frame number: ",
100 total_learning_data_frame_num_);
101 AINFO << msg;
102 log_file_ << msg << std::endl;
103 auto end_time = std::chrono::system_clock::now();
104 std::chrono::duration<double> elapsed_seconds = end_time - start_time_;
105 log_file_ << "Time elapsed(sec): " << elapsed_seconds.count() << std::endl
106 << std::endl;
107 log_file_.close();
108 }
109}
110
112 chassis_feature_.set_message_timestamp_sec(chassis.header().timestamp_sec());
113 chassis_feature_.set_speed_mps(chassis.speed_mps());
114 chassis_feature_.set_throttle_percentage(chassis.throttle_percentage());
115 chassis_feature_.set_brake_percentage(chassis.brake_percentage());
116 chassis_feature_.set_steering_percentage(chassis.steering_percentage());
117 chassis_feature_.set_gear_location(chassis.gear_location());
118}
119
120void MessageProcess::OnHMIStatus(apollo::dreamview::HMIStatus hmi_status) {
121 const std::string& current_map = hmi_status.current_map();
122 if (map_m_.count(current_map) > 0) {
123 map_name_ = map_m_[current_map];
124 const std::string& map_base_folder = "/apollo/modules/map/data/";
125 FLAGS_map_dir = map_base_folder + map_name_;
126 }
127}
128
130 static constexpr double kEpsilon = 1e-12;
131 if (std::abs(last_localization_message_timestamp_sec_) < kEpsilon) {
132 last_localization_message_timestamp_sec_ = le.header().timestamp_sec();
133 }
134 const double time_diff =
135 le.header().timestamp_sec() - last_localization_message_timestamp_sec_;
136 if (time_diff < 1.0 / FLAGS_planning_loop_rate) {
137 // for RL_TEST, E2E_TEST or HYBRID_TEST skip this check so that first
138 // frame can proceed
139 if (!(planning_config_.learning_mode() == PlanningConfig::RL_TEST ||
140 planning_config_.learning_mode() == PlanningConfig::E2E_TEST ||
141 planning_config_.learning_mode() == PlanningConfig::HYBRID_TEST)) {
142 return;
143 }
144 }
145 if (time_diff >= (1.0 * 2 / FLAGS_planning_loop_rate)) {
146 const std::string msg = absl::StrCat(
147 "missing localization too long: time_stamp[",
148 le.header().timestamp_sec(), "] time_diff[", time_diff, "]");
149 AERROR << msg;
150 if (FLAGS_planning_offline_learning) {
151 log_file_ << msg << std::endl;
152 }
153 }
154 last_localization_message_timestamp_sec_ = le.header().timestamp_sec();
155 localizations_.push_back(le);
156
157 while (!localizations_.empty()) {
158 if (localizations_.back().header().timestamp_sec() -
159 localizations_.front().header().timestamp_sec() <=
160 FLAGS_trajectory_time_length) {
161 break;
162 }
163 localizations_.pop_front();
164 }
165
166 ADEBUG << "OnLocalization: size[" << localizations_.size() << "] time_diff["
167 << localizations_.back().header().timestamp_sec() -
168 localizations_.front().header().timestamp_sec()
169 << "]";
170
171 // generate one frame data
172 LearningDataFrame learning_data_frame;
173 if (GenerateLearningDataFrame(&learning_data_frame)) {
174 // output
175 if (FLAGS_planning_offline_learning) {
176 // offline
177 FeatureOutput::InsertLearningDataFrame(record_file_, learning_data_frame);
178 } else {
179 // online
180 injector_->learning_based_data()->InsertLearningDataFrame(
181 learning_data_frame);
182 }
183 }
184}
185
187 const PredictionObstacles& prediction_obstacles) {
188 prediction_obstacles_map_.clear();
189 for (int i = 0; i < prediction_obstacles.prediction_obstacle_size(); ++i) {
190 const auto& prediction_obstacle =
191 prediction_obstacles.prediction_obstacle(i);
192 const int obstacle_id = prediction_obstacle.perception_obstacle().id();
193 prediction_obstacles_map_[obstacle_id].CopyFrom(prediction_obstacle);
194 }
195
196 // erase obstacle history if obstacle not exist in current predictio msg
197 /* comment out to relax this check for now
198 std::unordered_map<int, std::list<PerceptionObstacleFeature>>::iterator
199 it = obstacle_history_map_.begin();
200 while (it != obstacle_history_map_.end()) {
201 const int obstacle_id = it->first;
202 if (prediction_obstacles_map_.count(obstacle_id) == 0) {
203 // not exist in current prediction msg
204 it = obstacle_history_map_.erase(it);
205 } else {
206 ++it;
207 }
208 }
209 */
210
211 // debug
212 // add to obstacle history
213 // for (const auto& m : obstacle_history_map_) {
214 // for (const auto& p : m.second) {
215 // AERROR << "obstacle_history_map_: " << m.first << "; "
216 // << p.DebugString();
217 // }
218 // }
219
220 // add to obstacle history
221 for (const auto& m : prediction_obstacles_map_) {
222 const auto& perception_obstale = m.second.perception_obstacle();
223 PerceptionObstacleFeature obstacle_trajectory_point;
224 obstacle_trajectory_point.set_timestamp_sec(perception_obstale.timestamp());
225 obstacle_trajectory_point.mutable_position()->CopyFrom(
226 perception_obstale.position());
227 obstacle_trajectory_point.set_theta(perception_obstale.theta());
228 obstacle_trajectory_point.mutable_velocity()->CopyFrom(
229 perception_obstale.velocity());
230 for (int j = 0; j < perception_obstale.polygon_point_size(); ++j) {
231 auto polygon_point = obstacle_trajectory_point.add_polygon_point();
232 polygon_point->CopyFrom(perception_obstale.polygon_point(j));
233 }
234 obstacle_trajectory_point.mutable_acceleration()->CopyFrom(
235 perception_obstale.acceleration());
236
237 obstacle_history_map_[m.first].back().timestamp_sec();
238 if (obstacle_history_map_[m.first].empty() ||
239 obstacle_trajectory_point.timestamp_sec() -
240 obstacle_history_map_[m.first].back().timestamp_sec() >
241 0) {
242 obstacle_history_map_[m.first].push_back(obstacle_trajectory_point);
243 } else {
244 // abnormal perception data: time_diff <= 0
245 const double time_diff =
246 obstacle_trajectory_point.timestamp_sec() -
247 obstacle_history_map_[m.first].back().timestamp_sec();
248 const std::string msg = absl::StrCat(
249 "DISCARD: obstacle_id[", m.first, "] last_timestamp_sec[",
250 obstacle_history_map_[m.first].back().timestamp_sec(),
251 "] timestamp_sec[", obstacle_trajectory_point.timestamp_sec(),
252 "] time_diff[", time_diff, "]");
253 AERROR << msg;
254 if (FLAGS_planning_offline_learning) {
255 log_file_ << msg << std::endl;
256 }
257 }
258 auto& obstacle_history = obstacle_history_map_[m.first];
259 while (!obstacle_history.empty()) {
260 const double time_distance = obstacle_history.back().timestamp_sec() -
261 obstacle_history.front().timestamp_sec();
262 if (time_distance < FLAGS_learning_data_obstacle_history_time_sec) {
263 break;
264 }
265 obstacle_history.pop_front();
266 }
267 }
268}
269
271 const apollo::routing::RoutingResponse& routing_response) {
272 ADEBUG << "routing_response received at frame["
273 << total_learning_data_frame_num_ << "]";
274 routing_response_.CopyFrom(routing_response);
275}
276
278 const apollo::storytelling::Stories& stories) {
279 // clear area
280 if (stories.has_close_to_clear_area()) {
281 auto clear_area_tag = planning_tag_.mutable_clear_area();
282 clear_area_tag->set_id(stories.close_to_clear_area().id());
283 clear_area_tag->set_distance(stories.close_to_clear_area().distance());
284 }
285
286 // crosswalk
287 if (stories.has_close_to_crosswalk()) {
288 auto crosswalk_tag = planning_tag_.mutable_crosswalk();
289 crosswalk_tag->set_id(stories.close_to_crosswalk().id());
290 crosswalk_tag->set_distance(stories.close_to_crosswalk().distance());
291 }
292
293 // pnc_junction
294 if (stories.has_close_to_junction() &&
296 auto pnc_junction_tag = planning_tag_.mutable_pnc_junction();
297 pnc_junction_tag->set_id(stories.close_to_junction().id());
298 pnc_junction_tag->set_distance(stories.close_to_junction().distance());
299 }
300
301 // traffic_light
302 if (stories.has_close_to_signal()) {
303 auto signal_tag = planning_tag_.mutable_signal();
304 signal_tag->set_id(stories.close_to_signal().id());
305 signal_tag->set_distance(stories.close_to_signal().distance());
306 }
307
308 // stop_sign
309 if (stories.has_close_to_stop_sign()) {
310 auto stop_sign_tag = planning_tag_.mutable_stop_sign();
311 stop_sign_tag->set_id(stories.close_to_stop_sign().id());
312 stop_sign_tag->set_distance(stories.close_to_stop_sign().distance());
313 }
314
315 // yield_sign
316 if (stories.has_close_to_yield_sign()) {
317 auto yield_sign_tag = planning_tag_.mutable_yield_sign();
318 yield_sign_tag->set_id(stories.close_to_yield_sign().id());
319 yield_sign_tag->set_distance(stories.close_to_yield_sign().distance());
320 }
321
322 ADEBUG << planning_tag_.DebugString();
323}
324
326 const TrafficLightDetection& traffic_light_detection) {
327 // AINFO << "traffic_light_detection received at frame["
328 // << total_learning_data_frame_num_ << "]";
329 traffic_light_detection_message_timestamp_ =
330 traffic_light_detection.header().timestamp_sec();
331 traffic_lights_.clear();
332 for (int i = 0; i < traffic_light_detection.traffic_light_size(); ++i) {
333 TrafficLightFeature traffic_light;
334 traffic_light.set_color(traffic_light_detection.traffic_light(i).color());
335 traffic_light.set_id(traffic_light_detection.traffic_light(i).id());
336 traffic_light.set_confidence(
337 traffic_light_detection.traffic_light(i).confidence());
338 traffic_light.set_tracking_time(
339 traffic_light_detection.traffic_light(i).tracking_time());
340 traffic_light.set_remaining_time(
341 traffic_light_detection.traffic_light(i).remaining_time());
342 traffic_lights_.push_back(traffic_light);
343 }
344}
345
346void MessageProcess::ProcessOfflineData(const std::string& record_file) {
347 log_file_ << "Processing: " << record_file << std::endl;
348 record_file_ = record_file;
349
350 RecordReader reader(record_file);
351 if (!reader.IsValid()) {
352 AERROR << "Fail to open " << record_file;
353 return;
354 }
355
356 RecordMessage message;
357 while (reader.ReadMessage(&message)) {
358 if (message.channel_name ==
359 planning_config_.topic_config().chassis_topic()) {
360 Chassis chassis;
361 if (chassis.ParseFromString(message.content)) {
362 OnChassis(chassis);
363 }
364 } else if (message.channel_name ==
365 planning_config_.topic_config().localization_topic()) {
366 LocalizationEstimate localization;
367 if (localization.ParseFromString(message.content)) {
368 OnLocalization(localization);
369 }
370 } else if (message.channel_name ==
371 planning_config_.topic_config().hmi_status_topic()) {
372 HMIStatus hmi_status;
373 if (hmi_status.ParseFromString(message.content)) {
374 OnHMIStatus(hmi_status);
375 }
376 } else if (message.channel_name ==
377 planning_config_.topic_config().prediction_topic()) {
378 PredictionObstacles prediction_obstacles;
379 if (prediction_obstacles.ParseFromString(message.content)) {
380 OnPrediction(prediction_obstacles);
381 }
382 } else if (message.channel_name ==
383 planning_config_.topic_config().routing_response_topic()) {
384 RoutingResponse routing_response;
385 if (routing_response.ParseFromString(message.content)) {
386 OnRoutingResponse(routing_response);
387 }
388 } else if (message.channel_name ==
389 planning_config_.topic_config().story_telling_topic()) {
390 Stories stories;
391 if (stories.ParseFromString(message.content)) {
392 OnStoryTelling(stories);
393 }
394 } else if (message.channel_name == planning_config_.topic_config()
396 TrafficLightDetection traffic_light_detection;
397 if (traffic_light_detection.ParseFromString(message.content)) {
398 OnTrafficLightDetection(traffic_light_detection);
399 }
400 }
401 }
402}
403
404bool MessageProcess::GetADCCurrentRoutingIndex(int* adc_road_index,
405 int* adc_passage_index,
406 double* adc_passage_s) {
407 if (localizations_.empty()) return false;
408
409 static constexpr double kRadius = 4.0;
410 const auto& pose = localizations_.back().pose();
411 std::vector<std::shared_ptr<const apollo::hdmap::LaneInfo>> lanes;
412 apollo::hdmap::HDMapUtil::BaseMapPtr()->GetLanes(pose.position(), kRadius,
413 &lanes);
414
415 for (auto& lane : lanes) {
416 for (int i = 0; i < routing_response_.road_size(); ++i) {
417 *adc_passage_s = 0;
418 for (int j = 0; j < routing_response_.road(i).passage_size(); ++j) {
419 double passage_s = 0;
420 for (int k = 0; k < routing_response_.road(i).passage(j).segment_size();
421 ++k) {
422 const auto& segment = routing_response_.road(i).passage(j).segment(k);
423 passage_s += (segment.end_s() - segment.start_s());
424 if (lane->id().id() == segment.id()) {
425 *adc_road_index = i;
426 *adc_passage_index = j;
427 *adc_passage_s = passage_s;
428 return true;
429 }
430 }
431 }
432 }
433 }
434 return false;
435}
436
437apollo::hdmap::LaneInfoConstPtr MessageProcess::GetCurrentLane(
438 const apollo::common::PointENU& position) {
439 constexpr double kRadiusUnit = 0.1;
440 std::vector<std::shared_ptr<const apollo::hdmap::LaneInfo>> lanes;
441 for (int i = 1; i <= 10; ++i) {
442 apollo::hdmap::HDMapUtil::BaseMapPtr()->GetLanes(position, i * kRadiusUnit,
443 &lanes);
444 if (lanes.size() > 0) {
445 break;
446 }
447 }
448
449 for (auto& lane : lanes) {
450 for (int i = 0; i < routing_response_.road_size(); ++i) {
451 for (int j = 0; j < routing_response_.road(i).passage_size(); ++j) {
452 for (int k = 0; k < routing_response_.road(i).passage(j).segment_size();
453 ++k) {
454 if (lane->id().id() ==
455 routing_response_.road(i).passage(j).segment(k).id()) {
456 return lane;
457 }
458 }
459 }
460 }
461 }
462
463 return nullptr;
464}
465
466int MessageProcess::GetADCCurrentInfo(ADCCurrentInfo* adc_curr_info) {
467 CHECK_NOTNULL(adc_curr_info);
468 if (localizations_.empty()) return -1;
469
470 // ADC current position / velocity / acc/ heading
471 const auto& adc_cur_pose = localizations_.back().pose();
472 adc_curr_info->adc_cur_position_ =
473 std::make_pair(adc_cur_pose.position().x(), adc_cur_pose.position().y());
474 adc_curr_info->adc_cur_velocity_ = std::make_pair(
475 adc_cur_pose.linear_velocity().x(), adc_cur_pose.linear_velocity().y());
476 adc_curr_info->adc_cur_acc_ =
477 std::make_pair(adc_cur_pose.linear_acceleration().x(),
478 adc_cur_pose.linear_acceleration().y());
479 adc_curr_info->adc_cur_heading_ = adc_cur_pose.heading();
480 return 1;
481}
482
483void MessageProcess::GenerateObstacleTrajectory(
484 const int frame_num, const int obstacle_id,
485 const ADCCurrentInfo& adc_curr_info, ObstacleFeature* obstacle_feature) {
486 auto obstacle_trajectory = obstacle_feature->mutable_obstacle_trajectory();
487 const auto& obstacle_history = obstacle_history_map_[obstacle_id];
488 for (const auto& obj_traj_point : obstacle_history) {
489 auto perception_obstacle_history =
490 obstacle_trajectory->add_perception_obstacle_history();
491 perception_obstacle_history->set_timestamp_sec(
492 obj_traj_point.timestamp_sec());
493
494 // convert position to relative coordinate
495 const auto& relative_posistion = util::WorldCoordToObjCoord(
496 std::make_pair(obj_traj_point.position().x(),
497 obj_traj_point.position().y()),
498 adc_curr_info.adc_cur_position_, adc_curr_info.adc_cur_heading_);
499 auto position = perception_obstacle_history->mutable_position();
500 position->set_x(relative_posistion.first);
501 position->set_y(relative_posistion.second);
502
503 // convert theta to relative coordinate
504 const double relative_theta = util::WorldAngleToObjAngle(
505 obj_traj_point.theta(), adc_curr_info.adc_cur_heading_);
506 perception_obstacle_history->set_theta(relative_theta);
507
508 // convert velocity to relative coordinate
509 const auto& relative_velocity = util::WorldCoordToObjCoord(
510 std::make_pair(obj_traj_point.velocity().x(),
511 obj_traj_point.velocity().y()),
512 adc_curr_info.adc_cur_velocity_, adc_curr_info.adc_cur_heading_);
513 auto velocity = perception_obstacle_history->mutable_velocity();
514 velocity->set_x(relative_velocity.first);
515 velocity->set_y(relative_velocity.second);
516
517 // convert acceleration to relative coordinate
518 const auto& relative_acc = util::WorldCoordToObjCoord(
519 std::make_pair(obj_traj_point.acceleration().x(),
520 obj_traj_point.acceleration().y()),
521 adc_curr_info.adc_cur_acc_, adc_curr_info.adc_cur_heading_);
522 auto acceleration = perception_obstacle_history->mutable_acceleration();
523 acceleration->set_x(relative_acc.first);
524 acceleration->set_y(relative_acc.second);
525
526 for (int i = 0; i < obj_traj_point.polygon_point_size(); ++i) {
527 // convert polygon_point(s) to relative coordinate
528 const auto& relative_point = util::WorldCoordToObjCoord(
529 std::make_pair(obj_traj_point.polygon_point(i).x(),
530 obj_traj_point.polygon_point(i).y()),
531 adc_curr_info.adc_cur_position_, adc_curr_info.adc_cur_heading_);
532 auto polygon_point = perception_obstacle_history->add_polygon_point();
533 polygon_point->set_x(relative_point.first);
534 polygon_point->set_y(relative_point.second);
535 }
536 }
537}
538
539void MessageProcess::GenerateObstaclePrediction(
540 const int frame_num, const PredictionObstacle& prediction_obstacle,
541 const ADCCurrentInfo& adc_curr_info, ObstacleFeature* obstacle_feature) {
542 const auto obstacle_id = obstacle_feature->id();
543 auto obstacle_prediction = obstacle_feature->mutable_obstacle_prediction();
544 obstacle_prediction->set_timestamp_sec(prediction_obstacle.timestamp());
545 obstacle_prediction->set_predicted_period(
546 prediction_obstacle.predicted_period());
547 obstacle_prediction->mutable_intent()->CopyFrom(prediction_obstacle.intent());
548 obstacle_prediction->mutable_priority()->CopyFrom(
549 prediction_obstacle.priority());
550 obstacle_prediction->set_is_static(prediction_obstacle.is_static());
551
552 for (int i = 0; i < prediction_obstacle.trajectory_size(); ++i) {
553 const auto& obstacle_trajectory = prediction_obstacle.trajectory(i);
554 auto trajectory = obstacle_prediction->add_trajectory();
555 trajectory->set_probability(obstacle_trajectory.probability());
556
557 // TrajectoryPoint
558 for (int j = 0; j < obstacle_trajectory.trajectory_point_size(); ++j) {
559 const auto& obstacle_trajectory_point =
560 obstacle_trajectory.trajectory_point(j);
561
562 if (trajectory->trajectory_point_size() > 0) {
563 const auto last_relative_time =
564 trajectory
565 ->trajectory_point(trajectory->trajectory_point_size() - 1)
566 .trajectory_point()
567 .relative_time();
568 if (obstacle_trajectory_point.relative_time() < last_relative_time) {
569 const std::string msg = absl::StrCat(
570 "DISCARD prediction trajectory point: frame_num[", frame_num,
571 "] obstacle_id[", obstacle_id, "] last_relative_time[",
572 last_relative_time, "] relative_time[",
573 obstacle_trajectory_point.relative_time(), "]");
574 AERROR << msg;
575 if (FLAGS_planning_offline_learning) {
576 log_file_ << msg << std::endl;
577 }
578 continue;
579 }
580 }
581
582 auto trajectory_point = trajectory->add_trajectory_point();
583
584 auto path_point =
585 trajectory_point->mutable_trajectory_point()->mutable_path_point();
586
587 // convert path_point position to relative coordinate
588 const auto& relative_path_point = util::WorldCoordToObjCoord(
589 std::make_pair(obstacle_trajectory_point.path_point().x(),
590 obstacle_trajectory_point.path_point().y()),
591 adc_curr_info.adc_cur_position_, adc_curr_info.adc_cur_heading_);
592 path_point->set_x(relative_path_point.first);
593 path_point->set_y(relative_path_point.second);
594
595 // convert path_point theta to relative coordinate
596 const double relative_theta = util::WorldAngleToObjAngle(
597 obstacle_trajectory_point.path_point().theta(),
598 adc_curr_info.adc_cur_heading_);
599 path_point->set_theta(relative_theta);
600
601 path_point->set_s(obstacle_trajectory_point.path_point().s());
602 path_point->set_lane_id(obstacle_trajectory_point.path_point().lane_id());
603
604 const double timestamp_sec = prediction_obstacle.timestamp() +
605 obstacle_trajectory_point.relative_time();
606 trajectory_point->set_timestamp_sec(timestamp_sec);
607 auto tp = trajectory_point->mutable_trajectory_point();
608 tp->set_v(obstacle_trajectory_point.v());
609 tp->set_a(obstacle_trajectory_point.a());
610 tp->set_relative_time(obstacle_trajectory_point.relative_time());
611 tp->mutable_gaussian_info()->CopyFrom(
612 obstacle_trajectory_point.gaussian_info());
613 }
614 }
615}
616
617void MessageProcess::GenerateObstacleFeature(
618 LearningDataFrame* learning_data_frame) {
619 ADCCurrentInfo adc_curr_info;
620 if (GetADCCurrentInfo(&adc_curr_info) == -1) {
621 const std::string msg =
622 absl::StrCat("fail to get ADC current info: frame_num[",
623 learning_data_frame->frame_num(), "]");
624 AERROR << msg;
625 if (FLAGS_planning_offline_learning) {
626 log_file_ << msg << std::endl;
627 }
628 return;
629 }
630
631 const int frame_num = learning_data_frame->frame_num();
632 for (const auto& m : prediction_obstacles_map_) {
633 auto obstacle_feature = learning_data_frame->add_obstacle();
634
635 const auto& perception_obstale = m.second.perception_obstacle();
636 obstacle_feature->set_id(m.first);
637 obstacle_feature->set_length(perception_obstale.length());
638 obstacle_feature->set_width(perception_obstale.width());
639 obstacle_feature->set_height(perception_obstale.height());
640 obstacle_feature->set_type(perception_obstale.type());
641
642 // obstacle history trajectory points
643 GenerateObstacleTrajectory(frame_num, m.first, adc_curr_info,
644 obstacle_feature);
645
646 // obstacle prediction
647 GenerateObstaclePrediction(frame_num, m.second, adc_curr_info,
648 obstacle_feature);
649 }
650}
651
652bool MessageProcess::GenerateLocalRouting(
653 const int frame_num, RoutingResponseFeature* local_routing,
654 std::vector<std::string>* local_routing_lane_ids) {
655 local_routing->Clear();
656 local_routing_lane_ids->clear();
657
658 if (routing_response_.road_size() == 0 ||
659 routing_response_.road(0).passage_size() == 0 ||
660 routing_response_.road(0).passage(0).segment_size() == 0) {
661 const std::string msg = absl::StrCat(
662 "DISCARD: invalid routing_response. frame_num[", frame_num, "]");
663 AERROR << msg;
664 if (FLAGS_planning_offline_learning) {
665 log_file_ << msg << std::endl;
666 }
667 return false;
668 }
669
670 // calculate road_length
671 std::vector<std::pair<std::string, double>> road_lengths;
672 for (int i = 0; i < routing_response_.road_size(); ++i) {
673 ADEBUG << "road_id[" << routing_response_.road(i).id() << "] passage_size["
674 << routing_response_.road(i).passage_size() << "]";
675 double road_length = 0.0;
676 for (int j = 0; j < routing_response_.road(i).passage_size(); ++j) {
677 ADEBUG << " passage: segment_size["
678 << routing_response_.road(i).passage(j).segment_size() << "]";
679 double passage_length = 0;
680 for (int k = 0; k < routing_response_.road(i).passage(j).segment_size();
681 ++k) {
682 const auto& segment = routing_response_.road(i).passage(j).segment(k);
683 passage_length += (segment.end_s() - segment.start_s());
684 }
685 ADEBUG << " passage_length[" << passage_length << "]";
686 road_length = std::max(road_length, passage_length);
687 }
688
689 road_lengths.push_back(
690 std::make_pair(routing_response_.road(i).id(), road_length));
691 ADEBUG << " road_length[" << road_length << "]";
692 }
693
694 /* debug
695 for (size_t i = 0; i < road_lengths.size(); ++i) {
696 AERROR << i << ": " << road_lengths[i].first << "; "
697 << road_lengths[i].second;
698 }
699 */
700
701 int adc_road_index = 0;
702 int adc_passage_index = 0;
703 double adc_passage_s = 0.0;
704 if (!GetADCCurrentRoutingIndex(&adc_road_index, &adc_passage_index,
705 &adc_passage_s) ||
706 adc_road_index < 0 || adc_passage_index < 0 || adc_passage_s < 0) {
707 // reset localization history
708 localizations_.clear();
709
710 const std::string msg = absl::StrCat(
711 "DISCARD: fail to locate ADC on routing. frame_num[", frame_num, "]");
712 AERROR << msg;
713 if (FLAGS_planning_offline_learning) {
714 log_file_ << msg << std::endl;
715 }
716 return false;
717 }
718 ADEBUG << "adc_road_index[" << adc_road_index << "] adc_passage_index["
719 << adc_passage_index << "] adc_passage_s[" << adc_passage_s << "]";
720
721 constexpr double kLocalRoutingForwardLength = 200.0;
722 constexpr double kLocalRoutingBackwardLength = 100.0;
723
724 // local_routing start point
725 int local_routing_start_road_index = 0;
726 double local_routing_start_road_s = 0;
727 double backward_length = kLocalRoutingBackwardLength;
728 for (int i = adc_road_index; i >= 0; --i) {
729 const double road_length =
730 (i == adc_road_index ? adc_passage_s : road_lengths[i].second);
731 if (backward_length > road_length) {
732 backward_length -= road_length;
733 } else {
734 local_routing_start_road_index = i;
735 local_routing_start_road_s = road_length - backward_length;
736 ADEBUG << "local_routing_start_road_index["
737 << local_routing_start_road_index
738 << "] local_routing_start_road_s[" << local_routing_start_road_s
739 << "]";
740 break;
741 }
742 }
743
744 // local routing end point
745 int local_routing_end_road_index = routing_response_.road_size() - 1;
746 double local_routing_end_road_s =
747 road_lengths[local_routing_end_road_index].second;
748 double forwardward_length = kLocalRoutingForwardLength;
749 for (int i = adc_road_index; i < routing_response_.road_size(); ++i) {
750 const double road_length =
751 (i == adc_road_index ? road_lengths[i].second - adc_passage_s
752 : road_lengths[i].second);
753 if (forwardward_length > road_length) {
754 forwardward_length -= road_length;
755 } else {
756 local_routing_end_road_index = i;
757 local_routing_end_road_s =
758 (i == adc_road_index ? adc_passage_s + forwardward_length
759 : forwardward_length);
760 ADEBUG << "local_routing_end_road_index[" << local_routing_end_road_index
761 << "] local_routing_end_road_s[" << local_routing_end_road_s
762 << "]";
763 break;
764 }
765 }
766
767 ADEBUG << "local_routing: start_road_index[" << local_routing_start_road_index
768 << "] start_road_s[" << local_routing_start_road_s
769 << "] end_road_index[" << local_routing_end_road_index
770 << "] end_road_s[" << local_routing_end_road_s << "]";
771
772 bool local_routing_end = false;
773 int last_passage_index = adc_passage_index;
774 for (int i = local_routing_start_road_index;
775 i <= local_routing_end_road_index; ++i) {
776 if (local_routing_end) break;
777
778 const auto& road = routing_response_.road(i);
779 auto local_routing_road = local_routing->add_road();
780 local_routing_road->set_id(road.id());
781
782 for (int j = 0; j < road.passage_size(); ++j) {
783 const auto& passage = road.passage(j);
784 auto local_routing_passage = local_routing_road->add_passage();
785 local_routing_passage->set_can_exit(passage.can_exit());
786 local_routing_passage->set_change_lane_type(passage.change_lane_type());
787
788 double road_s = 0;
789 for (int k = 0; k < passage.segment_size(); ++k) {
790 const auto& lane_segment = passage.segment(k);
791 road_s += (lane_segment.end_s() - lane_segment.start_s());
792
793 // first road
794 if (i == local_routing_start_road_index &&
795 road_s < local_routing_start_road_s) {
796 continue;
797 }
798
799 local_routing_passage->add_segment()->CopyFrom(lane_segment);
800 ADEBUG << "ADD road[" << i << "] id[" << road.id() << "] passage[" << j
801 << "] id[" << lane_segment.id() << "] length["
802 << lane_segment.end_s() - lane_segment.start_s() << "]";
803
804 // set local_routing_lane_ids
805 if (i == adc_road_index) {
806 // adc_road_index, pick the passage where ADC is
807 if (j == adc_passage_index) {
808 local_routing_lane_ids->push_back(lane_segment.id());
809 ADEBUG << "ADD local_routing_lane_ids: road[" << i << "] passage["
810 << j << "]: " << lane_segment.id();
811 last_passage_index = j;
812 }
813 } else {
814 if (road.passage_size() == 1) {
815 // single passage
816 ADEBUG << "ADD local_routing_lane_ids: road[" << i << "] passage["
817 << j << "]: " << lane_segment.id();
818 local_routing_lane_ids->push_back(lane_segment.id());
819 last_passage_index = j;
820 } else {
821 // multi passages
822 if (i < adc_road_index) {
823 // road behind ADC position
824 if (j == adc_passage_index ||
825 (j == road.passage_size() - 1 && j < adc_passage_index)) {
826 ADEBUG << "ADD local_routing_lane_ids: road[" << i
827 << "] passage[" << j << "] adc_passage_index["
828 << adc_passage_index << "] passage_size["
829 << road.passage_size() << "]: " << lane_segment.id();
830 local_routing_lane_ids->push_back(lane_segment.id());
831 }
832 } else {
833 // road in front of ADC position:
834 // pick the passage towards change-left
835 if (j == last_passage_index + 1 ||
836 (j == road.passage_size() - 1 &&
837 j < last_passage_index + 1)) {
838 ADEBUG << "ADD local_routing_lane_ids: road[" << i
839 << "] passage[" << j << "] last_passage_index["
840 << last_passage_index << "] passage_size["
841 << road.passage_size() << "]: " << lane_segment.id();
842 local_routing_lane_ids->push_back(lane_segment.id());
843 last_passage_index = j;
844 }
845 }
846 }
847 }
848
849 // last road
850 if (i == local_routing_end_road_index &&
851 road_s >= local_routing_end_road_s) {
852 local_routing_end = true;
853 break;
854 }
855 }
856 }
857 }
858
859 // check local_routing: to filter out map mismatching frames
860 if (FLAGS_planning_offline_learning) {
861 for (size_t i = 0; i < local_routing_lane_ids->size(); ++i) {
862 const std::string lane_id = local_routing_lane_ids->at(i);
863 const auto& lane =
865 if (lane == nullptr) {
866 const std::string msg = absl::StrCat(
867 "DISCARD: fail to find local_routing_lane on map. frame_num[",
868 frame_num, "] lane[", lane_id, "]");
869 AERROR << msg;
870 if (FLAGS_planning_offline_learning) {
871 log_file_ << msg << std::endl;
872 }
873 return false;
874 }
875 }
876 }
877
878 return true;
879}
880
881void MessageProcess::GenerateRoutingFeature(
882 const RoutingResponseFeature& local_routing,
883 const std::vector<std::string>& local_routing_lane_ids,
884 LearningDataFrame* learning_data_frame) {
885 auto routing = learning_data_frame->mutable_routing();
886 routing->Clear();
887
888 routing->mutable_routing_response()->mutable_measurement()->set_distance(
889 routing_response_.measurement().distance());
890 for (int i = 0; i < routing_response_.road_size(); ++i) {
891 routing->mutable_routing_response()->add_road()->CopyFrom(
892 routing_response_.road(i));
893 }
894
895 for (const auto& lane_id : local_routing_lane_ids) {
896 routing->add_local_routing_lane_id(lane_id);
897 }
898 routing->mutable_local_routing()->CopyFrom(local_routing);
899
900 const int frame_num = learning_data_frame->frame_num();
901 const int local_routing_lane_id_size = routing->local_routing_lane_id_size();
902 if (local_routing_lane_id_size == 0) {
903 const std::string msg =
904 absl::StrCat("empty local_routing. frame_num[", frame_num, "]");
905 AERROR << msg;
906 if (FLAGS_planning_offline_learning) {
907 log_file_ << msg << std::endl;
908 }
909 }
910 if (local_routing_lane_id_size > 100) {
911 const std::string msg = absl::StrCat(
912 "LARGE local_routing. frame_num[", frame_num,
913 "] local_routing_lane_id_size[", local_routing_lane_id_size, "]");
914 AERROR << msg;
915 if (FLAGS_planning_offline_learning) {
916 log_file_ << msg << std::endl;
917 }
918 }
919 ADEBUG << "local_routing: frame_num[" << frame_num << "] size["
920 << routing->local_routing_lane_id_size() << "]";
921}
922
923void MessageProcess::GenerateTrafficLightDetectionFeature(
924 LearningDataFrame* learning_data_frame) {
925 auto traffic_light_detection =
926 learning_data_frame->mutable_traffic_light_detection();
927 traffic_light_detection->set_message_timestamp_sec(
928 traffic_light_detection_message_timestamp_);
929 traffic_light_detection->clear_traffic_light();
930 for (const auto& tl : traffic_lights_) {
931 auto traffic_light = traffic_light_detection->add_traffic_light();
932 traffic_light->CopyFrom(tl);
933 }
934}
935
936void MessageProcess::GenerateADCTrajectoryPoints(
937 const std::list<LocalizationEstimate>& localizations,
938 LearningDataFrame* learning_data_frame) {
939 std::vector<LocalizationEstimate> localization_samples;
940 for (const auto& le : localizations) {
941 localization_samples.insert(localization_samples.begin(), le);
942 }
943
944 constexpr double kSearchRadius = 1.0;
945
946 std::string clear_area_id;
947 double clear_area_distance = 0.0;
948 std::string crosswalk_id;
949 double crosswalk_distance = 0.0;
950 std::string pnc_junction_id;
951 double pnc_junction_distance = 0.0;
952 std::string signal_id;
953 double signal_distance = 0.0;
954 std::string stop_sign_id;
955 double stop_sign_distance = 0.0;
956 std::string yield_sign_id;
957 double yield_sign_distance = 0.0;
958
959 int trajectory_point_index = 0;
960 std::vector<ADCTrajectoryPoint> adc_trajectory_points;
961 for (const auto& localization_sample : localization_samples) {
962 ADCTrajectoryPoint adc_trajectory_point;
963 adc_trajectory_point.set_timestamp_sec(
964 localization_sample.measurement_time());
965
966 auto trajectory_point = adc_trajectory_point.mutable_trajectory_point();
967 auto& pose = localization_sample.pose();
968 trajectory_point->mutable_path_point()->set_x(pose.position().x());
969 trajectory_point->mutable_path_point()->set_y(pose.position().y());
970 trajectory_point->mutable_path_point()->set_z(pose.position().z());
971 trajectory_point->mutable_path_point()->set_theta(pose.heading());
972
973 const double v =
974 std::sqrt(pose.linear_velocity().x() * pose.linear_velocity().x() +
975 pose.linear_velocity().y() * pose.linear_velocity().y());
976 trajectory_point->set_v(v);
977
978 const double a = std::sqrt(
979 pose.linear_acceleration().x() * pose.linear_acceleration().x() +
980 pose.linear_acceleration().y() * pose.linear_acceleration().y());
981 trajectory_point->set_a(a);
982
983 auto planning_tag = adc_trajectory_point.mutable_planning_tag();
984
985 // planning_tag: lane_turn
986 const auto& cur_point = common::util::PointFactory::ToPointENU(
987 pose.position().x(), pose.position().y(), pose.position().z());
988 LaneInfoConstPtr lane = GetCurrentLane(cur_point);
989
990 // lane_turn
992 if (lane != nullptr) {
993 lane_turn = lane->lane().turn();
994 }
995 planning_tag->set_lane_turn(lane_turn);
996 planning_tag_.set_lane_turn(lane_turn);
997
998 if (FLAGS_planning_offline_learning) {
999 // planning_tag: overlap tags
1000 double point_distance = 0.0;
1001 if (trajectory_point_index > 0) {
1002 auto& next_point = adc_trajectory_points[trajectory_point_index - 1]
1003 .trajectory_point()
1004 .path_point();
1005 point_distance = common::util::DistanceXY(next_point, cur_point);
1006 }
1007
1008 common::PointENU hdmap_point;
1009 hdmap_point.set_x(cur_point.x());
1010 hdmap_point.set_y(cur_point.y());
1011
1012 // clear area
1013 planning_tag->clear_clear_area();
1014 std::vector<ClearAreaInfoConstPtr> clear_areas;
1015 if (HDMapUtil::BaseMap().GetClearAreas(hdmap_point, kSearchRadius,
1016 &clear_areas) == 0 &&
1017 clear_areas.size() > 0) {
1018 clear_area_id = clear_areas.front()->id().id();
1019 clear_area_distance = 0.0;
1020 } else {
1021 if (!clear_area_id.empty()) {
1022 clear_area_distance += point_distance;
1023 }
1024 }
1025 if (!clear_area_id.empty()) {
1026 planning_tag->mutable_clear_area()->set_id(clear_area_id);
1027 planning_tag->mutable_clear_area()->set_distance(clear_area_distance);
1028 }
1029
1030 // crosswalk
1031 planning_tag->clear_crosswalk();
1032 std::vector<CrosswalkInfoConstPtr> crosswalks;
1033 if (HDMapUtil::BaseMap().GetCrosswalks(hdmap_point, kSearchRadius,
1034 &crosswalks) == 0 &&
1035 crosswalks.size() > 0) {
1036 crosswalk_id = crosswalks.front()->id().id();
1037 crosswalk_distance = 0.0;
1038 } else {
1039 if (!crosswalk_id.empty()) {
1040 crosswalk_distance += point_distance;
1041 }
1042 }
1043 if (!crosswalk_id.empty()) {
1044 planning_tag->mutable_crosswalk()->set_id(crosswalk_id);
1045 planning_tag->mutable_crosswalk()->set_distance(crosswalk_distance);
1046 }
1047
1048 // pnc_junction
1049 std::vector<PNCJunctionInfoConstPtr> pnc_junctions;
1050 if (HDMapUtil::BaseMap().GetPNCJunctions(hdmap_point, kSearchRadius,
1051 &pnc_junctions) == 0 &&
1052 pnc_junctions.size() > 0) {
1053 pnc_junction_id = pnc_junctions.front()->id().id();
1054 pnc_junction_distance = 0.0;
1055 } else {
1056 if (!pnc_junction_id.empty()) {
1057 pnc_junction_distance += point_distance;
1058 }
1059 }
1060 if (!pnc_junction_id.empty()) {
1061 planning_tag->mutable_pnc_junction()->set_id(pnc_junction_id);
1062 planning_tag->mutable_pnc_junction()->set_distance(
1063 pnc_junction_distance);
1064 }
1065
1066 // signal
1067 std::vector<SignalInfoConstPtr> signals;
1068 if (HDMapUtil::BaseMap().GetSignals(hdmap_point, kSearchRadius,
1069 &signals) == 0 &&
1070 signals.size() > 0) {
1071 signal_id = signals.front()->id().id();
1072 signal_distance = 0.0;
1073 } else {
1074 if (!signal_id.empty()) {
1075 signal_distance += point_distance;
1076 }
1077 }
1078 if (!signal_id.empty()) {
1079 planning_tag->mutable_signal()->set_id(signal_id);
1080 planning_tag->mutable_signal()->set_distance(signal_distance);
1081 }
1082
1083 // stop sign
1084 std::vector<StopSignInfoConstPtr> stop_signs;
1085 if (HDMapUtil::BaseMap().GetStopSigns(hdmap_point, kSearchRadius,
1086 &stop_signs) == 0 &&
1087 stop_signs.size() > 0) {
1088 stop_sign_id = stop_signs.front()->id().id();
1089 stop_sign_distance = 0.0;
1090 } else {
1091 if (!stop_sign_id.empty()) {
1092 stop_sign_distance += point_distance;
1093 }
1094 }
1095 if (!stop_sign_id.empty()) {
1096 planning_tag->mutable_stop_sign()->set_id(stop_sign_id);
1097 planning_tag->mutable_stop_sign()->set_distance(stop_sign_distance);
1098 }
1099
1100 // yield sign
1101 std::vector<YieldSignInfoConstPtr> yield_signs;
1102 if (HDMapUtil::BaseMap().GetYieldSigns(hdmap_point, kSearchRadius,
1103 &yield_signs) == 0 &&
1104 yield_signs.size() > 0) {
1105 yield_sign_id = yield_signs.front()->id().id();
1106 yield_sign_distance = 0.0;
1107 } else {
1108 if (!yield_sign_id.empty()) {
1109 yield_sign_distance += point_distance;
1110 }
1111 }
1112 if (!yield_sign_id.empty()) {
1113 planning_tag->mutable_yield_sign()->set_id(yield_sign_id);
1114 planning_tag->mutable_yield_sign()->set_distance(yield_sign_distance);
1115 }
1116 }
1117
1118 adc_trajectory_points.push_back(adc_trajectory_point);
1119 ++trajectory_point_index;
1120 }
1121
1122 // update learning data
1123 std::reverse(adc_trajectory_points.begin(), adc_trajectory_points.end());
1124 for (const auto& trajectory_point : adc_trajectory_points) {
1125 auto adc_trajectory_point = learning_data_frame->add_adc_trajectory_point();
1126 adc_trajectory_point->CopyFrom(trajectory_point);
1127 }
1128 if (adc_trajectory_points.size() <= 5) {
1129 const std::string msg =
1130 absl::StrCat("too few adc_trajectory_points: frame_num[",
1131 learning_data_frame->frame_num(), "] size[",
1132 adc_trajectory_points.size(), "]");
1133 AERROR << msg;
1134 if (FLAGS_planning_offline_learning) {
1135 log_file_ << msg << std::endl;
1136 }
1137 }
1138 // AINFO << "number of ADC trajectory points in one frame: "
1139 // << trajectory_point_index;
1140}
1141
1142void MessageProcess::GeneratePlanningTag(
1143 LearningDataFrame* learning_data_frame) {
1144 auto planning_tag = learning_data_frame->mutable_planning_tag();
1145 if (FLAGS_planning_offline_learning) {
1146 planning_tag->set_lane_turn(planning_tag_.lane_turn());
1147 } else {
1148 if (planning_config_.learning_mode() != PlanningConfig::NO_LEARNING) {
1149 // online learning
1150 planning_tag->CopyFrom(planning_tag_);
1151 }
1152 }
1153}
1154
1155bool MessageProcess::GenerateLearningDataFrame(
1156 LearningDataFrame* learning_data_frame) {
1157 const double start_timestamp = Clock::NowInSeconds();
1158
1159 RoutingResponseFeature local_routing;
1160 std::vector<std::string> local_routing_lane_ids;
1161 if (!GenerateLocalRouting(total_learning_data_frame_num_, &local_routing,
1162 &local_routing_lane_ids)) {
1163 return false;
1164 }
1165
1166 // add timestamp_sec & frame_num
1167 learning_data_frame->set_message_timestamp_sec(
1168 localizations_.back().header().timestamp_sec());
1169 learning_data_frame->set_frame_num(total_learning_data_frame_num_++);
1170
1171 // map_name
1172 learning_data_frame->set_map_name(map_name_);
1173
1174 // planning_tag
1175 GeneratePlanningTag(learning_data_frame);
1176
1177 // add chassis
1178 auto chassis = learning_data_frame->mutable_chassis();
1179 chassis->CopyFrom(chassis_feature_);
1180
1181 // add localization
1182 auto localization = learning_data_frame->mutable_localization();
1183 localization->set_message_timestamp_sec(
1184 localizations_.back().header().timestamp_sec());
1185 const auto& pose = localizations_.back().pose();
1186 localization->mutable_position()->CopyFrom(pose.position());
1187 localization->set_heading(pose.heading());
1188 localization->mutable_linear_velocity()->CopyFrom(pose.linear_velocity());
1189 localization->mutable_linear_acceleration()->CopyFrom(
1190 pose.linear_acceleration());
1191 localization->mutable_angular_velocity()->CopyFrom(pose.angular_velocity());
1192
1193 // add traffic_light
1194 GenerateTrafficLightDetectionFeature(learning_data_frame);
1195
1196 // add routing
1197 GenerateRoutingFeature(local_routing, local_routing_lane_ids,
1198 learning_data_frame);
1199
1200 // add obstacle
1201 GenerateObstacleFeature(learning_data_frame);
1202
1203 // add trajectory_points
1204 GenerateADCTrajectoryPoints(localizations_, learning_data_frame);
1205
1206 const double end_timestamp = Clock::NowInSeconds();
1207 const double time_diff_ms = (end_timestamp - start_timestamp) * 1000;
1208 ADEBUG << "MessageProcess: start_timestamp[" << start_timestamp
1209 << "] end_timestamp[" << end_timestamp << "] time_diff_ms["
1210 << time_diff_ms << "]";
1211 return true;
1212}
1213
1214} // namespace planning
1215} // namespace apollo
static PointENU ToPointENU(const double x, const double y, const double z=0)
a singleton clock that can be used to get the current timestamp.
Definition clock.h:39
static double NowInSeconds()
gets the current time in second.
Definition clock.cc:56
bool ReadMessage(RecordMessage *message, uint64_t begin_time=0, uint64_t end_time=std::numeric_limits< uint64_t >::max())
Read one message from reader.
bool IsValid() const
Is this record reader is valid.
static const HDMap * BaseMapPtr()
static const HDMap & BaseMap()
int GetLanes(const apollo::common::PointENU &point, double distance, std::vector< LaneInfoConstPtr > *lanes) const
get all lanes in certain range
Definition hdmap.cc:90
LaneInfoConstPtr GetLaneById(const Id &id) const
Definition hdmap.cc:34
static void InsertLearningDataFrame(const std::string &record_filename, const LearningDataFrame &learning_data_frame)
Insert a a frame of learning data
bool Init(const PlanningConfig &planning_config)
void OnPrediction(const apollo::prediction::PredictionObstacles &prediction_obstacles)
void OnStoryTelling(const apollo::storytelling::Stories &stories)
void OnRoutingResponse(const apollo::routing::RoutingResponse &routing_response)
void OnLocalization(const apollo::localization::LocalizationEstimate &le)
void OnTrafficLightDetection(const apollo::perception::TrafficLightDetection &traffic_light_detection)
void ProcessOfflineData(const std::string &record_file)
void OnHMIStatus(apollo::dreamview::HMIStatus hmi_status)
void OnChassis(const apollo::canbus::Chassis &chassis)
Planning module main class.
#define ADEBUG
Definition log.h:41
#define AERROR
Definition log.h:44
#define AINFO
Definition log.h:42
Some util functions.
double DistanceXY(const U &u, const V &v)
calculate the distance beteween Point u and Point v, which are all have member function x() and y() i...
Definition util.h:97
std::shared_ptr< const PNCJunctionInfo > PNCJunctionInfoConstPtr
std::shared_ptr< const JunctionInfo > JunctionInfoConstPtr
apollo::hdmap::Id MakeMapId(const std::string &id)
create a Map ID given a string.
Definition hdmap_util.h:85
std::shared_ptr< const StopSignInfo > StopSignInfoConstPtr
std::shared_ptr< const LaneInfo > LaneInfoConstPtr
std::shared_ptr< const ClearAreaInfo > ClearAreaInfoConstPtr
std::shared_ptr< const SignalInfo > SignalInfoConstPtr
std::shared_ptr< const CrosswalkInfo > CrosswalkInfoConstPtr
std::shared_ptr< const YieldSignInfo > YieldSignInfoConstPtr
std::pair< double, double > WorldCoordToObjCoord(std::pair< double, double > input_world_coord, std::pair< double, double > obj_world_coord, double obj_world_angle)
Definition math_util.cc:26
double WorldAngleToObjAngle(double input_world_angle, double obj_world_angle)
Definition math_util.cc:37
class register implement
Definition arena_queue.h:37
optional GearPosition gear_location
optional apollo::common::Header header
optional float steering_percentage
Definition chassis.proto:88
optional float speed_mps
Definition chassis.proto:70
optional float brake_percentage
Definition chassis.proto:82
optional float throttle_percentage
Definition chassis.proto:79
optional double timestamp_sec
Definition header.proto:9
Basic data struct of record message.
std::string content
The content of the message.
std::string channel_name
The channel name of the message.
optional apollo::common::Header header
optional PlanningLearningMode learning_mode
optional apollo::hdmap::Lane::LaneTurn lane_turn
optional string traffic_light_detection_topic
optional apollo::perception::PerceptionObstacle perception_obstacle
repeated LaneSegment segment
optional apollo::routing::Measurement measurement
Definition routing.proto:26
repeated apollo::routing::RoadSegment road
Definition routing.proto:25
optional CloseToSignal close_to_signal
Definition story.proto:52
optional CloseToJunction close_to_junction
Definition story.proto:51
optional CloseToCrosswalk close_to_crosswalk
Definition story.proto:50
optional CloseToYieldSign close_to_yield_sign
Definition story.proto:54
optional CloseToStopSign close_to_stop_sign
Definition story.proto:53
optional CloseToClearArea close_to_clear_area
Definition story.proto:49