planning深度剖析
planning深度剖析
- 结合find命令过滤目录及文件名后缀: find /home/hadoop/nisj/automationDemand/ -type f -name '*.py'|xargs grep -n 'data_chushou_pay_info'
- 配置文件在每个模块的common文件的*_gflags.cc文件下定义.
- lattice文件夹下面的代码应该是路网格子相关的代码
planner文件夹下的内容
- EM_Planner -- EMPlanner是一个期望最大的planner
- 在EMPlanner::Plan函数中主要做的事情:
- 更新planning start point
- scenario_初始化
- scenario_处理planning_start_point和frame
- 在EMPlanner::Plan函数中主要做的事情:
- refernce_line -- 参考线相关的函数接口都在这里面,
- cos_theta问题
- qp_spline平滑
- spiral problem平滑
- deciders -- 决策者
- tuning -- 调整
Apollo Planning简介
- 整体架构:
- Apollo的定位,行为预测,感知,导航,高精定位都是通过Apollo适配器接入Planning的。
- planning主要根据上面的信息转换为参考线提供器,数据处理与管理。
- 针对参考线做二维参数化的Spline平滑器。
- 然后接入任务管理器进行任务管理。
- 然后进入路径、速度综合器。
- 再进入最终结果验证器。
- 整合传统的决策与规划两个模块。
- 统一、灵活、快捷。
- 参考线与主算法分离。
- 平滑的参考线是决策规划的基础、数据驱动的要求,采用二维Spline和异步更新,
\[C(x,y)=C(f_{X}(t),f_{Y}(t))\]- Spline函数。
- 将三维问题转换为X-Y(路径规划(x,y))平面和S-T(速度规划(s,t))平面问题来处理。
- 数据设计:
- 模块配合复杂,需求主导:
- 行为预测(上游): proto中增加保护字段。
- 车辆控制(下游): 分离实际位置与规划位置。
- 障碍物属性复杂, 提取共性:
- S-L边界(boundary)。
- 阻塞S-T边界(boundary)。
- 横向、纵向决策。
- 自身结果复杂:
- 分而治之, 路径点、速度点、参考线点、trajectory点。
- 横向决策: 避让、绕行。
- 纵向决策: 停止、跟车、避让、超越。
- boundary有四个点构成((s0, l0), (s1, l1), (s2, l2), (s3, l3))。
- 模块配合复杂,需求主导:
- planning还需要考虑:
- 交通规则。
- 路径优化。
- 路径决策。
- 速度优化(DP)。
- 速度决策。
- 速度优化(QP)。
- 交通规则:
- 核心特点: 多。
- 容易适配、避免冲突、周期一致。
- 规则工厂,灵活配置不同规则。
- 规则库:
- 后方车辆;
- 人行横道;
- 探头右拐;
- 行驶终点;
- 借道绕行;
- Stop标志;
- 横向和纵向决策分离+决策融合;
- 有限状态机: drive --> wait --> side pass --> drive。
- 路径规划策略:
- RRT(rapidly exploring random tree): 随机取点, 路径不稳定,常用于机器人走迷宫。
- State-lattice:格点预先设定,灵活度差,没有考虑道路特点。
- Quadratic Programming(二次规划): 成本函数受限, 受地图中心线影响大, 此问题的解决不受规划模块控制。
- 最终的策略: 基于采样,结合车辆与道路信息,比state-lattice灵活性更强。
- 离散化求解空间。
- 使用平滑曲线连接各层的采样点。
- 计算各条路径的成本。
- 动态规划选择合适的道路。
- 道路采样的优势:
- 避免陷入局部最优;
- 概率完备避免无解;
- 低速到高速全覆盖;
- 道路点采样 --> 路径生成 <--> Cost计算 <--> 路劲选择 --> 最终路径。
- 碰撞+物理边界+虚拟边界+数值(安全值+舒适值):
- 层层比较得到一个最终比较数值大小
- 速度规划器 - 动态规划
- 与主车有重叠的障碍物映射到ST图中:
- 停车(stop);
- 避让(yield);
- 超越(overtake);
- 限速:ST路的限速区;
- 把问题转换为有限求解空间内的最优化问题。
- 构建网格;
- 构造成本函数;
- 安全性相关:与障碍区的间距;
- 体感相关:
- 主车速度、加速度;
- 主车速度变化率;
- 到达目的地相关:
- s轴相对位置。
- 动态规划选择成本最少的路径。
- 与主车有重叠的障碍物映射到ST图中:
解析EM-planning
- em_planner继承于PlannerWithReferenceLine, PlannerWithReferenceLine继承于Planner.
- Planner有三个成员变量: PlanningConfig, ScenarioManager, Scenario.
- PlanningConfig是定义在planning_config.proto中, 由planning_config.pb.txt文件配置。
- ScenarioManager是一个类,有Init, mutable_scenario, Update三个共有的成员函数和RegisterScenarios, DecideCurrentScenario两个私有的成员函数。
- common::util::Factory<ScenarioConfig::ScenarioType, Scenario>
scenario_factory_工厂成员变量。 - std::unique_ptr scenario_; 一个Scenario独享指针。
- common::util::Factory<ScenarioConfig::ScenarioType, Scenario>
- ScenarioManager是一个单例模式, 可以获得scenario的分析结果, 有两个私有的成员变量FeatureExtractor和ScenarioAnalyzer。
- FeatureExtractor是一个为场景分析提供专有特征的类
- 里面有一个ADCTrajectoryContainer私有类,PoseContainer类和一个ScenarioFeature类。
- ADCTrajectoryContainer是车辆轨迹的容器, 继承于Container, 里面有planning::ADCTrajectory(车的轨迹点), common::math::Polygon2d(二维的多边形, 用于连接(junction)), std::shared_ptr共享指针用于连接, 一个浮点的连接距离, std::unordered_set一个hashtable的集合用于车道线的indexes, 一个std::vector用于保存车道线的序号, 还有一个std::mutex互斥量用于保存轨迹点。
- 里面有一个ADCTrajectoryContainer私有类,PoseContainer类和一个ScenarioFeature类。
- FeatureExtractor是一个为场景分析提供专有特征的类
- Scenario类中主要有Init、Process和Transfer这三个接口函数。
- PlannerWithReferenceLine继承Planner的后抽象一个接口PlanOnReferenceLine, 主要有三个参数const common::TrajectoryPoint& planning_init_point, Frame* frame, ReferenceLineInfo* reference_line_info。
- Frame包含了做一次planning的一帧数据(Frame)。
- EM-planning中的实现代码其实很少, 就一个Init函数和一个Plan函数;
- 在Init函数中主要做的事情是获得PlanningConfig的配置参数, 和初始化场景管理器(scenario_ = scenario_factory_.CreateObject(ScenarioConfig::LANE_FOLLOW);) -- 其实就是创建一个LANE_FOLLOW的场景。
- Plan主要做的事情是scenario_manager更新Frame, 然后获得scenario, 再初始化这个scenario的一些参数, 最后从开始点处理scenario。
- ScenarioManager::Update中新建一个场景;
- DecideCurrentScenario函数中会根据TrajectoryPoint和Frame两个参数做Transfer(其实就是直接返回ScenarioConfig::LANE_FOLLOW)。
- mutable_scenario就是直接返回scenario的原始指针,因为是调用的scenario_.get();而scenario_是一个std::unique_ptr指针, 到最后只有一个指针指向Scenario对象。
- Scenario::Init是一个纯虚函数,就是一个接口, 最终会调用到LaneFollowScenario::Init这个函数;
- 会注册一些task, 包括DP的路径优化器,路径决策器,DP的速度优化器,速度决策器, QP的速度优化器,多项式的速度优化器。
- scenario_->Process(planning_start_point, frame);情景的处理
- 最后其实还是调用LaneFollowScenario::Process, 在Process中调用PlanOnReferenceLine;然后调用各个优化器的Execute函数。
- 在Process中最后通过SetDrivable函数把reference_line_info设置为可执行的。
- ScenarioManager::Update中新建一个场景;
边看边记之杂谈
- ::google::protobuf::Message& message都是利用容器Container或其派生类PoseContainer、ADCTrajectoryContainer等。
- LaneInfo类封装了一些车道相关的信息, 在hdmap_common.cc和hdmap_common.h中被定义和声明一些接口。
- 各种类的继承关系图。
一些专属的数据结构
- 什么是ADCTrajectory?
- ADCTrajectory的字面意思地自动驾驶车的轨迹, 在planning.proto中定义;
- 主要有总路径的长度(total_path_length), 单位是米meters;
- 总路径的时间(total_path_time), 单位是seconds;
- 重复的轨迹点TrajectoryPoint,TrajectoryPoint中主要包含的有(PathPoint,线性的速度v,线性的加速度a,相对时间relative_time(从轨迹的开始的相对时间))。
- TrajectoryPoint包含PathPoint和一些速度、加速度和时间相关的信息。
- PathPoint主要包含了一些坐标、曲率、path开始的距离、lane的id, x方向的导数和y方向的导数。
- 是否有紧急停车EStop;
- 路径点PathPoint(没有速度信息)。
- 是否重新规划is_replan;
- 具体的档位位置GearPosition;
- planning的决策结果DecisionResult,主要包含了主要决策(MainDecision)、目标决策(ObjectDecisions)和车辆信号(VehicleSignal);
- MainDecision主要包含: 当前的任务是那个(MainCruise, MainStop, MainEmergencyStop, MainChangeLane, MainMissionComplete, MainNotReady, MainParking)和重复的TargetLane;
- TargetLane主要包括了lane的id, 起点和终点限制的速度(speed_limit)。
- ObjectDecisions就是多个ObjectDecision, 每个ObjectDecision中包含了一个字符串的id, 感知目标的id和一个目标的决策类型ObjectDecisionType;
- ObjectDecisionType主要有几种类型: 忽略, 停止, 跟随, 避让, 超车, 绕行, 从旁边超过, avoid听让;
- MainDecision主要包含: 当前的任务是那个(MainCruise, MainStop, MainEmergencyStop, MainChangeLane, MainMissionComplete, MainNotReady, MainParking)和重复的TargetLane;
- LatencyStats(潜在的状态): 主要包括了总时间(total_time_ms), 任务的状态(task_stats)和初始frame的时间init_frame_time_ms;
- 其中task_stats主要包括了任务的名字和运行时间(time_ms);
- routing相关的航向角和debug的控制选项;
- ADCPathPoint(车辆路径的点) -- 主要包括x,y,z的三个坐标,曲率(curvature)和航向角(heading, 相对于绝对坐标系来说的)。
- ADCTrajectoryPoint(Deprecated: replaced by apollo.common.TrajectoryPoint), 里面主要是一个些坐标, 速度, 加速度, 曲率, 曲率的变化率, 相对时间, theta值, 从第一个点开始的距离, sl坐标系中的位置。
- 车辆的信号VehicleSignal, 主要包括(转向信号TurnSignal), 远光灯(high_beam), 近光灯(low_beam), 喇叭(horn)和应急灯(emergency_light)。
- 道路右边的状态;
- 沿车道中线参考线的lane ID;
- 根据当前的计划结果设置engage的建议; -- 这是一个遇到critical时才给予的运行时建议。
- 致命区域(CriticalRegion)。
- 轨迹的类型(TrajectoryType) -- 不知道是什么类型, 正常的类型, 路径反馈的类型, 速度反馈的类型;
- ADCTrajectory的字面意思地自动驾驶车的轨迹, 在planning.proto中定义;
- ScenarioFeature,是在scenario_feature.proto文件重定义的;
- 主要包括了速度,加速度,航向角, 当前lane的id, lane被走过的距离, 左边相邻的laneid和lanes, 右边相邻的laneid和lanes, 连接处的距离和id, 障碍物的id。
planning深度剖析的更多相关文章
- 《AngularJS深度剖析与最佳实践》简介
由于年末将至,前阵子一直忙于工作的事务,不得已暂停了微信订阅号的更新,我将会在后续的时间里尽快的继续为大家推送更多的博文.毕竟一个人的力量微薄,精力有限,希望大家能理解,仍然能一如既往的关注和支持sh ...
- ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程
从<ASP.NET Core管道深度剖析(1):采用管道处理HTTP请求>我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但 ...
- Objective-C类成员变量深度剖析
目录 Non Fragile ivars 为什么Non Fragile ivars很关键 如何寻址类成员变量 真正的“如何寻址类成员变量” Non Fragile ivars布局调整 为什么Objec ...
- 大众点评开源分布式监控平台 CAT 深度剖析
一.CAT介绍 CAT系统原型和理念来源于eBay的CAL的系统,CAT系统第一代设计者吴其敏在eBay工作长达十几年,对CAL系统有深刻的理解.CAT不仅增强了CAL系统核心模型,还添加了更丰富的报 ...
- 深度剖析WordPress主题结构(转)
利用强大的技术,可以把基于wordpress的网站做成各种各样的形式,这除了要求wordpress主题开发人员精通html,PHP,JS,CSS等技术,还需要开发者掌握WordPress主题的框架. ...
- LCD深度剖析
LCD 深度剖析 来源:http://blog.csdn.net/hardy_2009/article/details/6922900 http://blog.csdn.net/jaylondon/a ...
- WCF技术剖析之十九:深度剖析消息编码(Encoding)实现(下篇)
原文:WCF技术剖析之十九:深度剖析消息编码(Encoding)实现(下篇) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话 ...
- 大兴雷克萨斯深度剖析2013款LS460L_深圳大兴雷克萨斯_太平洋汽车网
大兴雷克萨斯深度剖析2013款LS460L_深圳大兴雷克萨斯_太平洋汽车网 大兴雷克萨斯深度剖析2013款LS460L
- Java反射机制剖析(四)-深度剖析动态代理原理及总结
动态代理类原理(示例代码参见java反射机制剖析(三)) a) 理解上面的动态代理示例流程 a) 理解上面的动态代理示例流程 b) 代理接口实现类源代码剖析 咱们一起来剖析一下代理实现类($Pr ...
随机推荐
- .NET技术-1.0.使用反射、特性简化代码(验证Model类)
使用反射.特性简化代码 参考项目:利用反射验证Model类/AssemblyVerification 假设现在有一个学生类(Student) /// <summary> /// 学生类 / ...
- [NIO-4]选择器
选择器 最后,我们探索一下选择器.由于选择器内容比较多,所以本篇先偏理论地讲一下,后一篇讲代码,文章也没有什么概括.总结的,写到哪儿算哪儿了,只求能将选择器写明白,并且将一些相对重要的内容加粗标红. ...
- JavaScript 从入门到放弃(二)模块化工具requirejs
入门教程: 1.JS模块化工具requirejs教程(一):初识requirejs 2.JS模块化工具requirejs教程(二):基本知识 描述 这几天在使用github最活跃的基于bootstra ...
- ArcGis 拓扑检查——缺顶点、悬挂检查代码 C#
看了些源码,效率挺垃圾的,折腾了一个垃圾得不太彻底的代码,还是慢. 不会折腾底层直接怼COM的悲伤…… 实现思路是这样的: 1.把面层的点都塞进List,去重,取坐标4位,后边的检查使用容差0.001 ...
- Visual Studio 2013 更新 NuGet 包管理器
Ø 前言 使用 Visual Studio 中的 NuGet 包管理器下载程序时,有时可能出现类似的错误:. 5. 在"联机"选项中搜索"NuGet",选 ...
- python 读 json 文件
一个汽车图标的训练集:train.json [{"items": [{"label_id": "0028", "bbox" ...
- Hbase思维导图之调优
- Vue.js 技术揭秘(学习) slot
slot特性分发父组件的内容 作用域插槽:通过子组件的一些数据来决定父组件实现插槽
- Linux中find命令的用法汇总
Linux中find命令的用法汇总 https://www.jb51.net/article/108198.htm
- python(六)列表推导式、字典推导式、集合推导式
转载 https://www.cnblogs.com/tkqasn/p/5977653.html