自动驾驶规划算法岗高频面试题详解 精华

发布于 2023-6-26 10:48
浏览
2收藏

piecewise jerk path优化算法

路径规划的任务是希望规划出一个安全与舒适的轨迹,让自动驾驶的车辆来完成行驶的任务,避开途中的一些障碍物。


它主要去考虑三方面的因素:


第一个是安全性,即轨迹不能跟其他车辆发生碰撞。

第二个是舒适性,这是从用户的角度来讲解,即有一个良好的乘坐体验,轨迹比较平稳,不会出现一些急刹等状态。

第三个是时效性,希望轨迹能稍微快一点,不能太慢,即在一个合理的时间到达目的地。


常见的一些算法,包括EMplanner和Lattice Planner。


EMplanner算法是基于EM的思想,主要是分为路径的动态规划和二次优化,速度的动态规划和二次优化来求解轨迹;Lattice Planner是基于lattice采样,通过代价函数筛选最优轨迹。从图1的Apoll版本来看,1.5版本有了EMplanner,然后2.5版本,增加了Lattice Planner算法,3.5版本将EMplanner改成PublicRoadPlanner,而在5.0版本以后是取消了SL样本动态规划。

自动驾驶规划算法岗高频面试题详解 -汽车开发者社区

图1 Apoll版本变化


EMplanner算法是先进行路径的动态规划再进行速度的动态规划,如图2所示,这里有一点是主车位置,旁边是一系列的到达点,然后将不同的点连接起来,分别计算各自的代价,然后进行反向传播去找到一个代价最小的轨迹点作为一个粗略规划,后续的进行二次优化,让轨迹能再一步的优化,变得更加平滑作。之后,进行速度的动态规划,将速度映射到ST图中,找到一个比较合适的轨迹。

自动驾驶规划算法岗高频面试题详解 -汽车开发者社区

图2 EMplanner算法过程

早期的二次优化过程是一个样条路径算法,即将一个路径分成N段,每一段用一个多项式表示,然后考虑不同段的连续性,障碍物的一个边界约束不同段等等。后来,采用分段加加速度算法,也是把一个路径分成段,然后假设每一个段的加速度是恒定的,考虑到不同段的一个连续性,然后对轨迹进行优化。具体来说,在优化问题中去考虑目标函数:

自动驾驶规划算法岗高频面试题详解 -汽车开发者社区

对于规划问题,需要掌握建模的过程,首先采样得到不同的值,如图3所示,沿着参考线的一个方向进行离散化,假定均为恒定值,然后计算每个点的可行区域。

自动驾驶规划算法岗高频面试题详解 -汽车开发者社区

图3 采样

假定图3左边的公式是一个常量,进行积分得到:

自动驾驶规划算法岗高频面试题详解 -汽车开发者社区

随后进行化简得到:

自动驾驶规划算法岗高频面试题详解 -汽车开发者社区

对于目标函数设计主要分为四部分:第一个是希望优化的轨迹比较平滑,IDL、DDL尽可能的小;第二个是轨迹要尽可能的离参考线比较近,因此设计了相对于参考性的权重;第三个是希望轨迹和末状态的偏差值尽可能的小,第四个是尽量远离障碍物(可选择),因此设计了一个权重使得其远离障碍物。


通过这些设计,可以确定目标函数,最后对目标函数进行最小化。目标函数需要做一定约束,首先是边界约束,lb<=l,dl,ddl<=ub;其次是初始条件约束;第三个是连续性约束,将其定义为:

自动驾驶规划算法岗高频面试题详解 -汽车开发者社区

从宏观来看的话,这些矩阵包括以下部分:

自动驾驶规划算法岗高频面试题详解 -汽车开发者社区

下面来可视化一下调参对曲线优化的影响,如图4所示。红色部分是边界区域,绿色部分是参考线,蓝色部分是求解后的结果,可以通过调节不同的权重来输出不同的轨迹。


具体来说,参考线的权重来控制轨迹跟参考线的一个距离;DDL权重会使得轨迹解是越来越平滑的,因为对它平滑进行了一个约束,并且这个区间的变化波动也会变小。

自动驾驶规划算法岗高频面试题详解 -汽车开发者社区

图4 调参对曲线优化影响的可视化


在使用OSQP去求解这个过程,可以看到它其实是有一些状态和迭代次数,迭代次数很容易理解,即需要在多久才能得到一个解,然后也会有返回值,比如solved, solved inaccurate, maximum iterations reached。

编程题目讲解

面试中写代码主要包括两类题目,第一类题目是类似于leetcode或者ACM等竞赛的题目;第二种题目是一些数学基础的题目。


一般来说,需要我们写一个完全的代码,包括测试案例。对于第一类题目来说,如果是核心代码模式,建议在本地的编译器中自己写输入输出来练习。比如一个两数之和的题目,需要去定义一些数字,定义一些目标值,然后定义一个返回值来接受算法,最后,去编译,将最后的结果给打印出来。


现在来举个例子,也是面试中的一个高频题目,用直线去拟合一些点。这个比较容易想到方法是用最小二乘法实现,且很容易在网上看到这一系列的公式。但实际上的整个过程是不需要完整的记下整个公式,可以引入平均值的概念,得到:

自动驾驶规划算法岗高频面试题详解 -汽车开发者社区

下一步是考虑去实现这个代码。如图5左边所示,这里例子中先去定义一个结构体,存储变量k和变量b,然后根据k的公式去一步步的实现。


首先需要计算总和,目的是算出两个的平均值;第二步,直接对应公式来写起来就好了,在两部分相除的部分加了一个很小的值,是为了防止分母出现等于零的情况,然后把结果给返回到结构体。


这样就完成了一个简单代码编写的过程,随后需要自己去写一些测试案例,那有些面试中,会告诉给你一些测试案例。

自动驾驶规划算法岗高频面试题详解 -汽车开发者社区

图5 最小二乘法拟合直线代码


当然,写代码的过程中还需要考虑很多细节,如果你细节写的越丰富,那么面试官对你的认可会比较高一些。除了用最小二乘法拟合之外,还可以用很多方法,比如说用梯度向量去做。先算出梯度,然后把损失函数定义成均方误差,求和后进行求导数,随后进行梯度更新即可得到结果,过程如图6所示。

自动驾驶规划算法岗高频面试题详解 -汽车开发者社区

图6 梯度下降法拟合直线


在写代码的时候,如果会一题多解,面试官可能觉得你掌握的知识会更丰富一些。除此之外,还可以有一些其他数学算法,比如说优化算法。举个例子,求解x方减2等于0,其结果等于正负根号二,但这里使用牛顿法进行求解。


牛顿法是一个优化算法,利用切线来近似曲线,然后将切线零点作为下一次的迭代点,核心是如图7右边的公式。


具体实现代码如图7左边所示,首先定义一个函数:F等于X方减二,下一步定义导数,之后按照更新公式书写代码。实际使用时,也需要定义一个初始的迭代点,包括误差和最大迭代次数,然后调用方法,采用一个变量的去接受反馈值。

自动驾驶规划算法岗高频面试题详解 -汽车开发者社区

图7 牛顿法求解

简历修改指导

自动驾驶的一些简历中,其实最关键的就是要明确目标投递岗位。因为很多人写简历的时候,可能有一些想做预测还是做感知,还有做规划的经历,可能会在简历中写了很多项目,但是用人单位可能不太清楚说你到底适合做哪个;或是在筛选简历的时候,也不知道你更适合去哪个部门。所以,在简历中应该更倾向于你想投递的岗位且写清楚。


在简历的书写过程中,主要考虑两方面,一方面是去介绍掌握的技能,比如常见的C++语言,python语言等,以及算法方面的深度学习、规划算法等等。第二个是项目介绍的过程,采用STAR法则,不然可能没有抓住重点,面试官也很难看出你做了哪些工作,经历可以考虑一些项目经历、比赛经历、实习经历,那么这些经历同样也尽量跟自动驾驶岗位相关一些。


举个例子,比如我参加了xx项目,提高了xx算法能力,实现了自动驾驶技能。那么可能面试官一看,不知道你本身去做哪些工作,有哪些改进,但是面试官比较看重的是你做了哪些工作,有什么贡献。


针对这种情况,采用STAR法则,S即situation,主要是项目背景;T即task,说明项目任务,具体要做什么东西,解决了什么样的问题或实现了什么功能;A即action,讲参与了哪部分的工作,设计了哪些算法,具体是怎么一个实现的过程,R即result,需要对结果进行量化,指标提升了多少。


所以,上述那段话应写为:参加了XX项目,通过实践项目提高了XX算法能力,并实现了自动驾驶功能。在项目中负责数据采集、特征提取、神经网络设计和优化等任务,提高了算法计算效率和准确性,并使车辆实现了安全、高效的自动驾驶。


文章转载自公众号:深蓝AI

分类
5
收藏 2
回复
举报
回复
相关推荐