Apollo 10.0
自动驾驶开放平台
apollo::prediction::EvaluatorManager类 参考

#include <evaluator_manager.h>

apollo::prediction::EvaluatorManager 的协作图:

Public 成员函数

 EvaluatorManager ()
 Constructor
 
virtual ~EvaluatorManager ()=default
 Destructor
 
void Init (const PredictionConf &config)
 Initializer
 
EvaluatorGetEvaluator (const ObstacleConf::EvaluatorType &type)
 Get evaluator
 
void Run (const ADCTrajectoryContainer *adc_trajectory_container, ObstaclesContainer *obstacles_container)
 Run evaluators
 
void EvaluateObstacle (const ADCTrajectoryContainer *adc_trajectory_container, Obstacle *obstacle, ObstaclesContainer *obstacles_container, std::vector< Obstacle * > dynamic_env)
 
void EvaluateObstacle (Obstacle *obstacle, ObstaclesContainer *obstacles_container)
 
void EvaluateMultiObstacle (const ADCTrajectoryContainer *adc_trajectory_container, ObstaclesContainer *obstacles_container)
 

详细描述

在文件 evaluator_manager.h43 行定义.

构造及析构函数说明

◆ EvaluatorManager()

apollo::prediction::EvaluatorManager::EvaluatorManager ( )

Constructor

在文件 evaluator_manager.cc98 行定义.

98{}

◆ ~EvaluatorManager()

virtual apollo::prediction::EvaluatorManager::~EvaluatorManager ( )
virtualdefault

Destructor

成员函数说明

◆ EvaluateMultiObstacle()

void apollo::prediction::EvaluatorManager::EvaluateMultiObstacle ( const ADCTrajectoryContainer adc_trajectory_container,
ObstaclesContainer obstacles_container 
)

在文件 evaluator_manager.cc371 行定义.

373 {
374 Evaluator* evaluator = nullptr;
375 evaluator = GetEvaluator(multi_agent_evaluator_);
376 CHECK_NOTNULL(evaluator);
377 std::vector<int> obs_ids = obstacles_container->curr_frame_considered_obstacle_ids();
378
379 // 1. Evaluate the pedestrain
380 if (FLAGS_enable_multi_agent_pedestrian_evaluator) {
381 for (int id : obs_ids) {
382 Obstacle* obstacle = obstacles_container->GetObstacle(id);
383 // whether the pedestrian exsit in the conside obstacle list
384 if (obstacle->type() == perception::PerceptionObstacle::PEDESTRIAN &&
385 !obstacle->IsStill()) {
386 evaluator->Evaluate(adc_trajectory_container,
387 obstacle, obstacles_container);
388 AINFO << "Succeed to run multi agent pedestrian evaluator!";
389 break;
390 }
391 }
392 }
393
394 // 2. Evaluate the vechicle
395 if (FLAGS_enable_multi_agent_vehicle_evaluator) {
396 for (int id : obs_ids) {
397 Obstacle* obstacle = obstacles_container->GetObstacle(id);
398 // whether the vehicle exsit in the conside obstacle list
399 if (obstacle->type() == perception::PerceptionObstacle::VEHICLE &&
400 !obstacle->IsStill()) {
401 evaluator->Evaluate(adc_trajectory_container,
402 obstacle, obstacles_container);
403 AINFO << "Succeed to run multi agent vehicle evaluator!";
404 break;
405 }
406 }
407 }
408}
Evaluator * GetEvaluator(const ObstacleConf::EvaluatorType &type)
Get evaluator
#define AINFO
Definition log.h:42

◆ EvaluateObstacle() [1/2]

void apollo::prediction::EvaluatorManager::EvaluateObstacle ( const ADCTrajectoryContainer adc_trajectory_container,
Obstacle obstacle,
ObstaclesContainer obstacles_container,
std::vector< Obstacle * >  dynamic_env 
)

在文件 evaluator_manager.cc269 行定义.

273 {
274 Evaluator* evaluator = nullptr;
275 // Select different evaluators depending on the obstacle's type.
276 switch (obstacle->type()) {
278 if (FLAGS_enable_multi_agent_vehicle_evaluator) {
279 AINFO << "The vehicles are evaluated by multi agent evaluator!";
280 break;
281 }
282 if (obstacle->IsCaution() && !obstacle->IsSlow()) {
283 if (obstacle->IsInteractiveObstacle()) {
284 evaluator = GetEvaluator(interaction_evaluator_);
285 } else if (obstacle->IsNearJunction()) {
286 evaluator = GetEvaluator(vehicle_in_junction_caution_evaluator_);
287 } else if (obstacle->IsOnLane()) {
288 evaluator = GetEvaluator(vehicle_on_lane_caution_evaluator_);
289 } else {
290 evaluator = GetEvaluator(vehicle_default_caution_evaluator_);
291 }
292 CHECK_NOTNULL(evaluator);
293 AINFO << "Caution Obstacle: " << obstacle->id() << " used " << evaluator->GetName();
294 // Evaluate and break if success
295 if (evaluator->GetName() == "JOINTLY_PREDICTION_PLANNING_EVALUATOR") {
296 if (evaluator->Evaluate(adc_trajectory_container,
297 obstacle, obstacles_container)) {
298 break;
299 } else {
300 AERROR << "Obstacle: " << obstacle->id()
301 << " interaction evaluator failed,"
302 << " downgrade to normal level!";
303 }
304 } else {
305 if (evaluator->Evaluate(obstacle, obstacles_container)) {
306 break;
307 } else {
308 AERROR << "Obstacle: " << obstacle->id()
309 << " caution evaluator failed, downgrade to normal level!";
310 }
311 }
312 }
313
314 // if obstacle is not caution or caution_evaluator run failed
315 if (obstacle->HasJunctionFeatureWithExits() &&
316 !obstacle->IsCloseToJunctionExit()) {
317 evaluator = GetEvaluator(vehicle_in_junction_evaluator_);
318 } else if (obstacle->IsOnLane()) {
319 evaluator = GetEvaluator(vehicle_on_lane_evaluator_);
320 } else {
321 AINFO << "Obstacle: " << obstacle->id()
322 << " is neither on lane, nor in junction. Skip evaluating.";
323 break;
324 }
325 AINFO << "Normal Obstacle: " << obstacle->id() << " used " << evaluator->GetName();
326 CHECK_NOTNULL(evaluator);
327 if (evaluator->GetName() == "LANE_SCANNING_EVALUATOR") {
328 evaluator->Evaluate(obstacle, obstacles_container, dynamic_env);
329 } else {
330 evaluator->Evaluate(obstacle, obstacles_container);
331 }
332 break;
333 }
335 if (obstacle->IsOnLane()) {
336 evaluator = GetEvaluator(cyclist_on_lane_evaluator_);
337 CHECK_NOTNULL(evaluator);
338 evaluator->Evaluate(obstacle, obstacles_container);
339 }
340 break;
341 }
343 if (FLAGS_prediction_offline_mode ==
345 (!FLAGS_enable_multi_agent_pedestrian_evaluator &&
346 obstacle->latest_feature().priority().priority() ==
348 evaluator = GetEvaluator(pedestrian_evaluator_);
349 CHECK_NOTNULL(evaluator);
350 auto start_time_inference = std::chrono::system_clock::now();
351 evaluator->Evaluate(obstacle, obstacles_container);
352 auto end_time_inference = std::chrono::system_clock::now();
353 std::chrono::duration<double> time_cost_lstm =
354 end_time_inference - start_time_inference;
355 AINFO << "semantic lstm evaluator used time: "
356 << time_cost_lstm.count() * 1000 << " ms.";
357 break;
358 }
359 }
360 default: {
361 if (obstacle->IsOnLane()) {
362 evaluator = GetEvaluator(default_on_lane_evaluator_);
363 CHECK_NOTNULL(evaluator);
364 evaluator->Evaluate(obstacle, obstacles_container);
365 }
366 break;
367 }
368 }
369}
#define AERROR
Definition log.h:44

◆ EvaluateObstacle() [2/2]

void apollo::prediction::EvaluatorManager::EvaluateObstacle ( Obstacle obstacle,
ObstaclesContainer obstacles_container 
)

在文件 evaluator_manager.cc410 行定义.

411 {
412 std::vector<Obstacle*> dummy_dynamic_env;
413 ADCTrajectoryContainer* adc_trajectory_container = nullptr;
414 EvaluateObstacle(adc_trajectory_container, obstacle,
415 obstacles_container, dummy_dynamic_env);
416}
void EvaluateObstacle(const ADCTrajectoryContainer *adc_trajectory_container, Obstacle *obstacle, ObstaclesContainer *obstacles_container, std::vector< Obstacle * > dynamic_env)

◆ GetEvaluator()

Evaluator * apollo::prediction::EvaluatorManager::GetEvaluator ( const ObstacleConf::EvaluatorType type)

Get evaluator

返回
Pointer to the evaluator

在文件 evaluator_manager.cc204 行定义.

205 {
206 auto it = evaluators_.find(type);
207 return it != evaluators_.end() ? it->second.get() : nullptr;
208}

◆ Init()

void apollo::prediction::EvaluatorManager::Init ( const PredictionConf config)

Initializer

参数
Predictionconfig

在文件 evaluator_manager.cc122 行定义.

122 {
123 if (FLAGS_enable_semantic_map) {
124 semantic_map_.reset(new SemanticMap());
125 semantic_map_->Init();
126 AINFO << "Init SemanticMap instance.";
127 } else {
128 AINFO << "SemanticMap is not enabled.";
129 }
130
131 RegisterEvaluators();
132
133 for (const auto& obstacle_conf : config.obstacle_conf()) {
134 if (!obstacle_conf.has_obstacle_type()) {
135 AERROR << "Obstacle config [" << obstacle_conf.ShortDebugString()
136 << "] has not defined obstacle type.";
137 continue;
138 }
139
140 if (!obstacle_conf.has_evaluator_type()) {
141 ADEBUG << "Obstacle config [" << obstacle_conf.ShortDebugString()
142 << "] has not defined evaluator type.";
143 continue;
144 }
145
146 if (obstacle_conf.has_obstacle_status()) {
147 switch (obstacle_conf.obstacle_type()) {
149 if (obstacle_conf.obstacle_status() == ObstacleConf::ON_LANE) {
150 if (obstacle_conf.priority_type() == ObstaclePriority::CAUTION) {
151 vehicle_on_lane_caution_evaluator_ =
152 obstacle_conf.evaluator_type();
153 } else {
154 vehicle_on_lane_evaluator_ = obstacle_conf.evaluator_type();
155 }
156 }
157 if (obstacle_conf.obstacle_status() == ObstacleConf::IN_JUNCTION) {
158 if (obstacle_conf.priority_type() == ObstaclePriority::CAUTION) {
159 vehicle_in_junction_caution_evaluator_ =
160 obstacle_conf.evaluator_type();
161 } else {
162 vehicle_in_junction_evaluator_ = obstacle_conf.evaluator_type();
163 }
164 }
165 break;
166 }
168 if (obstacle_conf.obstacle_status() == ObstacleConf::ON_LANE) {
169 cyclist_on_lane_evaluator_ = obstacle_conf.evaluator_type();
170 }
171 break;
172 }
174 if (FLAGS_prediction_offline_mode ==
176 obstacle_conf.priority_type() == ObstaclePriority::CAUTION) {
177 pedestrian_evaluator_ = obstacle_conf.evaluator_type();
178 break;
179 }
180 }
182 if (obstacle_conf.obstacle_status() == ObstacleConf::ON_LANE) {
183 default_on_lane_evaluator_ = obstacle_conf.evaluator_type();
184 }
185 break;
186 }
187 default: {
188 break;
189 }
190 }
191 } else if (obstacle_conf.has_interactive_tag()) {
192 interaction_evaluator_ = obstacle_conf.evaluator_type();
193 }
194 }
195
196 AINFO << "Defined vehicle on lane obstacle evaluator ["
197 << vehicle_on_lane_evaluator_ << "]";
198 AINFO << "Defined cyclist on lane obstacle evaluator ["
199 << cyclist_on_lane_evaluator_ << "]";
200 AINFO << "Defined default on lane obstacle evaluator ["
201 << default_on_lane_evaluator_ << "]";
202}
#define ADEBUG
Definition log.h:41

◆ Run()

void apollo::prediction::EvaluatorManager::Run ( const ADCTrajectoryContainer adc_trajectory_container,
ObstaclesContainer obstacles_container 
)

Run evaluators

在文件 evaluator_manager.cc210 行定义.

212 {
213 if (FLAGS_enable_semantic_map ||
214 FLAGS_prediction_offline_mode == PredictionConstants::kDumpFrameEnv) {
215 size_t max_num_frame = 10;
216 if (FLAGS_prediction_offline_mode == PredictionConstants::kDumpFrameEnv) {
217 max_num_frame = 20;
218 }
219 BuildObstacleIdHistoryMap(obstacles_container, max_num_frame);
220 DumpCurrentFrameEnv(obstacles_container);
221 if (FLAGS_prediction_offline_mode == PredictionConstants::kDumpFrameEnv) {
222 return;
223 }
224 semantic_map_->RunCurrFrame(obstacle_id_history_map_);
225 }
226
227 std::vector<Obstacle*> dynamic_env;
228
229 if (FLAGS_enable_multi_agent_pedestrian_evaluator ||
230 FLAGS_enable_multi_agent_vehicle_evaluator) {
231 auto start_time_multi = std::chrono::system_clock::now();
232 EvaluateMultiObstacle(adc_trajectory_container, obstacles_container);
233 auto end_time_multi = std::chrono::system_clock::now();
234 std::chrono::duration<double> time_cost_multi =
235 end_time_multi - start_time_multi;
236 AINFO << "multi agents evaluator used time: "
237 << time_cost_multi.count() * 1000 << " ms.";
238 }
239
240 if (FLAGS_enable_multi_thread) {
241 IdObstacleListMap id_obstacle_map;
242 GroupObstaclesByObstacleIds(obstacles_container, &id_obstacle_map);
244 id_obstacle_map.begin(), id_obstacle_map.end(),
245 [&](IdObstacleListMap::iterator::value_type& obstacles_iter) {
246 for (auto obstacle_ptr : obstacles_iter.second) {
247 EvaluateObstacle(adc_trajectory_container, obstacle_ptr,
248 obstacles_container, dynamic_env);
249 }
250 });
251 } else {
252 for (int id : obstacles_container->curr_frame_considered_obstacle_ids()) {
253 Obstacle* obstacle = obstacles_container->GetObstacle(id);
254
255 if (obstacle == nullptr) {
256 continue;
257 }
258 if (obstacle->IsStill()) {
259 ADEBUG << "Ignore still obstacle [" << id << "] in evaluator_manager";
260 continue;
261 }
262
263 EvaluateObstacle(adc_trajectory_container, obstacle,
264 obstacles_container, dynamic_env);
265 }
266 }
267}
void EvaluateMultiObstacle(const ADCTrajectoryContainer *adc_trajectory_container, ObstaclesContainer *obstacles_container)
static void ForEach(InputIter begin, InputIter end, F f)
std::unordered_map< int, std::list< Obstacle * > > IdObstacleListMap

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