当前位置:   article > 正文

Apollo源码分析:路径规划 (v5.5)_apollo valet parking代码

apollo valet parking代码

Apollo开源代码链接:https://github.com/ApolloAuto/apollo

本文主要讲解Apollo/modules/planning中的路径规划的架构和算法。

第一章    架构设计与实现

一、架构设计与实现

 

引自:https://github.com/ApolloAuto/apollo/blob/master/modules/planning/README_cn.md

 

Apollo FSM(finite state machine):一个有限状态机,与高清地图确定车辆状态给定其位置和路线。

----------------------------------------------------------------------------------------------------------------------------------------

Planning模块整体框架:

1. 可执行程序层: Planning Dispatcher根据车辆的状态和其他相关信息,调用合适的Planner。Planner实现获取所需的上下文数据和其他信息,确定相应的车辆意图,执行该意图所需的规划任务并生成规划轨迹。它还将更新未来作业的上下文。根据工作模式不同将规划任务分成不同的Planner模式(LatticePlanner\NaviPlanner\PublicRoadPlanner\RTKReplayPlanner)。

2.app层:每种Planner分成多个场景Scenario(BareIntersectionUnprotectedScenario、EmergencyPullOverScenario、EmergencyStopScenario、LaneFollowScenario、TestLearningModelScenario、NarrowStreetUTurnScenario、PullOverScenario、ValetParkingScenario、ParkAndGoScenario、StopSignUnprotectedScenario、TrafficLightProtectedScenario、TrafficLightUnprotectedLeftTurnScenario、TrafficLightUnprotectedRightTurnScenario、YieldSignScenario)-》每个场景又分解成多个Stage(例如ValetParkingScenario包含StageApproachingParkingSpot和StageParking两个Stage)

3.lib层:每个Stage又分解成可执行的Task(包括不同的Deciders & Optimizers库),Task是Deciders & Optimizers :一组实现决策任务和各种优化的无状态库。优化器特别优化车辆的轨迹和速度。决策者是基于规则的分类决策者,他们建议何时换车道、何时停车、何时爬行(慢速行进)或爬行何时完成。

-------------------------------------------------------------------------------------------------------------------------------------------

Planning Context: 作业的上下文。

这种 可执行程序层-》app层 -》lib层 的三层分级架构实质与视觉感知模块类似。

本文路径规划模块架构与视觉感知模块架构https://blog.csdn.net/Cxiazaiyu/article/details/106256330 区别:

 

视觉感知模块中更像是自下而上地设计出这种三层结构的,因此,我们也自下而上地讲解了这个结构;

路径规划模块更像是自上而下设计出这种架构的,因此,我们也自上而下地讲解这个结构。

 

视觉感知模块命名更直白。

路径规划模块把接口分散放入各个层的模块中了,没有集中放在一个文件夹。

 

 1. 可执行程序层--planning/planner

定义抽象基类PlannerDispatcher,包含了Planner类型的数据成员;

  1. class PlannerDispatcher {
  2. public:
  3. virtual std::unique_ptr<Planner> DispatchPlanner() = 0;
  4. protected:
  5. common::util::Factory<PlannerType, Planner> planner_factory_;
  6. };

NaviPlannerDispatcher和OnLanePlannerDispatcher继承自PlannerDispatcher,覆盖了抽象基类中的virtual std::unique_ptr<Planner> DispatchPlanner()方法,实现通过工厂模式创建配置文件中指定的Planner对象。

以 NaviPlannerDispatcher为例:

  1. std::unique_ptr<Planner> NaviPlannerDispatcher::DispatchPlanner() {
  2. PlanningConfig planning_config;
  3. if (!apollo::cyber::common::GetProtoFromFile(FLAGS_planning_config_file,
  4. &planning_config)) {
  5. return nullptr;
  6. }
  7. auto planner_type = PlannerType::NAVI;
  8. if (planning_config.has_navigation_planning_config()) {
  9. planner_type = planning_config.navigation_planning_config().planner_type(0);
  10. }
  11. return planner_factory_.CreateObject(planner_type);
  12. }

Planner为定义的基类接口,Planner中包含了scenario

  1. class Planner {
  2. protected:
  3. scenario::ScenarioManager scenario_manager_;
  4. scenario::Scenario* scenario_ = nullptr;
  5. };

   PlannerWithReferenceLine继承自 Planner,做了一层抽象:

class PlannerWithReferenceLine : public Planner {};

根据不同的工作模式定义了4种Planner:

  1. class LatticePlanner : public PlannerWithReferenceLine {};
  2. /**
  3. * @class NaviPlanner
  4. * @brief NaviPlanner is a planner based on real-time relative maps. It uses the
  5. * vehicle's FLU (Front-Left-Up) coordinate system to accomplish tasks such as
  6. * cruising, following, overtaking, nudging, changing lanes and st
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/899781
推荐阅读
相关标签
  

闽ICP备14008679号