24#include "modules/common_msgs/map_msgs/map_lane.pb.h"
44using apollo::dreamview::HMIStatus;
63 planning_config_.CopyFrom(planning_config);
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";
72 map_name_ = FLAGS_map_dir.substr(FLAGS_map_dir.find_last_of(
"/") + 1);
74 obstacle_history_map_.clear();
76 if (FLAGS_planning_offline_learning) {
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));
89 const std::shared_ptr<DependencyInjector>& injector) {
91 return Init(planning_config);
97 if (FLAGS_planning_offline_learning) {
99 const std::string msg = absl::StrCat(
"Total learning_data_frame number: ",
100 total_learning_data_frame_num_);
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
113 chassis_feature_.set_speed_mps(chassis.
speed_mps());
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_;
130 static constexpr double kEpsilon = 1e-12;
131 if (std::abs(last_localization_message_timestamp_sec_) < kEpsilon) {
134 const double time_diff =
136 if (time_diff < 1.0 / FLAGS_planning_loop_rate) {
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[",
150 if (FLAGS_planning_offline_learning) {
151 log_file_ << msg << std::endl;
155 localizations_.push_back(le);
157 while (!localizations_.empty()) {
158 if (localizations_.back().header().timestamp_sec() -
159 localizations_.front().header().timestamp_sec() <=
160 FLAGS_trajectory_time_length) {
163 localizations_.pop_front();
166 ADEBUG <<
"OnLocalization: size[" << localizations_.size() <<
"] time_diff["
167 << localizations_.back().header().timestamp_sec() -
168 localizations_.front().header().timestamp_sec()
173 if (GenerateLearningDataFrame(&learning_data_frame)) {
175 if (FLAGS_planning_offline_learning) {
180 injector_->learning_based_data()->InsertLearningDataFrame(
181 learning_data_frame);
188 prediction_obstacles_map_.clear();
189 for (
int i = 0; i < prediction_obstacles.prediction_obstacle_size(); ++i) {
190 const auto& prediction_obstacle =
193 prediction_obstacles_map_[obstacle_id].CopyFrom(prediction_obstacle);
221 for (
const auto& m : prediction_obstacles_map_) {
222 const auto& perception_obstale = m.second.perception_obstacle();
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));
234 obstacle_trajectory_point.mutable_acceleration()->CopyFrom(
235 perception_obstale.acceleration());
237 obstacle_history_map_[m.first].back().timestamp_sec();
238 if (obstacle_history_map_[m.first].empty() ||
240 obstacle_history_map_[m.first].back().timestamp_sec() >
242 obstacle_history_map_[m.first].push_back(obstacle_trajectory_point);
245 const double time_diff =
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,
"]");
254 if (FLAGS_planning_offline_learning) {
255 log_file_ << msg << std::endl;
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) {
265 obstacle_history.pop_front();
272 ADEBUG <<
"routing_response received at frame["
273 << total_learning_data_frame_num_ <<
"]";
274 routing_response_.CopyFrom(routing_response);
280 if (stories.has_close_to_clear_area()) {
281 auto clear_area_tag = planning_tag_.mutable_clear_area();
287 if (stories.has_close_to_crosswalk()) {
288 auto crosswalk_tag = planning_tag_.mutable_crosswalk();
294 if (stories.has_close_to_junction() &&
296 auto pnc_junction_tag = planning_tag_.mutable_pnc_junction();
302 if (stories.has_close_to_signal()) {
303 auto signal_tag = planning_tag_.mutable_signal();
309 if (stories.has_close_to_stop_sign()) {
310 auto stop_sign_tag = planning_tag_.mutable_stop_sign();
316 if (stories.has_close_to_yield_sign()) {
317 auto yield_sign_tag = planning_tag_.mutable_yield_sign();
322 ADEBUG << planning_tag_.DebugString();
329 traffic_light_detection_message_timestamp_ =
331 traffic_lights_.clear();
332 for (
int i = 0; i < traffic_light_detection.traffic_light_size(); ++i) {
336 traffic_light.set_confidence(
338 traffic_light.set_tracking_time(
340 traffic_light.set_remaining_time(
342 traffic_lights_.push_back(traffic_light);
347 log_file_ <<
"Processing: " << record_file << std::endl;
348 record_file_ = record_file;
352 AERROR <<
"Fail to open " << record_file;
361 if (chassis.ParseFromString(message.
content)) {
367 if (localization.ParseFromString(message.
content)) {
372 HMIStatus hmi_status;
373 if (hmi_status.ParseFromString(message.
content)) {
379 if (prediction_obstacles.ParseFromString(message.
content)) {
385 if (routing_response.ParseFromString(message.
content)) {
391 if (stories.ParseFromString(message.
content)) {
397 if (traffic_light_detection.ParseFromString(message.
content)) {
404bool MessageProcess::GetADCCurrentRoutingIndex(
int* adc_road_index,
405 int* adc_passage_index,
406 double* adc_passage_s) {
407 if (localizations_.empty())
return false;
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;
415 for (
auto& lane : lanes) {
416 for (
int i = 0; i < routing_response_.road_size(); ++i) {
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();
423 passage_s += (segment.end_s() - segment.start_s());
424 if (lane->id().id() == segment.id()) {
426 *adc_passage_index = j;
427 *adc_passage_s = passage_s;
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) {
444 if (lanes.size() > 0) {
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();
454 if (lane->id().id() ==
466int MessageProcess::GetADCCurrentInfo(ADCCurrentInfo* adc_curr_info) {
467 CHECK_NOTNULL(adc_curr_info);
468 if (localizations_.empty())
return -1;
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();
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());
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);
505 obj_traj_point.theta(), adc_curr_info.adc_cur_heading_);
506 perception_obstacle_history->set_theta(relative_theta);
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);
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);
526 for (
int i = 0; i < obj_traj_point.polygon_point_size(); ++i) {
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);
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());
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());
558 for (
int j = 0; j < obstacle_trajectory.trajectory_point_size(); ++j) {
559 const auto& obstacle_trajectory_point =
560 obstacle_trajectory.trajectory_point(j);
562 if (trajectory->trajectory_point_size() > 0) {
563 const auto last_relative_time =
565 ->trajectory_point(trajectory->trajectory_point_size() - 1)
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(),
"]");
575 if (FLAGS_planning_offline_learning) {
576 log_file_ << msg << std::endl;
582 auto trajectory_point = trajectory->add_trajectory_point();
585 trajectory_point->mutable_trajectory_point()->mutable_path_point();
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);
597 obstacle_trajectory_point.path_point().theta(),
598 adc_curr_info.adc_cur_heading_);
599 path_point->set_theta(relative_theta);
601 path_point->set_s(obstacle_trajectory_point.path_point().s());
602 path_point->set_lane_id(obstacle_trajectory_point.path_point().lane_id());
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());
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(),
"]");
625 if (FLAGS_planning_offline_learning) {
626 log_file_ << msg << std::endl;
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();
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());
643 GenerateObstacleTrajectory(frame_num, m.first, adc_curr_info,
647 GenerateObstaclePrediction(frame_num, m.second, adc_curr_info,
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();
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,
"]");
664 if (FLAGS_planning_offline_learning) {
665 log_file_ << msg << std::endl;
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();
683 passage_length += (segment.end_s() - segment.start_s());
685 ADEBUG <<
" passage_length[" << passage_length <<
"]";
686 road_length = std::max(road_length, passage_length);
689 road_lengths.push_back(
690 std::make_pair(routing_response_.
road(i).
id(), road_length));
691 ADEBUG <<
" road_length[" << road_length <<
"]";
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,
706 adc_road_index < 0 || adc_passage_index < 0 || adc_passage_s < 0) {
708 localizations_.clear();
710 const std::string msg = absl::StrCat(
711 "DISCARD: fail to locate ADC on routing. frame_num[", frame_num,
"]");
713 if (FLAGS_planning_offline_learning) {
714 log_file_ << msg << std::endl;
718 ADEBUG <<
"adc_road_index[" << adc_road_index <<
"] adc_passage_index["
719 << adc_passage_index <<
"] adc_passage_s[" << adc_passage_s <<
"]";
721 constexpr double kLocalRoutingForwardLength = 200.0;
722 constexpr double kLocalRoutingBackwardLength = 100.0;
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;
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
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;
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
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 <<
"]";
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;
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());
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());
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());
794 if (i == local_routing_start_road_index &&
795 road_s < local_routing_start_road_s) {
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() <<
"]";
805 if (i == adc_road_index) {
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;
814 if (road.passage_size() == 1) {
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;
822 if (i < adc_road_index) {
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());
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;
850 if (i == local_routing_end_road_index &&
851 road_s >= local_routing_end_road_s) {
852 local_routing_end =
true;
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);
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,
"]");
870 if (FLAGS_planning_offline_learning) {
871 log_file_ << msg << std::endl;
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();
888 routing->mutable_routing_response()->mutable_measurement()->set_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));
895 for (
const auto& lane_id : local_routing_lane_ids) {
896 routing->add_local_routing_lane_id(lane_id);
898 routing->mutable_local_routing()->CopyFrom(local_routing);
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,
"]");
906 if (FLAGS_planning_offline_learning) {
907 log_file_ << msg << std::endl;
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,
"]");
915 if (FLAGS_planning_offline_learning) {
916 log_file_ << msg << std::endl;
919 ADEBUG <<
"local_routing: frame_num[" << frame_num <<
"] size["
920 << routing->local_routing_lane_id_size() <<
"]";
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);
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);
944 constexpr double kSearchRadius = 1.0;
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;
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());
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());
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);
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);
983 auto planning_tag = adc_trajectory_point.mutable_planning_tag();
987 pose.position().x(), pose.position().y(), pose.position().z());
992 if (lane !=
nullptr) {
993 lane_turn = lane->lane().turn();
995 planning_tag->set_lane_turn(lane_turn);
996 planning_tag_.set_lane_turn(lane_turn);
998 if (FLAGS_planning_offline_learning) {
1000 double point_distance = 0.0;
1001 if (trajectory_point_index > 0) {
1002 auto& next_point = adc_trajectory_points[trajectory_point_index - 1]
1008 common::PointENU hdmap_point;
1009 hdmap_point.set_x(cur_point.x());
1010 hdmap_point.set_y(cur_point.y());
1013 planning_tag->clear_clear_area();
1014 std::vector<ClearAreaInfoConstPtr> clear_areas;
1016 &clear_areas) == 0 &&
1017 clear_areas.size() > 0) {
1018 clear_area_id = clear_areas.front()->id().id();
1019 clear_area_distance = 0.0;
1021 if (!clear_area_id.empty()) {
1022 clear_area_distance += point_distance;
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);
1031 planning_tag->clear_crosswalk();
1032 std::vector<CrosswalkInfoConstPtr> crosswalks;
1034 &crosswalks) == 0 &&
1035 crosswalks.size() > 0) {
1036 crosswalk_id = crosswalks.front()->id().id();
1037 crosswalk_distance = 0.0;
1039 if (!crosswalk_id.empty()) {
1040 crosswalk_distance += point_distance;
1043 if (!crosswalk_id.empty()) {
1044 planning_tag->mutable_crosswalk()->set_id(crosswalk_id);
1045 planning_tag->mutable_crosswalk()->set_distance(crosswalk_distance);
1049 std::vector<PNCJunctionInfoConstPtr> pnc_junctions;
1051 &pnc_junctions) == 0 &&
1052 pnc_junctions.size() > 0) {
1053 pnc_junction_id = pnc_junctions.front()->id().id();
1054 pnc_junction_distance = 0.0;
1056 if (!pnc_junction_id.empty()) {
1057 pnc_junction_distance += point_distance;
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);
1067 std::vector<SignalInfoConstPtr> signals;
1070 signals.size() > 0) {
1071 signal_id = signals.front()->id().id();
1072 signal_distance = 0.0;
1074 if (!signal_id.empty()) {
1075 signal_distance += point_distance;
1078 if (!signal_id.empty()) {
1079 planning_tag->mutable_signal()->set_id(signal_id);
1080 planning_tag->mutable_signal()->set_distance(signal_distance);
1084 std::vector<StopSignInfoConstPtr> stop_signs;
1086 &stop_signs) == 0 &&
1087 stop_signs.size() > 0) {
1088 stop_sign_id = stop_signs.front()->id().id();
1089 stop_sign_distance = 0.0;
1091 if (!stop_sign_id.empty()) {
1092 stop_sign_distance += point_distance;
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);
1101 std::vector<YieldSignInfoConstPtr> yield_signs;
1103 &yield_signs) == 0 &&
1104 yield_signs.size() > 0) {
1105 yield_sign_id = yield_signs.front()->id().id();
1106 yield_sign_distance = 0.0;
1108 if (!yield_sign_id.empty()) {
1109 yield_sign_distance += point_distance;
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);
1118 adc_trajectory_points.push_back(adc_trajectory_point);
1119 ++trajectory_point_index;
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);
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(),
"]");
1134 if (FLAGS_planning_offline_learning) {
1135 log_file_ << msg << std::endl;
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());
1150 planning_tag->CopyFrom(planning_tag_);
1155bool MessageProcess::GenerateLearningDataFrame(
1156 LearningDataFrame* learning_data_frame) {
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)) {
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_++);
1172 learning_data_frame->set_map_name(map_name_);
1175 GeneratePlanningTag(learning_data_frame);
1178 auto chassis = learning_data_frame->mutable_chassis();
1179 chassis->CopyFrom(chassis_feature_);
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());
1194 GenerateTrafficLightDetectionFeature(learning_data_frame);
1197 GenerateRoutingFeature(local_routing, local_routing_lane_ids,
1198 learning_data_frame);
1201 GenerateObstacleFeature(learning_data_frame);
1204 GenerateADCTrajectoryPoints(localizations_, learning_data_frame);
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 <<
"]";
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.
static double NowInSeconds()
gets the current time in second.
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
LaneInfoConstPtr GetLaneById(const Id &id) const
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.
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...
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.
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)
double WorldAngleToObjAngle(double input_world_angle, double obj_world_angle)
optional GearPosition gear_location
optional apollo::common::Header header
optional float steering_percentage
optional float brake_percentage
optional float throttle_percentage
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 apollo::common::Header header
repeated TrafficLight traffic_light
optional double remaining_time
optional double tracking_time
optional double confidence
optional double timestamp_sec
optional PlanningLearningMode learning_mode
optional TopicConfig topic_config
optional apollo::hdmap::Lane::LaneTurn lane_turn
optional string story_telling_topic
optional string chassis_topic
optional string localization_topic
optional string routing_response_topic
optional string hmi_status_topic
optional string traffic_light_detection_topic
optional string prediction_topic
optional apollo::perception::PerceptionObstacle perception_obstacle
repeated PredictionObstacle prediction_obstacle
repeated LaneSegment segment
optional apollo::routing::Measurement measurement
repeated apollo::routing::RoadSegment road
optional JunctionType type
optional CloseToSignal close_to_signal
optional CloseToJunction close_to_junction
optional CloseToCrosswalk close_to_crosswalk
optional CloseToYieldSign close_to_yield_sign
optional CloseToStopSign close_to_stop_sign
optional CloseToClearArea close_to_clear_area