泊车辅助和自动泊车的功能有何差异?如何选择适合的转向方式?,

关于自动驾驶规划问题的理解和整理

在自动驾驶的定位、感知、预测、决策规划和控制等模块中,感知模块就像是人的眼睛和耳朵,负责对外部环境进行感知;控制模块就像人的双手和双脚,负责最终的加减速、转向等操作;而决策规划模块就像人的大脑,基于接收到的感知等信息进行行为决策和轨迹生成。

规划问题

先说规划问题的一般性或者传统意义上就是,求解一个物体在3维欧式空间中的运动轨迹的任务,这里的规划是指规划模块。计算机中的规划算法,一般是指对已知模型的某种搜索任务,如动态规划。而这个模型相对未知时,任务则退化成了强化学习。在自动驾驶规划中,由于缺乏z轴是不可控状态。所以,我们的规划自然而然就回归到了一个2维平面上的求解。

而一个规划模块的输入一般为当时车辆行驶中所处的环境,包括障碍物,车道线等外部观测信息,还有自车状态等自车的状态信息。有时为了保证决策连续性和模型平滑可控,我们一般还会保留一些上一帧规划的部分决策或者规划结果作为下一帧规划的参考。而规划模块的输出则很简单,就是车辆行驶的轨迹。

自动驾驶的分工中,规划控制通常叫做PNC模块。在很多工作场景下,PNC的规划和控制的分工都相对比较模糊。经过多种问题场景的理解磨合,最终我个人对规划和控制的分工划分就是:控制负责将被控对象尽量封装成一个可以稳定预测的被控对象;规划则根据控制给出的理想模型进行运动状态的设计。简单点说,雨雪打滑,路面坑洼导致的车辆运行跟不上规划状态,控制解决。也就是说,对规划来说车辆在控制模型中不存在不客观状态。如果要求在高一些,可以要求控制保证在某些工作区间内的线性关系等等对模型方程的要求。

路径与轨迹

有很多人开始的时候会在代码中见到不同的几种变量代表规划的输出,也会很疑惑,这里我来简单解释一下。一般我们有两种叫法,一种是路径(path),在不考虑时间维度下,车辆行驶过的或连续或离散的位姿的集合;另一种就是轨迹(trajectory),在路径的基础上又赋予了时间,获得了任意时刻下车辆的特定位姿的集合。所以简单的讲就是路径是不带有时间的,轨迹是在路径上赋予时间后的产物。

而轨迹和路径的出现就形成了第一个技术上的分水岭,横纵向是否解耦。


所以我们只要寻找到f(s)和g(s)就能够找到车辆运行的路径,找到s(t)就知道了车辆的速度。多好的一件事啊,但是这往往都是错的,因为s不是一个变量,s是一个函数,f(s)和g(s)两个映射也由原有的数空间和数空间之间的映射问题,变成了数空间和函数空间之间的映射问题,也就是泛函问题。所以简单的将两个问题解耦开求解是不能解决所有的规划场景,只能通过假设和解空间的约束限制来降低这样做带来的错误结果导致的异常。

那现在有什么真正耦合的方式直接求解运动轨迹的吗?没有,至少我目前不知道,有的耦合方式也都是通过一些手段先获得一条或横向或纵向的的先验,再去重新一起联立优化得到整条轨迹。或者直接离散空间采样的方式。还有知道的小伙伴可以评论区留言打脸。为啥没有?我个人觉得是因为解空间的构建和描述比较难,目前没有工程的人能够用抽象的数学空间将这么具象的解空间描述清楚。如果有更专业的小伙伴可以评论区留言打脸。

求解方案

上面说完了规划轨迹的表达,那就来到了重点,我们应该如何求解。简单讲,我们想要求解的轨迹是一个三维空间中的某条最优曲线。之前某位知友在我的评论区信誓旦旦的说,我不懂自动驾驶在这乱讲,自动驾驶都是在frenet坐标系下操作的。我就来简单说说,这个误区从哪里来的。

上图中,xy平面就是我们的车辆行驶的正常的笛卡尔坐标系,纵轴是时间。图中已经把轨迹和路径清楚表达了出来。我们可以看到,path和trajectroy两条线清楚的形成了一个曲面,而这个曲面也就形成了所谓的frenet坐标系。也就是说我们先解出的trajectory在xy平面上投影后,再用path和t轴形成一个解空间,最终还原出trajectory的真实形状。我们目前接触到的以apollo为代表的大部分思路都是这样的思路。那难道就没有其他方式了吗?答案是有的,我们可以选取tx或者ty作为一个投影平面啊,在通过一些假设找到另外一个投影我不就能还原回来了吗。再或者我的坐标系也不一定非要用直角坐标系呀,结构化道路中是有参考的,将参考作为基向量也可以获得很不错的效果啊。


所以基于以上的求解方法和求解思路,我们首先可以明白:横向纵向的规划中,解空间是一个三维空间,如果想要横纵向同时求解(耦合方案),那么就要用一种很好的方式描述这个复杂空间。这样的话,求解相对更合理更精准,但是描述方式就要变得很复杂和计算量就要大幅提升。如果将横纵向解耦,既通过对某些平面求出其投影后,在进行解的合并后,我们同样也可以获得结果。虽然表述简化了,计算方便了,但是引入了过多假设,上文已经讲过不在赘述了。

所以我们欧式空间中的状态求解,几种思路:1.在解空间上直接采样或者进行固定分辨率的离散,形成离散的解空间,然后在其上建立启发,再去求解。2.直接在连续空间中做启发设计梯度,通过梯度求解。3.做一系列的先验假设,根据先验假设指定规则,在指定解空间内,完成指定任务。

第一类就包括各类网格,采样,撒点等方法:Lattice,EM planner,A*(hybride A*),RRT等等(这里的算法都是其代表类,如RRT中也有RRT,PRM等方法。EM planner的纵向一般采样dp+qp的方法,其实与机器人中的DWA很像。A也可以是Djstra等方法。)这些算法。以上算法都是通过将连续空间离散化,在其离散空间中附上启发函数后,将规划问题变成了一个搜索问题的思路。

第二类就纯纯的在连续空间中硬刚,例如:人工势场。(我就能想到这一个,想到其他的再补充。其实各类优化算法也是一个,但是其中决大部分都有一个先验,所以不能算通过优化或者直接通过梯度设计的方式求解。)

最后一类就纯纯的基于经验和对问题的简化近似,如RS曲线,螺旋线,样条曲线等这一类方案。也没啥好说的。

所以可见,前两种方法中,有一个核心观点就是启发,或者我们叫做先验。这个先验或为cost,或为梯度,也有可能叫势场。但是他是对该场景求解的一个启发式先验。对一个场景合理的生成先验,而后在想办法把先验搞得更合理。所以现在自动驾驶对道路要求比较高,无保护左转等自由空间的规划问题相对更加复杂,就是因为缺乏先验。一般自动驾驶项目和产品,仅在规划的问题中,先验决定的产品的智能程度,后处理决定了场景的体验和落地效果。这也是为什么现有自动驾驶能够落的只有高速辅助驾驶和低速泊车这一类功能了,因为两种场景中先验容易设计,基本场景就圈定好了大概的解是什么样子。决策和规划都做了一大堆的先验假设,圈定好很小一部分解空间后,再在里面求解。问题就简单,也想对容易设计一些。所以现在自动驾驶技术也绝对符合当年大家对人工智能的评价『有多少智能,就有多少人工』。

最后再补充一点,我们上面已经说了规划和控制的分工,规划其实也是让一个理想模型跑出一个理想的既定轨迹。所以规划需要给出车辆的期望输出状态(或者叫行驶状态),那在规则道路上车辆的最终稳态一般是确定的(例如沿着车道中间走),那么从车辆当前状态到达车辆目标的稳态问题是不是就是妥妥的一种控制问题。所以很多人用控制算法也可以很好的完成这个规划任务,就和使用PID的寻迹小车是一个道理。

所以说完了整个自动驾驶的规划,我们可以很清楚的看到,方案还是很原始,内容也没有什么新意,很多时候问题甚至都没有上升至更复杂且困难的决策问题。所以我一直坚信,规划才是未来自动驾驶攻坚的部分,是技术突破的重点。我们上面描述的解空间都是欧式空间,而在问题变得更加抽象,更加复杂的情况下,是不是在无穷维空间上直接求解整条轨迹作为一种映射进行求解才是未来趋势。

方法是随着理解的深入而变化的,从来没有一成不变的方法,也没有永远好用的工具。还是那句话,学好基础,自然看到的风景不会一样,不在拘泥于细微的差异,更能从宏观角度理解问题和解决思路的差异。

2024-08-29

后面没有了,返回>>电动车百科