Apollo 10.0
自动驾驶开放平台
apollo::planning::MessageProcess类 参考

#include <message_process.h>

apollo::planning::MessageProcess 的协作图:

Public 成员函数

bool Init (const PlanningConfig &planning_config)
 
bool Init (const PlanningConfig &planning_config, const std::shared_ptr< DependencyInjector > &injector)
 
void Close ()
 
void OnChassis (const apollo::canbus::Chassis &chassis)
 
void OnHMIStatus (apollo::dreamview::HMIStatus hmi_status)
 
void OnLocalization (const apollo::localization::LocalizationEstimate &le)
 
void OnPrediction (const apollo::prediction::PredictionObstacles &prediction_obstacles)
 
void OnRoutingResponse (const apollo::routing::RoutingResponse &routing_response)
 
void OnStoryTelling (const apollo::storytelling::Stories &stories)
 
void OnTrafficLightDetection (const apollo::perception::TrafficLightDetection &traffic_light_detection)
 
void ProcessOfflineData (const std::string &record_file)
 

详细描述

在文件 message_process.h 第 48 行定义.

成员函数说明

◆ Close()

void apollo::planning::MessageProcess::Close ( )

在文件 message_process.cc 第 94 行定义.

94 {
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}
#define AINFO
Definition log.h:42

◆ Init() [1/2]

bool apollo::planning::MessageProcess::Init ( const PlanningConfig &  planning_config)

在文件 message_process.cc 第 62 行定义.

62 {
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}

◆ Init() [2/2]

bool apollo::planning::MessageProcess::Init ( const PlanningConfig &  planning_config,
const std::shared_ptr< DependencyInjector > &  injector 
)

在文件 message_process.cc 第 88 行定义.

89 {
90 injector_ = injector;
91 return Init(planning_config);
92}
bool Init(const PlanningConfig &planning_config)

◆ OnChassis()

void apollo::planning::MessageProcess::OnChassis ( const apollo::canbus::Chassis &  chassis)

在文件 message_process.cc 第 111 行定义.

111 {
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}
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

◆ OnHMIStatus()

void apollo::planning::MessageProcess::OnHMIStatus ( apollo::dreamview::HMIStatus  hmi_status)

在文件 message_process.cc 第 120 行定义.

120 {
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 = "modules/map/data/";
125 FLAGS_map_dir = map_base_folder + map_name_;
126 }
127}

◆ OnLocalization()

void apollo::planning::MessageProcess::OnLocalization ( const apollo::localization::LocalizationEstimate &  le)

在文件 message_process.cc 第 129 行定义.

129 {
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}
static void InsertLearningDataFrame(const std::string &record_filename, const LearningDataFrame &learning_data_frame)
Insert a a frame of learning data
#define ADEBUG
Definition log.h:41
#define AERROR
Definition log.h:44
optional apollo::common::Header header
optional PlanningLearningMode learning_mode

◆ OnPrediction()

void apollo::planning::MessageProcess::OnPrediction ( const apollo::prediction::PredictionObstacles &  prediction_obstacles)

在文件 message_process.cc 第 186 行定义.

187 {
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}
optional apollo::perception::PerceptionObstacle perception_obstacle

◆ OnRoutingResponse()

void apollo::planning::MessageProcess::OnRoutingResponse ( const apollo::routing::RoutingResponse &  routing_response)

在文件 message_process.cc 第 270 行定义.

271 {
272 ADEBUG << "routing_response received at frame["
273 << total_learning_data_frame_num_ << "]";
274 routing_response_.CopyFrom(routing_response);
275}

◆ OnStoryTelling()

void apollo::planning::MessageProcess::OnStoryTelling ( const apollo::storytelling::Stories &  stories)

在文件 message_process.cc 第 277 行定义.

278 {
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}
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

◆ OnTrafficLightDetection()

void apollo::planning::MessageProcess::OnTrafficLightDetection ( const apollo::perception::TrafficLightDetection &  traffic_light_detection)

在文件 message_process.cc 第 325 行定义.

326 {
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}

◆ ProcessOfflineData()

void apollo::planning::MessageProcess::ProcessOfflineData ( const std::string &  record_file)

在文件 message_process.cc 第 346 行定义.

346 {
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}
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 OnHMIStatus(apollo::dreamview::HMIStatus hmi_status)
void OnChassis(const apollo::canbus::Chassis &chassis)
optional string traffic_light_detection_topic

该类的文档由以下文件生成: