Apollo规划模块学习(一)

Apollo开发-apollo介绍之Routing模块(六) Routing类似于现在开车时用到的导航模块,通常考虑的是起点到终点的最优路径(通常是最短路径),Routing考虑的是起点到终点的最短路径,而Planning则是行驶过程中,当前一小段时间如何行驶,需要考虑当前路况,是否有障碍物。Routing模块则不需要考虑这些信息,只需要做一个长期的规划路径即可,过程如下:这也和我们开车类似,上车之后,首先搜索目的地,打开导航(Routing所做的事情),而开始驾车之后,则会根据当前路况,行人车辆信息来适当调整直到到达目的地(Planning所做的事情)。 阅读详情
AI摘要

本文详细解读了Apollo自动驾驶规划模块,涉及规划的主要功能(路由寻径、行为决策和轨迹规划)、算法概要(Lattice-Planner和EMPlanner)、工程框架及其实现细节。重点介绍了Frenet坐标系在轨迹规划中的应用和路径-速度解耦方法。

Apollo规划模块学习



一、规划的作用

规划:在遵循道路交通规则的前提下,将自动驾驶车辆从当前位置导航到目的地。

1.1 规划的主要功能

1、路由寻径(Routing):负责在宏观路网中形成衔接起点、终点的概略行车路线。
2、行为决策:在微观层面确定车辆当前需采取的行驶方式,包括直行,轻微绕行、换道绕行、减速让行、加速抢行、停车以及跟车。
3、轨迹规划:在微观层面生成符合行为决策结果的时空连续轨迹。
在这里插入图片描述

1.1.1 路由寻径

目的:在地图上搜索出最优的全局路径
输入:高精地图拓扑信息;起点和终点的位置
输出:从起点到终点的路由线路

路由寻径的地图格式:Topo Graph = 节点 + 边缘
节点表示实际的道路路段;边缘表示路段之间的连接线,可赋予不同的代价值

路径搜索算法:A*算法

Apollo的Routing过程:
在这里插入图片描述

1.1.2 行为决策

目的:
保障无人车的行车安全并遵守交通规则;
为路径和速度的平滑优化提供限制信息

输入:
Routing信息;
道路结构信息(如:当前车道、相邻车道、汇入车道、路口等);
交通信号和标识(如:红绿灯、人行横道、停车标志等);
障碍物信息(障碍物类型、大小、位置、速度、未来的可能运动轨迹)

输出:
路径信息(路径长度、左右限制边界);
速度限制和边界;
时间上的位置限制边界

行为决策模型:
在这里插入图片描述
Apollo中的行为决策采用有限状态机模型

行为决策的主要决策类型:
在这里插入图片描述

1.1.3 轨迹规划

目的:
在合理的时间到达规划的目标或终点;
避免与障碍物碰撞;
更好的乘坐体验

输入:
决策输出信息;
道路结构信息;
交通信号和标识;
障碍物信息

输出:
稳定平滑的轨迹点(包含点的位姿、时间信息)

轨迹组成:由一系列位置点和到达点对应的时间戳组成 (x,y,t)

轨迹评估指标:无碰撞、舒适性、可执行

轨迹评估成本函数:轨迹的成本有各种处罚规则组成,如偏离道路中心、有可能发生碰撞、加速度或曲率水平

二、Apollo规划模块解析

Apollo系统整体模块框架
在这里插入图片描述

2.1 planning模块代码结构

planning模块在modules/planning目录下,planning组件的入口在planning_component.cc文件中,其中Init()是组件的初始化函数,Proc是运行函数。
在这里插入图片描述
模块的输入数据通过Reader获取,Reader在Init()函数中初始化;组件的输出通过Writer发送,Writer在Init()函数中创建和初始化。
Proc函数的输入包括障碍物预测数据、车辆状态和定位数据;planning_base -> RunOnce函数是规划执行的主体函数。
在这里插入图片描述

2.2 工程框架

规划模式:
NaviPlanning:主要用于高速公路的导航规划;
OnLanePlanning:用于城市及高速公路等各种复杂车道;
OpenSpacePlanning:用于没有车道线的场景在,主要在自主泊车和狭窄路段的掉头时使用
在这里插入图片描述
Apollo规划模块以场景调度为基本决策框架,其本质上是 一个双层状态机,主要有三个重要元素Scenario、Stage、Task。
在这里插入图片描述

2.2.1 场景配置

场景配置的目录在planning/conf/scenario中,Apollo提供了10多个场景,如lane_follow(根据参考线行驶)、pull_over(靠边停车)、valet_parking(泊车)等。
在这里插入图片描述

2.2.2 场景注册

场景注册在ScenarioManager中进行,注册函数是RegisterScenarios,对之前场景配置文件进行读取和注册,默认运行场景为lane_follow。
在这里插入图片描述

2.2.3 场景转换

场景转换在ScenarioManager::Update中实现,函数输入为:车辆当前状态信息(ego_point)、planning循环计算需要得相关信息(frame)。
是否需要场景转化通过Overlap判断,Apollo中Overlap指地图上任意重合的东西,如PNC_JUNCTION指道路之间有相互重合、SIGNAL指信号等与道路有重合、STOP_SIGN指停止标志与道路有重合。
通过ScenarioDispatch函数对场景进行转化和处理。
在这里插入图片描述

2.2.4 Scenario 场景

Scenario是planning模块中最上层的元素,一个Scenario包含多个Stage,一个Stage包含多个Task;执行一个Scenario就是按顺序执行不同Stage的不同Task。
在这里插入图片描述
Scenario的配置在planning/conf/scenario文件夹中,下图为pull_over场景的配置文件。
在这里插入图片描述
场景执行在Scenario::Process函数中进行,lane_follow场景的执行流程如下图左侧所示,图右侧为Scenario::Process函数的具体处理逻辑和流程。
在这里插入图片描述

2.2.5 Stage 步骤

步骤执行在Stage::Process函数中进行,下图为LaneFollowStage::Process函数的具体结构。
在这里插入图片描述

2.2.5 Task 任务

Task在planning/tasks文件夹中,task包含deciders、optimizers、learning_model三类;
在task.h文件中,Execute函数会被Stage中的ExecuteTaskOnReferenceLine调用,以执行Task的具体逻辑;
在这里插入图片描述
下图右侧为Task子类之间的继承关系,其中SpeedDecider、PathDecider、RssDecider三个子类直接继承自Task,优化器包含PathOptimizer、SpeedOptimizer、TrajectoryOptimizer。
在这里插入图片描述

三、Apollo规划算法概要

Apollo规划算法的版本迭代变化情况:
在EMPlanner变为PublicRoad Planner的改动中,主要是取消了SL和ST的迭代机制。
在这里插入图片描述

3.1 规划的基本概念

Frenet坐标系
在车辆的轨迹规划中,笛卡尔坐标系无法直接获取车辆与道路之间的关系,Frenet坐标系中纵轴S表示沿道路行驶的距离,横轴L表示车辆偏离道路中心线的距离,可直接描述车与道路的位置关系。
在这里插入图片描述
路径-速度规划解耦
在Frenet坐标系的基础上,对轨迹规划进行解耦,分为路径规划和速度规划两部分。
路径规划中生成候选曲线,即车辆的可行驶曲线,然后使用成本函数评估每条曲线,选择成本最低的路径。
速度规划在路径规划选择的路径上,考虑与障碍物的时空交集,做出跟车、停车、超车等速度决策,并使用优化算法对决策后的速度进行平滑,最终得到一条最优的速度曲线。
通过将路径和速度曲线结合,构建车辆的行驶轨迹。
在这里插入图片描述

3.2 轨迹规划的主要流程

路径规划
1、首先对输入的中心线采集点进行平滑,得到一条方向和曲率都连续的参考线;
2、将道路分割成单元格,对单元格中的点随机采样,连接单元格中的点,得到候选路径;
3、计算候选路径的成本,主要考虑偏离参考线、碰撞、速度限制和舒适度等要求;
4、选择成本最低的路径。
在这里插入图片描述

速度规划
1、速度规划采用S-T图,横坐标是时间T,纵坐标是距离S,并将S-T图网格化;道路的障碍物绘制为特定时间段内阻挡道路某些部分的矩形;
2、规划出无碰撞的速度曲线;
3、采用优化引擎算法选择成本最低的速度曲线;
4、对速度曲线进行平滑处理;
在这里插入图片描述

3.3 Lattice-Planner

Lattice-Planner是一种局部轨迹规划器,输出一条光滑无碰撞,并且满足车辆动力学约束的轨迹。
规划流程:
1、采样足够多的轨迹,以便提供尽量多的选择;
2、计算每一条轨迹的成本,考虑轨迹的可行性、安全性等因素;
3、循环检测:选择成本最低的轨迹,对其速度物理限制和碰撞进行检测,判断是否满足要求,若满足要求则退出循环;
4、选择最优的车辆轨迹
在这里插入图片描述
Lattice-Planner采样过程:
1、在Frenet坐标系下纵向采样,即纵向距离 s 关于时间 t 的采样;然后进行横向采样,即横向距离 l 关于纵向距离 s 的采样;
2、用多项式对其分别进行拟合,得到Frenet三维轨迹,表示为 s, l, t 的多项式函数;
3、Frenet三维轨迹结合参考线信息,可得到笛卡尔坐标系下的运动轨迹 (x, y, t);
在这里插入图片描述
在横向采样中,Apollo设计了3个末状态横向偏移量,分别为 -0.5, 0, 0.5;4个纵向位移,分别为10, 20, 40, 80;用两层循环遍历各种组合,然后通过多项式拟合,获得一系列横向轨迹。
在这里插入图片描述
纵向采样考虑巡航、跟车/超车、停车三种状态。

巡航状态采用两层循环进行采样,外层循环将速度从0到速度上限值进行等间隔遍历,内层循环遍历到末状态速度的时间,从1s到8s的间隔均匀遍历;采用四次多项式拟合。
在停车状态中,给定停车点,末状态的速度和加速度为0;一层循环即可采样到停车点。
跟车/超车状态中,需对每个障碍物分别采样超车/跟车所对应的末状态,然后采用多项式拟合,获得一系列的纵向轨迹。

采样完成后,计算轨迹的成本,选择最优轨迹。轨迹成本考虑的因素有:速度限制、偏离道路中心线、碰撞、jerk、横向加速度、向心加速度。
在这里插入图片描述
在这里插入图片描述

3.4 EMPlanner

EMPlanner(Expectation Maximum Planner)为最大期望算法,其分两个步骤交替进行:第一步计算期望值E,利用对隐藏变量的现有估计值,计算其最大似然估计值;第二步是最大化M,为了最大化在E步骤上求得的似然值来计算参数的值;M步上找到的参数估计值被用于下一个E步骤计算中,以此循环迭代。
Apollo的EMPlanner分别对路径和速度进行迭代优化,E步骤将当前障碍物投影,计算车辆轨迹与障碍物之间的关系;M步依次采用动态规划(DP)、二次规划(QP)进行粗略求解、精细求解(平滑)。
在这里插入图片描述

3.4.1 路径规划

E-Step:
基于曲率导数连续的光滑参考线,将障碍物在SL空间投影;给定一个时刻,如果自车与预测的障碍物轨迹有重叠区域,此区域被标注为与动态障碍物的估计交互区域。
在这里插入图片描述
M-Step:
求解Frenet坐标系下的最优路径规划,即在一个非凸的区间,找到一个最有的L关于S的方程。主要包括基于DP的路径决策和基于样条的路径规划两。
基于DP的路径决策提供一条粗略的路径信息,包含可行通道和绕障决策;根据DP产生的路径,采用基于QP的样条曲线产生光滑的路径。
在这里插入图片描述

3.4.2 速度规划

E-Step:
对障碍物进行ST投影
在这里插入图片描述
M-Step:
采用DP配合样条曲线计算光滑的速度规划,DP动态搜索的结果包括速度规划、可通行通道和障碍物速度决策,QP基于DP的速度规划曲线进行平滑处理。
在这里插入图片描述

3.5 算法对比

在这里插入图片描述


参考文献

1、Apollo自动驾驶技术详解25讲

Apollo 轨迹规划算法解析 这篇文章主要整理一下前段时间学习的轨迹规划算法,关于轨迹规划问题可以查到的相关资料很多,但能把轨迹规划问题详细说清楚的并不太多,这导致我在学习过程中出现很多疑惑。这里我把Apollo的各个版本轨迹规划算法进行简单总结和汇总。 阅读详情

相关推荐

Apollo Planning模块源代码分析

严正声明:本文系作者davidhopper原创,未经允许,严禁转载! 阿波罗项目(https://github.com/ApolloAuto/apollo)规划(Planning)模块位于命名空间:apollo::planning,其作用在于构建无人车从起点到终的局部行驶路径,具体而言,就是给定导航地图、导航路径、当前定位点、车辆状态(包括:位置、速度、加速度、底盘)、 周边目标的感知及预测信息...

davidhopper的博客 3万+

【Apollo学习笔记】—— Routing模块

Apollo的routing模块读取高精地图原始信息,用于根据输入信息在中选取匹配最近的点作为导航轨迹的起点和终点,读取依据生成的作为生成的,然后通过Astar算法在拓扑图中搜索连接起始点的最优路径,作为输出发送出去。在地图上寻求两点之间的最短距离之时,我们可以把道路交叉口(junction)作为节点(Node),将道路长度作为边(Edge),通过最短路径搜索算法(Astar/BFS/DFS…),求得两点之间的最短路径,并进行输出。一般情况下,我们所获得的地图格式并非是适用于搜索最短路径的拓扑格式,所以需要

sinat_52032317的博客 4461

Apollo星火计划学习笔记——Apollo速度规划算法原理与实践

Apollo中对路径规划解耦,分为路径规划与速度规划两部分。并将规划分为决策与优化两个部分。•路径规划—— 静态环境(道路,静止/低速障碍物)•速度规划—— 动态环境(中/高速障碍物)## 1.1 速度规划的坐标系速度规划的坐标系注意:速度规划的sss沿着轨迹的方向,路径规划的sss沿着参考线的方向。目标函数与二次规划的目标函数差不多,增加了横向加速度的代价值以及松弛变量wsoftslowerwsoft​slower​与wsof。

sinat_52032317的博客 1万+

Apollo:Routing模块

Routing模块正如其名称所示,其主要作用就是根据请求生成路由信息。地图数据请求,包括:开始和结束位置路由导航信息Routing模块的实现文件结构如下图所示:这里就是定义了5个常量并指定了它们的值,同时还包含了每个常量的描述。routing_conf_file:Routing模块配置文件的路径。routing_node_name:Routing模块的节点名称。min_length_for_lane_change:在变道前,在当前车道上行驶的最短距离。

OceanStar的博客 1676

【Apollo学习笔记】—— Planning模块

本文记录学习planning模块时的一些笔记,总体流程参照中的流程图,如上图所示。

sinat_52032317的博客 3145

Apollo规划模块基本原理学习笔记(1)

Apollo规划模块入门学习笔记1

weixin_39199083的博客 2671

百度Apollo5.0规划模块代码学习(一)RTK规划器

一 前言 关于百度Apollo中的规划模块,我也是第一次看。希望通过这个平台做好笔记。其中部分内容如果有误,希望看到的人可以给我留言。 规划模块的架构及介绍可以参考以下文章,写的非常好: https://www.cnblogs.com/liuzubing/p/11058612.html https://blog.youkuaiyun.com/shixiaolu63/article/details/865047...

wwyklnh的博客 5327

Apollo规划模块代码学习(2): 轨迹规划流程理论基础详解(lane follow场景为例)

本文以具体场景Lane follow为例梳理具体的轨迹规划算法流程。详细介绍轨迹规划重要基础:Frenet坐标系列、路径规划速度规划、轨迹平滑算法原理。

qq_41667348的博客 4287

【Apollo学习笔记】——规划模块TASK之PIECEWISE_JERK_NONLINEAR_SPEED_OPTIMIZER(一)

在Apollo星火计划学习笔记——Apollo路径规划算法原理与实践与【Apollo学习笔记】——Planning模块讲到……Stage::Process的函数会依次调用task_list中的TASK,本文将会继续以LaneFollow为例依次介绍其中的TASK部分究竟做了哪些工作。由于个人能力所限,文章可能有纰漏的地方,还请批评斧正。在配置文件中,我们可以看到LaneFollow所需要执行的所有task。 本文将继续介绍LaneFollow的第14个TASK——产生平滑速度规划曲线 根据ST图的可行驶区

sinat_52032317的博客 2112

Apollo9.0 PNC源码学习之Planning模块(一)—— 规划概览

本文主要讲解了Planning模块的主要流程,后面将对其源码进行解析

BigDavid123的博客 1006

Apollo9.0 PNC源码学习之Planning模块—— Lattice规划(一):笛卡尔和Frenet坐标系

本文详解了Lattice 笛卡尔和Frenet的相关知识点

BigDavid123的博客 1312

入门必看丨解析百度Apollo之决策规划模块

转自Apollo开发者社区 Apollo系统中的Planning模块实际上是整合了决策和规划两个功能,该模块是自动驾驶系统中最核心的模块之一(另外三个核心模块是:定位、感知和控制)。本章主要讲解自动驾驶系统中最核心的模块——决策规划模块。 下面是由社区开发者—强波提供的文章,对百度Apollo之决策规划模块进行详细讲解(Apollo 3.5之前版本),希望这篇文章能给感兴趣的开发者带来更多帮助。 01 Apollo系统与Planning 下图是Apollo系统的整体架构图。从这幅图中我们可以看出,整个系统可

weixin_43619346的博客 1万+

开发者说丨Apollo项目Routing模块A_算法剖析.pdf

开发者说丨Apollo项目Routing模块A_算法剖析.pdf

Apollo星火计划学习笔记——Apollo路径规划算法原理与实践

Apollo中对路径规划解耦,分为路径规划与速度规划两部分。并将规划分为决策与优化两个部分。•路径规划—— 静态环境(道路,静止/低速障碍物)•速度规划—— 动态环境(中/高速障碍物)路径规划的配置文件在中//路径规划 stage_type : LANE_FOLLOW_DEFAULT_STAGEtask_type : PIECEWISE_JERK_PATH_OPTIMIZER //速度规划 task_type : PATH_ASSESSMENT_DECIDER。

sinat_52032317的博客 1万+

MacOS下微信小程序源码提取与逆向实战:从找到.wxapkg到完整还原

本文详细介绍了在MacOS系统下进行微信小程序源码提取与逆向分析的完整实战流程。从定位沙盒机制中的.wxapkg缓存文件,到搭建Node.js环境与配置wxappUnpacker工具链,再到执行核心反编译命令并处理分包等复杂情况,提供了清晰的操作步骤。文章还汇总了Node版本、依赖缺失、文件乱码等常见问题的解决方案,旨在帮助开发者、安全研究人员高效完成小程序安全审计与学习。

weixin_29246195的博客 1598

【ros】ROS1的安装和相关使用方法

主要学习ros相关内容

Greary的博客 2376

百度Apollo决策规划模块相关资料汇总

1.解析百度Apollo自动驾驶平台 2.解析百度Apollo之Routing模块 3.解析百度Apollo之决策规划模块 4.解析百度Apollo之参考线与轨迹 5.Apollo Planning模块源代码分析 6.Apollo 3.5 Planning模块源代码分析 7.apollo介绍之planning模块 8.apollo planning 的软件架构 9.apollo p...

思我所 2750

keras tensorflow 的lstm的新冠疫情感染人数预测 附完整代码数据 可直接运行

keras tensorflow 的lstm的新冠疫情感染人数预测 附完整代码数据 可直接运行

847

《百度apollo》规划一

技术难点 规划模块所面临的技术难点有三点。 第一,车辆所处的环境复杂度高。因此传感器检测返回的数据复杂,障碍物个数种类多;路况信息复杂,在高速上一秒钟车辆能跑出30米,情况瞬息万变。 第二,系统对规划模块的要求高。规划模块需要覆盖所有的ADAS场景,对模块计算的实时性和稳定性有着很高的要求。 第三,这是一个全新的未知领域,能够从外界获得的信息有限。虽然有过去长期的积累,但是依然有多重难...

shixiaolu63的博客 4307

字节最新开源模型 DA3(Depth Anything 3)使用教程(一)从任意视角恢复视觉空间

本文介绍DepthAnything3(DA3)模型,一种能够从任意视觉输入中预测几何结构的创新解决方案。DA3采用Transformer骨干网络,通过统一的深度光线表示简化学习过程,支持单目/多视角深度估计、姿态估计和3D高斯预测等多项任务。模型系列包含基础版、度量级和单目专用版本,其中嵌套版本DA3NESTED-GIANT-LARGE表现最佳。代码库提供交互界面、CLI工具和多格式导出功能,支持模块化扩展。实验表明DA3在各项任务上超越现有模型,所有训练数据均来自公开学术数据集。

2506_90492529的博客 2548

Allegro 给元器件PCB封装库添加3D模型详细步骤

从上面视图可以看到模型跟PCB 库的方向是对了,但是位置偏下,且在PCB封装库后面,我们下面需要做的就是把模型往上移、往前移。首先将元器件3D模型文件放在封装库的目录下(也可以单独新建一个模型库文件夹),注意3D文件必须是Step格式。Transparent: 选择透视的对象,可以是模型、也可以是PCB封装,或者两种都透视。在左边搜索要添加的3D模型的文件(注意是在* 星号前面输入文件名),按回车即可找到。同样的,接下来需要往Y 负方向移,即左移,一边调整一边观察视图。

sinat_15677011的博客 3678

解析百度Apollo之决策规划模块

本文是Apollo项目系列文章中的一篇,会解析自动驾驶系统中最核心的模块 - 决策规划模块。 前言 Apollo系统中的Planning模块实际上是整合了决策和规划两个功能,该模块是自动驾驶系统中最核心的模块之一(另外三个核心模块是:定位,感知和控制)。 关于决策规划的理论值得我们研究好久。所以接下来会通过几篇文章来专门讲解Planning模块。 这些文章会以百度Apollo的Planni...

weixin_30544657的博客 4028

Python re库【正则表达式操作库】全面讲解及代码示例

以下是Pythonre库的全面讲解,包含主要功能、常用方法及代码示例。完整代码和注释附后。正则表达式(Regular Expression)是用于匹配、查找、替换字符串的工具,通过特定语法定义模式。?{n}[...][a-z]A|B\d[0-9]\D\s\S\w\Wre从字符串匹配模式,返回Match对象或None。在字符串中第一个匹配项,返回Match对象或None。返回所有匹配项的。返回所有匹配项的Match对象)。替换匹配项,返回新字符串。根据模式分割字符串,返回列表。通过。

记录点滴 1161

Apollo规划控制学习笔记

个人基于Apollo6.0的代码笔记的一些记录,仅仅个人的思考,欢迎一起学习探讨。以上是本人第一次对Apollo规划控制代码的一些浅浅理解。有以下说明:1.本人是小菜鸡(loser级别的),不是大神,是兴趣所趋。2.可以私聊,一起来学习,一起来完善上述内容。如何仅仅想看的话请移步以下地址下载:3.后期也会持续学习的!!!

qq_42027654的博客 4189

YOLO11涨点优化:注意力魔改 | 新颖的多尺度卷积注意力(MSCA),即插即用,助力小目标检测

多尺度卷积注意力(MSCA),有效地提取上下文信息,新颖度高,创新十足。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 6309

Windows配置L2TP/IPsec连接

Windows 系统的 L2TP/IPsec 功能,通过配置即可构建加密 VPN 通道。

m0_61806534的博客 1666
下一篇: 自动驾驶-控制算法(一)
Shoulderc
博客等级 码龄6年 124粉丝 6原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值