赞
踩
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 )区别:
视觉感知模块中更像是自下而上地设计出这种三层结构的,因此,我们也自下而上地讲解了这个结构;
路径规划模块更像是自上而下设计出这种架构的,因此,我们也自上而下地讲解这个结构。
视觉感知模块命名更直白。
路径规划模块把接口分散放入各个层的模块中了,没有集中放在一个文件夹。
定义抽象基类PlannerDispatcher,包含了Planner类型的数据成员;
- class PlannerDispatcher {
- public:
- virtual std::unique_ptr<Planner> DispatchPlanner() = 0;
- protected:
- common::util::Factory<PlannerType, Planner> planner_factory_;
- };
NaviPlannerDispatcher和OnLanePlannerDispatcher继承自PlannerDispatcher,覆盖了抽象基类中的virtual std::unique_ptr<Planner> DispatchPlanner()方法,实现通过工厂模式创建配置文件中指定的Planner对象。
以 NaviPlannerDispatcher为例:
- std::unique_ptr<Planner> NaviPlannerDispatcher::DispatchPlanner() {
- PlanningConfig planning_config;
- if (!apollo::cyber::common::GetProtoFromFile(FLAGS_planning_config_file,
- &planning_config)) {
- return nullptr;
- }
-
- auto planner_type = PlannerType::NAVI;
- if (planning_config.has_navigation_planning_config()) {
- planner_type = planning_config.navigation_planning_config().planner_type(0);
- }
- return planner_factory_.CreateObject(planner_type);
- }
Planner为定义的基类接口,Planner中包含了scenario。
- class Planner {
- protected:
- scenario::ScenarioManager scenario_manager_;
- scenario::Scenario* scenario_ = nullptr;
- };
PlannerWithReferenceLine继承自 Planner,做了一层抽象:
class PlannerWithReferenceLine : public Planner {};
根据不同的工作模式定义了4种Planner:
- class LatticePlanner : public PlannerWithReferenceLine {};
-
- /**
- * @class NaviPlanner
- * @brief NaviPlanner is a planner based on real-time relative maps. It uses the
- * vehicle's FLU (Front-Left-Up) coordinate system to accomplish tasks such as
- * cruising, following, overtaking, nudging, changing lanes and st
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。