其他分享
首页 > 其他分享> > Apollo自动驾驶虚拟仿真赛笔记[5]-dreamview操作技巧及planning目录分析(未完待续)

Apollo自动驾驶虚拟仿真赛笔记[5]-dreamview操作技巧及planning目录分析(未完待续)

作者:互联网

dreamview操作技巧及planning目录分析

dreamview操作技巧

route editing在地图上右键拖动可以拖动地图

route editng中滚轮可以放大缩小地图

/data/core中的文件貌似是垃圾文件

watch -n 1 nvidia-smi可以查看GPU使用情况

apollo_map场景标注

image

场景注册

场景管理类"scenario_manager.cc"实现了场景注册、创建、初始化和更新场景的功能。

bool ScenarioManager::Init(const PlanningConfig& planning_config) {
  // 注册场景
  RegisterScenarios();
  default_scenario_type_ = ScenarioConfig::LANE_FOLLOW;
  // 创建场景,默认为lane_follow
  current_scenario_ = CreateScenario(default_scenario_type_);
  return true;
}
 
// 更新场景
void ScenarioManager::Update(const common::TrajectoryPoint& ego_point,    const Frame& frame) {
  ACHECK(!frame.reference_line_info().empty());
  // 保留当前帧
  Observe(frame);
  // 场景分发
  ScenarioDispatch(frame);
}
 
// 场景分发
void ScenarioManager::ScenarioDispatch(const Frame& frame) {
  ...
  ScenarioConfig::ScenarioType scenario_type;
  ...
  if (...) {
    scenario_type = ScenarioDispatchLearning();
  } else {
	// 每次切换场景都是从默认场景(LANE_FOLLOW)开始,即每次场景切换之后都会回到默认场景
    scenario_type = ScenarioDispatchNonLearning(frame);
  }
  ...
  // update PlanningContext
  UpdatePlanningContext(frame, scenario_type);
  if (current_scenario_->scenario_type() != scenario_type) {
  // 创建场景,此处的场景已经为具体场景,如ValetParkingScenario
    current_scenario_ = CreateScenario(scenario_type);
  }
}
 
// 创建场景
std::unique_ptr<Scenario> ScenarioManager::CreateScenario(
    ScenarioConfig::ScenarioType scenario_type) {
  std::unique_ptr<Scenario> ptr;
// 根据type创建场景,以valet_parking场景为例
  switch (scenario_type) {
    ...
case ScenarioConfig::VALET_PARKING:
      ptr.reset(new scenario::valet_parking::ValetParkingScenario(
          config_map_[scenario_type], &scenario_context_, injector_));
      break;
    ...
    default:
      return nullptr;
  }
 
  if (ptr != nullptr) {
   // 具体场景初始化
    ptr->Init();
  }
  return ptr;
}

此外需要注意,在RegisterStages时,Stage在构造函数中完成Task的创建:

Stage::Stage(const ScenarioConfig::StageConfig& config,
             const std::shared_ptr<DependencyInjector>& injector)
    : config_(config), injector_(injector) {
  ...
  name_ = ScenarioConfig::StageType_Name(config_.stage_type());
  next_stage_ = config_.stage_type();
  std::unordered_map<TaskConfig::TaskType, const TaskConfig*, std::hash<int>> config_map;
  for (const auto& task_config : config_.task_config()) {
    config_map[task_config.task_type()] = &task_config;
  }
  for (int i = 0; i < config_.task_type_size(); ++i) {
    auto task_type = config_.task_type(i);
    ...
    auto iter = tasks_.find(task_type);
    if (iter == tasks_.end()) {
	// 创建Task
      auto ptr = TaskFactory::CreateTask(*config_map[task_type], injector_);
      task_list_.push_back(ptr.get());
      tasks_[task_type] = std::move(ptr);
    } else {
      task_list_.push_back(iter->second.get());
    }
  }
}

[https://blog.csdn.net/whuzhang16/article/details/122544972]

modules/planning目录分析

逻辑层次为"场景-阶段-任务"

modules/planning/conf主要是各个参数文件

modules/planning/conf/scenario 主要是场景的参数文件(名称大致与下面对应)

modules/planning/scenarios目录结构

├── bare_intersection
├── common
├── dead_end
├── emergency
├── lane_follow // 车道线保持
├── narrow_street_u_turn // 狭窄掉头
├── learning_model
├── park // 泊车
├── park_and_go
├── stop_sign // 停止
├── traffic_light // 红绿灯
├── util
├── yield_sign
├── BUILD
├── scenario.cc
├── scenario.h
├── scenario_manager.cc
├── scenario_manager.h
├── stage.cc
├── stage.h

调用传感器数据

用protobuf协议获取/apollo/modules/canbus/proto的文件可以获取车辆底盘信息

/apollo/modules/perception/proto的文件可以获取视觉、雷达传感器数据

标签:dreamview,scenario,config,场景,task,未完待续,planning,type,ptr
来源: https://www.cnblogs.com/qsbye/p/16341145.html