面灵AI→

途虎飞控算法笔试:串级 PID 与 EKF 考点

轮次
笔试
时间
2026-10
来源
牛客网

《面试题目》

  1. 线上笔试共 50 题,题型包括单选、多选、判断、论述题,以及强制的 C 语言编程。
  2. 客观题:实时系统与控制基础。
  3. 客观题:姿态解算。
  4. 客观题:串级 PID 控制。
  5. 客观题:传感器融合与 EKF。
  6. 主观题:多旋翼串级控制链路相关的工程控制。
  7. 主观题:长航时无人机漂移的成因与全套解决方案。
  8. 主观题:工业无人机的故障保护策略。
  9. C 语言编程:实现增量式 PID。

《参考解析》

串级 PID 的关键是「分频」:内环快、外环慢,外环的输出就是内环的设定值。 多旋翼常见结构是位置环(或速度环)→ 姿态角环 → 角速度环,最内层角速度环跑在最高频率(几百赫兹到 1kHz),姿态角环居中(百赫兹量级),位置环最低(几十赫兹)。为什么要串起来:角速度环直接对抗扰动(风、桨叶不平衡、电机响应差异),把扰动在内环吃掉,外环看到的对象就变得近似线性,参数好调;如果只用单环角度控制,抗扰能力差且容易振荡。工程细节是面试官真正想听的:内环输出给的是力矩(经混控矩阵分配到各电机),外环输出的是期望角速度,中间要做限幅;积分项必须加抗饱和(clamping 或 back-calculation),否则长时间偏航误差会让积分饱和导致过冲;微分项对噪声敏感,实际实现常用「对测量值微分」加低通滤波,或用不完全微分;还要说明采样周期的选择要与传感器更新率匹配,以及为什么定点数或单精度浮点在嵌入式上够用。PX4 里对应的是 mc_att_control 与 mc_rate_control 两层,参数调整顺序是先内环再外环。

姿态解算考的是「用什么表示旋转、怎么把传感器融进去」。 表示法有三类:欧拉角直观但存在万向锁、且三角函数运算量大;旋转矩阵无奇异但要求每步正交化;四元数只有四个参数、无奇异、更新只需乘加并有成熟的归一化方法,因此飞控里普遍用四元数,只在人机界面转成欧拉角。传感器特性决定了融合策略:陀螺仪短期精确但积分会漂移,加速度计长期无漂移但受线加速度与振动干扰,磁力计提供绝对航向但易受电机与铁磁干扰。常见算法按复杂度排序:互补滤波(一次低通加一次高通,参数直观、算力最省)、Mahony(PI 校正四元数,非线性但计算量小,开源飞控里很常见)、Madgwick(梯度下降优化,精度更好些)、EKF(把姿态与陀螺零偏一起做状态估计,能处理噪声协方差与观测权重)。答题时把「陀螺积分漂移只能用绝对参考修正」这条主线讲透,再补一句磁力计需要椭球拟合标定、加速度计需要六面标定,基本就是完整答案。

EKF 的考点集中在状态量、观测方程与滤波调参三处。 状态量通常是姿态四元数、速度、位置、陀螺零偏与加速度计零偏(PX4 的 EKF2 就是这套),观测是 GPS 位置与速度、气压高度、磁力计航向、光流与视觉里程计。预测步用 IMU 积分推进状态与协方差(协方差传播用雅可比矩阵近似),更新步用各传感器的观测残差与卡尔曼增益修正状态并压低协方差。要理解的核心是「谁修正谁」:惯导推进给出高频但会漂的结果,绝对观测以各自的噪声权重把漂移拉回来,协方差矩阵就是这套权重体系的记忆。工程细节:残差要过卡方检验(innovation gate)来拒掉野值,GPS 跳点与磁干扰靠这一步拦住;传感器时间同步与延迟补偿直接影响融合精度(IMU 与相机/GPS 的时间戳必须对齐);气压高度会随天气漂移,长航时要么用气压基准补偿、要么依赖于其它高度源。被问「为什么不用 UKF 或粒子滤波」时,答「EKF 在计算量、可维护性与工程验证成熟度上占优,工业产品优先选可解释、可复现的方案」比背诵算法优缺点更贴面试官的心。

长航时漂移是「多因叠加」的问题,要按来源分层给方案。 姿态与航向方向:陀螺零偏随温度变化(需要温度标定曲线或在线零偏估计)、磁力计受机载电流与结构件磁化影响(做椭球标定、把磁力计远离动力线、必要时用双天线 GNSS 定向替代磁航向);位置方向:GNSS 单点定位本身有米级漂移与多路径、城市与峡谷环境遮挡导致卫星数跳变,长航时会累积成可见偏差,解决办法是 GNSS/RTK 加惯导紧组合、引入光流或视觉做速度观测、并保证各源的时间同步;机械与气动方向:机架形变与桨叶磨损改变推力分配、重心偏移导致悬停姿态角长期不为零,会通过积分项积累成「越来越偏」,需要重新配平与标定、必要时做在线质量与推力估计;振动方向:长航时电机温度升高导致振动谱变化,滤波参数固定时会引入低频误差,需要陷波滤波跟随转速。所谓「全套解决方案」的答法是把「标定与配平 → 滤波与融合 → 在线估计与自适应 → 起飞前自检与失效判定」四层串起来,并补一句可观测性:把估计器的残差、协方差与各传感器健康状态落进日志,才有办法在事后定位漂移来自哪一层。

故障保护策略要按「检测—决策—执行」三段设计,并明确每一级的兜底动作。 检测项包括:遥控链路丢失(数传/遥控心跳超时)、动力异常(电流电压突变、单电机转速不一致、振动超限)、位置源失效(GNSS 失锁、EKF 协方差超限或残差越界)、电量(低压阈值与剩余航时估算)、地理围栏越界、以及内部看门狗(任务超时、传感器数据停止更新)。决策上要区分「降级」与「终止」:能继续飞的降级到定点悬停、切高度保持或降低最大速度;不能继续的按预设顺序执行返航、就近降落、切降落伞或直接切断动力。执行层要保证动作本身是幂等、可中断且不会互相打架的(返航途中电量继续下降要能升级为降落)。工业场景还要考虑「失效安全」的默认态:任何未分类的异常都应落到最保守的动作,而不是继续任务;以及冗余设计(双 IMU、双 GNSS、双电源)与切换时的一致性判定。回答时给出量化的触发阈值与迟滞时间(避免在阈值附近反复切换)会比罗列名词专业得多。

增量式 PID 的编程题考的是「能不能写出工程上跑得住的实现」,不是公式默写。 增量式输出的形式是 Δu = Kp*(e_k - e_{k-1}) + Ki*e_k + Kd*(e_k - 2*e_{k-1} + e_{k-2}),累加后得到 u_k;相对位置式的好处是不需要长期保存积分项的绝对值、切换手自动时冲击小、天然带抗饱和(积分通过增量累加)。写代码时要处理这些点:用 float 或定点并注意累加误差、微分项对噪声敏感要加一阶低通(或用带滤波的微分)、输出做限幅并同步限制累加项(clamping 抗饱和)、采样周期变化时 Ki/Kd 要按 dt 归一化(否则改频率就得重调参)、以及状态用结构体保存 e_{k-1}、e_{k-2}、u_{k-1} 以便重置时清零。工业代码还要求:无动态内存分配、无浮点异常、有初始化与复位接口、参数可在线修改且修改时不清积分。写完主动补一句测试思路(阶跃响应看超调与上升时间、加阶跃扰动看恢复能力、长时间运行看积分是否漂移)能明显拉分。