元戎启行自动驾驶控制算法面试经历:MPC+车辆动力学+轨迹跟踪全考察
2年控制算法经验,详细复盘元戎启行三轮技术面试:一面控制理论与MPC、二面车辆动力学与轨迹跟踪、三面项目深挖与实车调试,含真题汇总与心得建议
背景介绍
我是在一家自动驾驶公司做了2年控制算法工程师,主要做MPC和轨迹跟踪。元戎启行一直是我特别想去的公司,他们在L4自动驾驶控制方面的技术积累非常深厚,尤其是MPC和车辆动力学的结合做得很好。今年5月看到他们在招控制算法工程师,我马上就投了。
准备这个面试我花了差不多三周时间,把控制理论、MPC、车辆动力学、轨迹跟踪这些知识点全部过了一遍。尤其是MPC的各种变种(线性MPC、非线性MPC、时变MPC)和车辆动力学模型(运动学模型、动力学模型、轮胎模型),这些是面试的重点。
面试流程是三轮技术面,下面详细复盘每一轮。
面试流程复盘
一面:控制理论+MPC
一面是个看起来很年轻的工程师,后来知道是控制组的。开场先让我自我介绍,然后直接开始问控制理论。
1. PID控制和MPC的区别?MPC有什么优势?
我说PID是反馈控制,根据当前误差计算控制量,无法处理约束和预见未来;MPC是预测控制,通过模型预测未来状态,在满足约束的前提下优化控制序列。MPC的优势主要有三个:一是可以显式处理输入和状态约束;二是可以预见未来参考轨迹,提前做出响应;三是可以处理多输入多输出(MIMO)系统。
2. MPC的预测时域和控制时域怎么选择?
我说预测时域Np决定了MPC能"看到"多远的未来,Np越大控制性能越好但计算量也越大;控制时域Nc决定了优化变量的数量,Nc通常小于Np,Nc之后的控制量保持不变。一般Np取3-5秒,Nc取1-2秒,具体需要根据控制频率和系统动态特性来调。在实际项目中,我们用的是Np=50步、Nc=20步,控制频率50Hz。
3. 线性MPC和非线性MPC的区别?什么时候用非线性MPC?
我说线性MPC用线性模型做预测,优化问题是凸的,可以用QP求解器高效求解;非线性MPC用非线性模型做预测,优化问题是非凸的,需要用SQP或内点法求解,计算量更大。非线性MPC适用于系统动态非线性较强的场景,比如高速大曲率转弯、极限工况等。我们在实际项目中,低速场景用运动学模型+线性MPC就够了,高速场景需要动力学模型+非线性MPC。
4. MPC的求解器有哪些?你们用的哪个?
我说常用的求解器有OSQP(QP问题)、qpOASES(QP问题)、IPOPT(NLP问题)、ACADOS(快速NMPC框架)等。我们用的是OSQP做线性MPC,ACADOS做非线性MPC。ACADOS的优势是可以生成C代码,在嵌入式平台上运行效率很高。
5. MPC的稳定性怎么保证?
我说MPC的稳定性保证主要有两种方法:一是终端约束法,在预测时域末端加入终端约束和终端代价,保证闭环稳定性;二是足够长的预测时域,当Np足够大时,MPC的稳定性可以自然保证。我们实际用的是终端约束法,在预测时域末端加入一个终端椭圆约束,保证状态收敛到目标点附近。
6. MPC的计算延迟怎么处理?
我说计算延迟是MPC在实际应用中的一个重要问题。如果求解时间超过控制周期,控制量就不能及时更新。我们的处理方式有两个:一是用warm start,用上一时刻的解作为当前时刻的初始值,大幅减少迭代次数;二是设置最大求解时间,如果超时就用上一步的解做一步前向传播作为当前控制量。另外我们也在探索显式MPC,把优化问题离线求解成分段仿射函数,在线只需要查表。
一面大概1小时,面试官对MPC问得很细,幸好我之前做过不少MPC项目,答得还算流畅。
二面:车辆动力学+轨迹跟踪
二面是个资深工程师,一上来就问车辆动力学和轨迹跟踪。
1. 车辆运动学模型和动力学模型的区别?
我说运动学模型只考虑几何关系,不考虑力和力矩,假设车轮无侧滑。最常用的是自行车运动学模型,状态量是[x, y, ψ, v],控制量是[δ, a]。动力学模型考虑了轮胎力、侧偏角等物理量,能更准确地描述车辆动态。最常用的是自行车动力学模型,状态量多了侧偏角β和横摆角速度r,控制量还是[δ, a]。
2. 轮胎模型有哪些?Pacejka魔术公式怎么用?
我说轮胎模型主要有线性轮胎模型、Pacejka魔术公式、Dugoff模型等。线性轮胎模型假设侧偏力与侧偏角成正比,适用于小侧偏角工况;Pacejka魔术公式是经验模型,用正弦函数拟合轮胎力特性,精度高但参数多;Dugoff模型是解析模型,考虑了轮胎力的饱和特性。我们在MPC中用的是Pacejka魔术公式做非线性MPC,用线性轮胎模型做线性MPC。
3. 轨迹跟踪的误差怎么定义?
我说轨迹跟踪误差主要有横向误差、航向误差和曲率误差。横向误差是车辆质心到参考轨迹的最短距离;航向误差是车辆航向角和参考航向角的差值;曲率误差是车辆实际曲率和参考曲率的差值。在Frenet坐标系下,横向误差就是d,航向误差就是Δψ。
4. Stanley方法和Pure Pursuit方法的区别?
我说Stanley方法是前轮反馈控制,根据前轮到参考轨迹的横向误差和航向误差计算转向角,优点是低速跟踪精度高,缺点是高速容易振荡;Pure Pursuit方法是后轮跟随控制,根据后轮到前方一个预瞄点的横向误差计算转向角,优点是高速稳定性好,缺点是低速跟踪精度差、转弯有内切现象。我们在实际项目中,低速用Stanley,高速用Pure Pursuit,中间速度做平滑切换。
5. MPC做轨迹跟踪和Stanley/Pure Pursuit相比有什么优势?
我说MPC的优势主要有三个:一是可以显式处理约束(转向角限幅、加速度限幅等),Stanley和Pure Pursuit只能事后限幅;二是可以预见未来参考轨迹,提前做出响应,在曲率变化大的地方表现更好;三是可以同时优化纵向和横向控制,Stanley和Pure Pursuit只能做横向控制。但MPC的缺点是计算量大,实时性不如Stanley和Pure Pursuit。
6. 高速场景下的轨迹跟踪有什么特殊挑战?
我说高速场景的特殊挑战有三个:一是车辆动态的非线性增强,大侧偏角下轮胎力会饱和,线性模型不再适用;二是控制延迟的影响更大,高速下很小的延迟都会导致明显的跟踪误差;三是安全性要求更高,高速下控制失误的后果更严重。我们在高速场景下用非线性MPC+动力学模型,并且加入了轮胎力饱和约束,保证控制量不超过轮胎的物理极限。
二面大概1小时15分钟,面试官对车辆动力学问得很深入,尤其是轮胎模型和高速场景的处理,我答得还行但有些细节不太确定。
三面:项目深挖+实车调试
三面是控制组的tech lead,很有经验,面试更像技术交流。
他先让我讲了一个最复杂的项目,我讲了我们在高速场景下的MPC轨迹跟踪项目。然后他开始深挖:
1. 你们MPC的控制频率是多少?求解时间是多少?
我说控制频率是50Hz,即每20ms需要完成一次MPC求解。实际求解时间大概5-8ms(线性MPC)和10-15ms(非线性MPC),留了足够的余量。如果求解超时,会回退到上一帧的解做一步前向传播。
2. 实车调试和仿真调试有什么区别?
我说最大的区别是仿真是确定性的,同样的输入总是得到同样的输出;但实车有很多不确定性,比如路面附着系数变化、风阻变化、车辆参数偏差等。仿真调好的参数在实车上往往需要微调,尤其是MPC的权重矩阵和约束参数。另外实车调试还需要考虑安全性,不能直接上极限工况,需要循序渐进。
3. 实车调试中遇到最难的问题是什么?
我说最难的是低附着路面(冰雪路面)的控制。在低附着路面上,轮胎力很容易饱和,MPC的模型预测会严重偏离实际,导致控制失效。我们的解决方案是在MPC中加入了路面附着系数的在线估计,根据估计值调整轮胎力约束。另外在检测到低附着路面时,会自动降低目标速度和加速度,增加安全余量。
4. 你们怎么处理不同驾驶员的驾驶风格?
我说我们提供了舒适、标准、运动三种驾驶模式,通过调整MPC的权重矩阵来改变驾驶风格。舒适模式加大加速度和jerk的惩罚,运动模式减小这些惩罚但增加跟踪精度的权重。另外我们也在探索个性化MPC,根据驾驶员的历史操作数据自动调整权重。
5. 控制系统的安全性怎么保证?
我说安全性保证主要靠三层:第一层是MPC内部的约束,保证控制量不超过物理极限;第二层是监控层,实时检查控制量和状态量是否在安全范围内,如果越界就触发安全响应;第三层是硬件安全层,有独立的ASIL-D级别监控芯片,在控制层失效时执行紧急停车。三层安全架构确保即使软件出bug,车辆也不会失控。
6. 你觉得自动驾驶控制最大的挑战是什么?
我说我觉得最大的挑战是极端工况的控制。正常工况下MPC已经做得很好了,但在极端工况(低附着、高速急转、紧急避障)下,车辆动态高度非线性,模型预测的准确性大幅下降,控制性能也跟着下降。如何在极端工况下保证安全性和稳定性,是控制算法最大的挑战。
三面聊了1个多小时,面试官对实车调试和安全设计特别感兴趣。最后他问我有什么问题,我问了元戎启行在极端工况控制方面的最新进展,他提到了一些关于模型预测控制和强化学习结合的工作,很有意思。
真题汇总
控制理论部分:
1. PID和MPC的区别?MPC的优势?
2. MPC的预测时域和控制时域选择?
3. 线性MPC和非线性MPC的区别和适用场景?
4. MPC的求解器和选择?
5. MPC的稳定性保证方法?
6. MPC的计算延迟处理?
车辆动力学部分:
7. 运动学模型和动力学模型的区别?
8. 轮胎模型和Pacejka魔术公式?
轨迹跟踪部分:
9. 轨迹跟踪误差的定义?
10. Stanley和Pure Pursuit方法的区别?
11. MPC做轨迹跟踪的优势?
12. 高速场景轨迹跟踪的挑战?
实车调试部分:
13. MPC的控制频率和求解时间?
14. 实车调试和仿真调试的区别?
15. 低附着路面的控制挑战?
16. 不同驾驶风格的处理?
17. 控制系统的安全性保证?
18. 自动驾驶控制的最大挑战?
心得建议
1. MPC必须深入理解:不只是会用求解器,还要理解MPC的数学原理(优化问题建模、约束处理、稳定性分析),面试官会从原理层面追问。
2. 车辆动力学是重点:运动学模型、动力学模型、轮胎模型这些必须能推导,面试官会让你现场推导公式。
3. 轨迹跟踪方法要对比:Stanley、Pure Pursuit、MPC三种方法的优缺点和适用场景必须清楚,面试官喜欢问对比题。
4. 实车经验是加分项:如果你有实车调试经验,一定要讲出来,面试官非常看重实际工程能力。
5. 安全性设计是必考:自动驾驶控制的安全性怎么保证,这个问题几乎必问,一定要准备好。
6. 准备时间建议3周:如果你有2年左右的控制算法经验,3周的集中准备应该够了。重点复习MPC、车辆动力学、轨迹跟踪三个方向。
FAQ
Q:元戎启行的控制算法面试难度怎么样?
A:挺难的,尤其是二面和三面。一面偏理论,二面偏动力学深度,三面偏实车调试和安全设计。整体难度在自动驾驶公司里属于中上水平。
Q:面试官会让我现场推公式吗?
A:会的,二面让我推导了自行车动力学模型的状态空间方程。建议把关键模型的推导过程练几遍,能流利地写出来。
Q:需要有实车经验吗?
A:不是必须的,但有实车经验会加分很多。如果没有实车经验,至少要对实车调试的流程和挑战有所了解。
Q:薪资大概什么水平?
A:控制算法岗的base大概在35-50k之间,具体看级别和谈的情况。
Q:面试结果多久出来?
A:我是一面后3天收到二面通知,二面后5天收到三面通知,三面后1周多收到offer。