By: Phillweston
-
注:
原创链接如下:
详细!自动驾驶规划控制算法工程师面经(具体题目+回答思路)
本人引用了此链接中的提问内容,并根据自己的想法写了部分回答,回答部分仅供参考。
Case 1
路径规划算法类:
-
Dijstra算法,算法流程
- 初始化
- 检验从所有已标记的点k到其他直接连接的未标记的点j的距离
- 选取下一个点。从所有未标记的点中选取 最小的点i,点i被选为最短路径中的一点,并设为已标记的。
- 标记点i。如果所有的点已标记,则算法结束。否则,记k = i,转到2继续。
-
A算法,算法流程,编程实现的过程中使用了哪些数据结构,项目中在原有方法基础上有哪些改进,启发函数的设计,A与Dijstra的区别;
A算法原理:A 算法是一种高效的启发式搜索算法,在二维的栅格地图上寻路效果好,它通过估算节点的代价评估函数值并作为节点的综合优先级,当选择下一个需要遍历的节点时,再选取综合优先级最高的节点,逐步地找到最优路径。
A* 算法可以快速的找到代价值最小,路程最短的路径,但是随着栅格精度的提高和地图尺寸的扩大,对无用节点的重复搜索评估会导致 A* 算法搜索时间呈指数级增长。
A算法使用Open列表(priority queue)来维护待扩张的节点,并查找队列中F值最小的节点,移动到CLOSED列表中,并跟它周围的可交换的点交换,得到下一个节点的信息,判断下一个是否到达以及实际代价dist以及是否更新来决定是否进入队列。
A也算是启发式搜索算法的一种,它更像是Dijkstra算法与Greedy Best First Search搜索算法的结合体。A*算法的启发式函数 f(n) 由两部分组成,一部分是 g(n) ,另一个部分是 h(n) 。
h(n)是Greedy Best First Search算法的启发式函数,往往为曼哈顿距离或者为欧几里得距离,g(n)是Dijistra算法求得的当前点到起点的最短距离。 -
Lattice planner 百度apollo的那个
LatticePlanner算法属于一种局部轨迹规划器,输出轨迹将直接输入到控制器,由控制器完成对局部轨迹的跟踪控制。因此,Lattice Planner输出的轨迹是一条光滑无碰撞满足车辆运动学约束和速度约束的平稳安全的局部轨迹。
Lattice Planner的输入端主要由三部分组成,感知及障碍物信息、参考线信息及定位信息。
Lattice规划算法是一种基于采样的运动规划算法,通过将车辆坐标系转换到参考线坐标系,也就是frenet坐标系下,然后在frenet坐标系下分别对frenet的d轴和s轴进行规划,形成frenet坐标系下的规划轨迹,
然后将frenet坐标系下的轨迹合成到世界坐标系下还原为世界坐标系下的轨迹。- 将车辆当前位姿信息转换到frenet坐标系下
- 对轨迹状态进行采样,分别是轨迹运行时间t,目标速度v,及到参考线的横向位移d,通过这三个规划参数可以获得采样状态。
- 构建横向位移和纵向位移的多项式规划函数s(t),d(s)
- 采样轨迹的碰撞检测、曲率约束及最优轨迹打分。
-
参考链接:
使用二次规划方法优化车辆轨迹
-
RRT算法流程;
RRT 适用于涉及非完整约束场合下的路径规划问题。
算法流程:- 初始化环境
- 从环境中随机采样状态点
- 从所构建的树中寻找距离采样点最近的结点
- 开始树的生长过程
- 判断从当前最近的结点到当前采样点是否穿过障碍物,如果穿过,则放弃该新的结点,如果没有,则将新的结点加入到树中。
- 从步骤二开始重复,直到树新生成的结点到目标点的距离小于一个步长,则终止树的生长。
-
RRT*相对于RRT的改进
RRT算法不能保证所得出的可行路径是相对优化的,RRT算法能快速找出初始路径,并随着采样点的增加,不断优化直到找到目标点或者是达到设定的最大循环次数。(渐进优化)
RRT相对于RRT算法,具有更小的计算出的路径代价 -
一些关于frenet坐标系的问题;
笛卡尔坐标系是大地切平面投影,Frenet坐标系,把轨迹转换成单参数曲线。
笛卡尔坐标系的替代解决方案为 Frenet 坐标系,Frenet 坐标系描述了汽车相对于道路的位置,
在 Frenet 坐标系中,使用道路的中心线作为参考线,使用参考线的切线向量 t 和法线向量 n 建立一个坐标系。以参考线的起始点为原点,坐标轴相互垂直,分为s方向和d方向,s代表沿道路的距离称为纵坐标,d表示与纵向线的位移称为横坐标。
使用frenet坐标系将一个复杂的轨迹优化问题转化成三个子优化问题:一个横向优化、纵向优化以及中线问题(s方向是车辆的纵向规划,d方向为横向规划)。-
参考链接:
关于Frenet坐标系内曲率约束_同学醒醒放学了的博客-CSDN博客
-
-
如何设计一个十字路口左转的算法,包括路径规划与决策两个部分;
-
现场写一个轨迹规划算法的代码;
决策算法类:
-
关于有限状态机决策的相关问题,项目中状态机的设计;
-
马尔可夫决策过程相关问题,MDP如何求解,POMDP与MDP的区别,POMDP如何求解;
马尔科夫性质指的就是下一状态只与当前状态有关,与过去状态无关。
马尔科夫链是马尔科夫决策的基础,只包括状态与转移概率。转移概率指的就是从某一状态转移到其他状态或者继续停留在当前状态的概率。
贝尔曼方程推导到最后一行的意思就是,当前状态的价值=到达当前状态的奖励+下一状态的价值,再形象一点就是当前状态的价值不仅与当前状态的奖励有关,还与下一状态的价值有关。
Bellman Equation 就是当前状态与未来状态的迭代关系,表示当前状态的值函数可以通过下个状态的值函数来计算。
可以采用类似动态规划的求解法求解MDP问题,(蒙特卡罗法、时间差分法)主要采用迭代法策略评估,用贝尔曼方程反向迭代。-
参考链接:
二、MDP问题_温酒煮青梅的博客-CSDN博客_mdp问题
强化学习(三):动态规划求解MDP(Planning by Dynamic Programming)
-
-
强化学习相关问题,DQN、PPO、DDPG算法流程,动作空间的选取,状态空间的选取,奖赏的设计,如何设置合适的奖赏(逆强化学习);
DQN用于入门深度强化学习,使用一个Q Network来估计Q值,从而替换了 Q-table,完成从离散状态空间到连续状态空间的跨越。
Q Network 会对每一个离散动作的Q值进行估计,执行的时候选择Q值最高的动作(greedy 策略)。并使用 epslion-greedy 策略进行探索(探索的时候,有很小的概率随机执行动作),来获得各种动作的训练数据。
DDQN(Double DQN)更加稳定,因为最优化操作会传播高估误差,所以它同时训练两个Q network并选择较小的Q值用于计算TD-error,降低高估误差。
PPO(Proximal PO 近端策略搜索),训练稳定,调参简单,robust(稳健、耐操)。-
参考链接:
强化学习入门:从DQN,Double DQN,Prioritized,Dueling到Rainbow
-
-
RL算法在什么环境里训练,做过实车实验吗,怎么验证算法的有效性;
-
提高数据利用率的强化学习算法有哪些;
我们可以把强化学习算法分为三类:Policy-based、Value-based和将两者结合的算法
Policy-based:输入状态,输出下一动作的概率。如Policy Gradient。
Value-based:输入状态,输出动作的价值。如Q-learning、DQN、Sarsa。
两类强化学习算法:On-policy和Off-policy
On-policy:行动策略和目标策略是同一个,更新价值的策略是既定策略。
Off-policy:行动策略和目标策略不是同一个,更新价值的策略是新策略。
编程题:
- 二叉树的各种题(各种遍历,求深度等等),链表的各种题(反转,合并);
- 柠檬水找零,力扣860,还被问到过一次如何用RL解;
- 机器人运动范围,力扣13;
- 八皇后,力扣51;
- 公交车线路,力扣815,难题;
- 不用加号的加法,力扣153;
Case 2
一面
- 自我介绍(基本信息,应聘岗位,具备什么优势)重点突出自己研究方向;
- 项目细节,从一些控制论和机器学习(可解释的贝叶斯学习算法)的方面展开,写了三四张纸(包括简略的算法结构框图,一些核心的算法公式),以及拓展的概念和应用场景;
二面
- 自我介绍,项目细节
- 面试官拓展问项目细节,为什么不用卡尔曼滤波 ?就对比都说了下GPS和卡尔曼滤波的优缺点和项目的契合点;
- 面试官问了解哪些常见的规划算法以及比较,算法优势在哪?
- 考察了两个算法题,一个是车辆在曲线道路行驶的场景下,投影法向量和自身角度状态空间表达式;一个是时间速度-空间速度的转化问题;
Case 3
规划相关
-
想保证车辆曲率连续最小需要几阶约束,
需要至少三阶约束(三阶多项式曲线)
-
曲率在车辆操控上最直观的体现是,
影响车辆的转弯半径,
-
曼哈顿距离与欧式距离的优缺点,
欧式距离指的是两点之间的真实距离,缺点是没有考虑到总体变异(随机波动)对距离远近的影响。
曼哈顿距离指的是两个点在标准坐标系上的绝对轴距总和,曼哈顿距离的一个优点是计算速度快。-
参考链接:
机器学习各种距离优缺点_不一样的等待12305的博客-CSDN博客_曼哈顿距离的优缺点
-
决策相关
-
DQN/Double DQN
参考Q-Learning和Double Q-Learning的部分
Q-Learning采用单估计器估计下一个状态,Double Q-Learning采用两个估计器估计状态
在学习方式上,Doubble DQN采用两个network,online network和target network,分别进行选择和评估-
参考链接:
如何选择深度强化学习算法?MuZero/SAC/PPO/TD3/DDPG/DQN/等(2021-04)
强化学习算法学习_濒临秃头的少女的博客-CSDN博客
-
-
DQN,PPO区别
主要区别是连续动作空间和离散动作空间,DQN用于离散空间,PPO用于连续空间
DQN更新Q值,和选取的策略无关,PPO通过重要性采样技术完成离线策略更新-
参考链接:
认识 PPO和DDPG_本帅哥屏蔽了凡人的博客-CSDN博客_ppo和ddpg
-
Case 4
-
项目介绍,介绍EMPlanner,Lattice Planner与EMPlanner区别,介绍HybridA*,D*, HybridA与A区别;
Lattice Planner主要基于采样+选择,而EM Planner的思路是逐层优化迭代。
从决策层来看,Lattice的决策相对简单,适用于相对简单的场景,EM算法可以处理相对复杂的道路环境。 -
八股手撕:Leetcode239.滑动窗口最大值,判断一个点是否在再三角形内部
-
自适应PID
主要采用神经网络方法对PID参数进行整定,自适应PID与普通的PID算法最大的区别就是它能够根据系统的性质的改变从而自行调整PID的参数。
神经元学习规则可以采用有监督的Hebb学习规则,-
参考链接:
PID算法-从单级PID到单神经元自适应PID控制器
-
-
控制无人艇与车辆的区别
-
高速控制画龙问题如何解决
Case 5
一面
-
聊项目
-
A*,D*;
D是Dynamic A,相对于静态的A算法,A需要完整获取周围环境信息并构建一幅全局地图,而针对于很多实际应用场景中,智能体并不完全清楚自己周边的环境信息,或者只拥有一张不完整的地图。
传统改进的方法就是,每一次收集到新的信息之后就更新地图并使用A规划一次最优路径,而该方法较为消耗计算资源。
所以更优的方法应该是基于上一个周期的规划路径结合新的更新信息做一定的修复改变。这类算法就叫做增量式的重规划算法,也就是D算法。 -
手撕:Leetcode102.二叉树的层序遍历,bfs与dfs两种方法;
class Solution(object): def levelOrder(self, root): if not root:#处理特殊情况 return [] q= [root]#一开始把根节点放入列表,根节点自己就是一层 res=[] while q:#当队列不为空就一直进行for循环 re =[]#存放单层结果的res列表 for i in range(len(q)):#遍历当前q的长度,有多长下面就出队列几个 qq = q.pop(0) re.append(qq.val)#将出队列的元素存入结果列表 if qq.left:#如果这个元素有左右子节点,就继续放入队列,下次for循环时出队列 q.append(qq.left) if qq.right: q.append(qq.right) res.append(re)#把当前层的结果列表添加入总结果 return res
-
参考链接:
BFS算法和DFS算法(含图解:简单易懂)_欦宇丶的博客-CSDN博客_bfs算法
-
-
智力题:一块蛋糕切n刀最多切几块
二面
-
项目算法提问
-
Hybrid A*解决什么问题,算法思想介绍
Hybrid A主要解决实时在线重新规划地图,并且在位置环境下构建可飞行轨迹的问题。
Hybrid A与A的差异主要是搜索中采用的启发函数不同:
传统的A算法采用2D的欧几里得距离(欧氏距离),而Hybrid A采用两个启发函数
第一个启发函数是Constrained heuristic,只考虑车辆的非完整性约束而不考虑障碍物
第二个启发函数是Unconstrained heuristics,只考虑障碍物信息而不考虑车辆的非完整性约束条件
GridMapSearch + Lattice Graph = Hybrid A-
参考链接:
【论文研读】路径规划中的Hybrid A*算法
-
-
推理题:A,B,C三个角色,C告诉B生日日期,告诉A生日月份,给10个日期选项与一些条件,推理C的生日是哪一天。文章来源:https://www.toymoban.com/news/detail-512274.html
补充内容
KD-Tree文章来源地址https://www.toymoban.com/news/detail-512274.html
到了这里,关于Phillweston 自动驾驶 决策规划算法 面经的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!