
准备大疆控制算法笔试时最难的往往不是背公式而是不知道考点边界在哪里。控制算法岗位不像后端开发那样只考固定语法和数据结构它的题目会从数学基础、控制理论、无人机运动学、嵌入式实现和工程调参多个方向同时下手任何一环薄弱都可能在推导题或设计题上卡住。这篇文章围绕控制算法笔试的高频考点从经典控制到现代控制从无人机姿态控制到路径跟踪整理出一套可以照着复习的框架。读完后可以自己搭建一个最小验证闭环从状态方程开始写出控制器用仿真判断收敛性再看实际工程中需要补哪些环节。1. 先想清楚大疆控制算法岗笔试到底在考什么1.1 从岗位分工反推笔试范围控制算法岗位在大疆内部并不只有一个方向。飞行器控制、机器人控制、电驱动控制和机械臂控制笔试侧重点有差异但底层知识高度重合。笔试不会只考无人机悬停那一条链路更常见的是通过不同题型考察候选人对控制系统的理解深度。从岗位需求反推笔试通常覆盖这几块数学基础线性代数、矩阵运算、微分方程、数值计算。经典控制传递函数、PID、稳态误差、稳定性判据、频域分析。现代控制状态空间、能控能观、LQR、状态观测器、卡尔曼滤波。运动控制专项坐标系变换、姿态解算、串级 PID、路径跟踪、电机 FOC。工程能力离散化、控制周期、限幅、抗积分饱和、异常保护。笔试的时间有限不可能每个方向都深挖但设计题和综合题通常会要求你把多个方向串起来。比如给一个四旋翼的简化模型要求设计姿态控制器并说明参数调整逻辑这就同时考到动力学建模、PID 参数整定和工程近似能力。1.2 笔试与面试命题的不同策略笔试和面试考察的是两种能力。面试可以现场讨论考官能根据你的回答方向逐步引导重点看思维过程。笔试则只能通过卷面文字判断所以更看重推理完整性和计算结果准确性。这意味着笔试答题要养成“写全推导”的习惯。只写一个最终公式不写中间步骤改卷时无法确认你是不是真的理解。常见策略是先列模型方程再写出设计目标和约束然后推导控制器最后给参数表或仿真验证方案。这样即使某一步计算错误改卷者也能看到问题出在哪个环节。另外笔试中的代码题通常不会要求跑通完整程序而是要求你写出关键循环或控制律实现。重点考察的是代码逻辑是否与控制推导一致以及是否考虑限幅、周期、初始化、异常保护等工程细节。1.3 高频考点与复习优先级结合常见招聘信息和候选人的反馈笔试考点大致按下面的优先级分布。优先级考点方向典型题型高PID 原理与参数整定给超调量、稳态误差求参数变化趋势高状态空间与传递函数转换矩阵推导、能控能观判断高稳定性判据劳斯判据、特征根分布、奈奎斯特判据高无人机姿态表示与坐标变换欧拉角、四元数、旋转矩阵中LQR 与状态观测器目标函数、Riccati 方程、观测器设计中卡尔曼滤波预测与更新公式、协方差含义中路径跟踪算法Stanley、纯追踪、前视距离中电机控制电流环、速度环、位置环、FOC 思想低MPC、ADRC、模糊控制概念理解、适用场景、与其他算法对比如果复习时间有限先保证高优先级内容能独立推导再扩展到现代控制和运动控制专项。不要一开始钻进神经网络控制和模糊 PID 的细枝末节笔试基础题没答好加分项也救不回来。2. 基础数学与控制理论推导题的共同底牌2.1 状态空间与传递函数的互转控制算法笔试里最频繁出现的推导题就是把系统从传递函数写成状态空间或者反过来。这类题目不是死记公式要看懂矩阵结构和物理含义。一个单输入单输出系统的传递函数可以写成G(s) (b_m s^m ... b_0) / (s^n a_{n-1} s^{n-1} ... a_0)这里 n 是系统阶数。按可控标准型构造状态空间时状态方程可以写成x_dot A x B u y C x D u其中 A、B、C、D 矩阵直接由分母、分子系数填充。笔试中建议先写出系统阶数和状态变量定义再列矩阵。这样即使矩阵填错改卷者也能看出设计思路。反过来从状态空间求传递函数使用公式G(s) C (sI - A)^(-1) B D计算时最容易错的是 (sI - A) 的符号和行列式。实际答题时可以先验证系统是否真能控真能观因为不是所有状态空间表达式都能通过简单公式得到合理的传递函数。2.2 稳定性判据劳斯、奈奎斯特与李雅普诺夫稳定性判断是控制理论的重头戏。笔试中常见三种判据适用对象不同不要混用。劳斯判据适用于线性定常系统的特征方程不需要求解特征根就能判断是否存在右半平面根。答题步骤是列出特征方程构造劳斯表检查第一列符号变化次数。常见坑是漏掉零行和零元素处理遇到这种情况需要借助辅助方程处理。奈奎斯特判据用于频域分析通过开环频率响应判断闭环系统稳定性。笔试中更常考相角裕度和幅值裕度的概念。相角裕度 PM 表示系统从临界稳定到不稳定还差多少相角工程上一般要求 30 度到 60 度。幅值裕度一般要求大于 6 dB。李雅普诺夫方法用于非线性系统或时变系统。线性定常系统常用李雅普诺夫方程A^T P P A -Q其中 Q 是正定矩阵P 是待求对称矩阵。若存在正定矩阵 P 满足方程系统渐近稳定。笔试中遇到这类题不要急着算先检查 A 是否已经是 Hurwitz 矩阵再决定是否值得展开计算。2.3 能控能观性答题时容易漏掉的判断能控性判断有两种常用方式能控性矩阵[B, AB, A^2B, ..., A^(n-1)B]是否行满秩。对于单输入系统可控标准型是否可以直接写出。能观性判断类似构造能观性矩阵[C; CA; ...; CA^(n-1)]并检查是否行满秩。笔试中容易漏掉的是设计状态反馈前必须先判断能控性设计观测器前必须先判断能观性。很多候选人在 LQR 或极点配置题目中直接写状态反馈矩阵却没有证明系统是否能控。虽然最终结果可能正确但逻辑链不完整分数会打折扣。3. 经典控制核心PID、稳态误差与频域设计3.1 PID 三个环节的工程作用PID 是控制算法笔试中最基础也最高频的考点。多数候选人能写出表达式u(t) Kp e(t) Ki ∫e(t) dt Kd de(t)/dt但笔试往往不会只考公式而是从工程角度追问参数变化对系统的影响。比例环节直接放大误差Kp 增大会加快响应但过大会引起超调和振荡。积分环节用于消除稳态误差Ki 增大会提高低频增益但容易导致超调量增加和积分饱和。微分环节用于预测误差变化趋势Kd 增大会增加阻尼但会放大噪声。笔试中更深入的问题是抗积分饱和。实际工程中执行器有输出限幅积分项持续累积会导致输出停留在饱和区系统恢复变慢。常见做法是积分限幅、条件积分或反向计算。答案不唯一但必须体现出对限幅和执行器物理特性的理解。3.2 系统型别与稳态误差的关系稳态误差章节常以表格形式考记忆但笔试中更强调推导。系统型别由开环传递函数在原点处的极点个数决定。输入类型0 型系统1 型系统2 型系统单位阶跃1/(1Kp)00单位斜坡无穷大1/Kv0单位加速度无穷大无穷大1/Ka这里 Kp、Kv、Ka 分别是位置误差系数、速度误差系数和加速度误差系数。笔试中要求先求开环增益再查闭环误差系数。常见错误是把闭环系统的误差算成偏差没有考虑前向通道和反馈通道的单位。更深一层的题目会给出系统含积分环节、纯延迟或者干扰输入此时需要用终值定理e_ss lim_{s-0} s E(s)注意终值定理只在系统稳定的前提下成立很多候选人忽略了这个前提直接代公式得出错误结论。3.3 频域指标换算与笔试计算习惯笔试中频域和时域指标的换算是常客。典型二阶系统里阻尼比 zeta 与超调量 Mp 的关系为Mp exp(-pi zeta / sqrt(1 - zeta^2))相角裕度与阻尼比粗略近似为PM ≈ 100 zeta这个近似只适用于特定范围笔试中如果要求精确值需要从开环传递函数求出相角裕度。计算时先确定剪切频率再在该频率处计算相角裕度。常见错误是直接用自然频率近似剪切频率忽略高频段其他零极点的影响。笔试计算建议写清楚单位。角度用度还是弧度dB 还是线性值增益 K 是否包含在开环增益中这些细节在阅卷时很关键。4. 现代控制核心LQR、MPC、卡尔曼滤波4.1 LQR 的推导脉络与权重设计LQR 是现代控制里最常考的内容。核心问题是对线性系统设计状态反馈使二次型目标函数最小J ∫ (x^T Q x u^T R u) dt其中 Q 是状态权重矩阵R 是控制权重矩阵。最优反馈为u -K xK 通过求解连续时间 Riccati 方程得到A^T P P A - P B R^(-1) B^T P Q 0笔试中常见要求不是手算高维 P 矩阵而是先确定 Q、R再说明 K 的求法。更实际的考点是权重选择Q 越大系统响应越快但控制量越大R 越大控制量越小但收敛变慢。工程中常把状态归一化后再选择权重避免不同物理量纲差异导致权重无意义。比如位置偏差是米级速度是米每秒级姿态是弧度级值域差别很大。如果直接在原始量纲上设对角权重需要反复调试。笔试中如果能提到这一点会明显区分于只会套公式的候选人。4.2 MPC预测、滚动优化与约束处理模型预测控制在笔试中通常考概念和适用场景。它基于系统模型预测未来 N 步输出在每个控制周期求解一个带约束的优化问题只执行当前时刻的控制量下一周期重新预测和滚动优化。min Σ (参考轨迹 - 预测输出)^2 λ (控制增量)^2 s.t. 状态方程约束 控制量上下限 状态量安全约束MPC 与 LQR 最大的区别是能显式处理约束。笔试中常问“什么时候用 MPC什么时候用 LQR”。可以这样回答无约束线性系统使用 LQR 更高效运算量小存在输入饱和、状态安全边界或预测性要求时MPC 更适合但计算量大对嵌入式平台要求高。附加题常涉及 MPC 与 PID 的对比。PID 是反馈控制没有显式预测MPC 是预测控制可以在约束下规划未来动作。笔试中不要简单说“MPC 比 PID 好”要强调计算复杂度、模型依赖程度和调试难度。4.3 卡尔曼滤波从计算步骤到代码框架卡尔曼滤波在无人机姿态估计、定位和传感器融合场景中非常重要。笔试常考基本公式和含义不一定会要求手推完整推导。离散卡尔曼滤波分两步。预测步x_pred A x_prev B u P_pred A P_prev A^T Q更新步K P_pred H^T (H P_pred H^T R)^(-1) x_new x_pred K (z - H x_pred) P_new (I - K H) P_pred这里 Q 是过程噪声协方差R 是测量噪声协方差。笔试中常问 Q 和 R 改变会有什么影响。R 增大时卡尔曼增益变小更信任预测Q 增大时增益变大更信任测量。代码题中可能出现一个简化的卡尔曼滤波函数实现重点不是写成高维矩阵运算库而是写清楚预测、更新和协方差传播逻辑。下面是一个最简单的一维位置估计框架import numpy as np class SimpleKF: def __init__(self, q, r, x00.0, p01.0): self.x x0 self.P p0 self.Q q self.R r def predict(self, dt, v0.0): # 一维简化为 x x v*dt速度已知 self.x self.x v * dt self.P self.P self.Q def update(self, z): K self.P / (self.P self.R) self.x self.x K * (z - self.x) self.P (1 - K) * self.P return self.x实际项目中还需要考虑时间戳、传感器丢帧、噪声模型标定和野值剔除。笔试中能在代码里体现这些意识会很有优势。5. 无人机与运动控制专项姿态、级联与跟踪5.1 坐标系、欧拉角与四元数无人机控制绕不开姿态表示。笔试常考欧拉角、旋转矩阵和四元数的转换。欧拉角直观但存在万向锁问题。飞行器常用航空顺序先偏航 yaw、再俯仰 pitch、最后滚转 roll。绕三轴的旋转矩阵可以按顺序相乘得到但笔试中更侧重理解旋转顺序的影响而不是死记矩阵每一项。四元数用四个数表示旋转表达紧凑、无明显奇异性适合姿态更新和插值。单位四元数 q (w, x, y, z)满足 w^2 x^2 y^2 z^2 1。姿态更新常用一阶积分q_dot 0.5 * q ⊗ ω其中 ω 是机体角速度符号 ⊗ 表示四元数乘法。笔试中如果涉及四元数微分一定要写明角速度是在机体系下测量并注意更新后归一化。常见题是给定欧拉角计算旋转矩阵或给定旋转矩阵反解欧拉角。答题时建议先说明定义方式和坐标轴顺序再列公式避免因为默认顺序不同而失分。5.2 姿态环的串级 PID 设计四旋翼姿态控制常用串级 PID。外环是角度环输入期望角度输出期望角速度内环是角速度环输入期望角速度输出力矩。为什么不只用一个角度环 PID因为无人机角速度响应快力矩直接作用于角加速度内环先稳定角速度可以改善阻尼特性同时能抑制机体角速度扰动。内环带宽要高于外环否则飞行会表现出明显振荡。笔试设计题常见形式是给一个飞行器的转动惯量和期望响应时间要求设计角速度环。答题逻辑是建立旋转动力学方程力矩 转动惯量 × 角加速度。确定内环控制律比如M Kp_ω (ω_des - ω) - Kd_ω ω其中 Kd_ω 提供阻尼。根据期望闭环带宽估计内环参数。再进入外环把期望角速度作为角度误差的比例输出。说明限幅、积分饱和和滤波。笔试不要求精确算出最终数值但要求能给出完整的参数推导链路。5.3 路径跟踪纯追踪与 Stanley 的几何逻辑路径跟踪算法在机器人、无人车和无人机导航笔试中都会出现。Stanley 算法是常见考点核心是把横向误差和前轮转角联系起来。Stanley 控制律的形式为δ θ_e arctan(k * e / v)其中 θ_e 是航向与参考路径方向的角度差e 是横向偏差v 是速度k 是增益。等式中 arctan 的作用是当速度低时避免转向过猛或者说用速度对横向误差产生的影响做归一化。笔试常问当前向速度接近零时Stanley 控制会怎样答案是要么转向角饱和要么需要额外处理不能用纯 Stanley 控制低速下的横向修正。纯追踪算法则通过前瞻点计算圆弧曲率。前视距离 L 是重要参数前视距离大路径跟踪平缓但会切弯前视距离小跟踪紧贴但方向盘动作频繁。笔试中常要求画图或解释前视距离对跟踪效果的影响。5.4 电机闭环电流环、速度环与位置环电机控制方向也常出现在控制算法笔试中尤其是做无人机的动力系统控制。FOC 的核心思想是先把三相电流做坐标变换得到直轴 d 轴和交轴 q 轴分量然后分别控制。电流环响应最快速度环其次位置环最慢。笔试中常问为什么电流环需要最高带宽。原因是电流直接与力矩相关电流环延迟会直接限制速度环和位置环的带宽。实际工程中电流环采样频率远高于速度环常见设计是电流环 10 kHz 左右速度环 1 kHz 左右。答题中如果能提到力矩与 q 轴电流的近似线性关系以及弱磁控制在高速区的限制会比只回答 PID 三个环更完整。6. 题型拆解计算题、推导题与设计题怎么答6.1 计算题的规范步骤建模、推导、算例、结论笔试计算题不是只看最终答案。改卷者更看重你是否能按工程思路组织答案。推荐四步结构建模写出系统方程或传递函数注明变量和单位。推导给出关键公式和中间步骤。算例代入给定数值得到结果。结论说明该结果对应的工程现象以及是否满足要求。以一个常见题型为例给定二阶系统传递函数要求计算超调量、峰值时间和稳态误差。答题时先写出标准二阶系统形式找出自然频率 ωn 和阻尼比 zeta再代入公式。计算峰值时间时要注意分子分母的单位不要漏掉1/sqrt(1-zeta^2)。6.2 设计题的答题结构对象、指标、方案、验证设计题是控制算法笔试中最容易拉开差距的题型。它往往给出一个被控对象和性能要求让你设计控制器。不要只写一个公式要按下面顺序组织。先写被控对象模型。比如四旋翼的滚转角通道简化成二阶积分模型要说明线性化条件和忽略项。然后写控制指标比如超调量小于 5%稳态误差为 0调节时间小于 0.5 秒。接着写控制器结构选择 PID、串级 PID、LQR 或其他方案并说明为什么选这个方案而不选另一个。最后给出验证方案比如用 MATLAB/Simulink 或 Python 建模仿真判断是否满足指标。这种答题方式优点是把笔试当成分阶段的方案评审思路清晰即使个别计算不完整也能保住大部分分数。6.3 代码题的常见形式与工程细节代码题不要求写完整工程更多是写一个控制函数或离散化更新代码。常见要求是给定当前状态和期望状态实现一个 PID 控制器或给定状态空间矩阵写离散化后的更新循环。写这种代码时要先写清注释说明输入、输出和单位。控制周期要显式声明因为连续控制律进入离散系统后积分和微分都需要按采样周期处理。积分项用累加方式注意更新顺序error setpoint - feedback; integral error * dt; derivative (error - last_error) / dt; output Kp * error Ki * integral Kd * derivative; last_error error;这段代码缺少限幅和抗积分饱和实际题目如果显示输出范围要补上if (output out_max) output out_max; if (output out_min) output out_min;不要为了简洁丢掉限幅那是工程控制最基础的约束。7. 用仿真验证控制器从笔试知识到工程闭环7.1 推荐工具链MATLAB/Simulink 与 Python Control笔试题目写完了但复习阶段最好自己能动手仿真。仿真能帮你验证推导是否正确也能加深控制参数对系统影响的理解。常用工具链有两个方向MATLAB Simulink优势是控制工具箱成熟适合快速搭建框图模型很多高校教材和课程实验都以它为主。Python 的 control 库、numpy 和 matplotlib适合写脚本和自动化批量实验方便在个人电脑上搭建。如果复习时间紧优先用 Python。它不需要额外授权安装简单又能直接通过代码看到控制逻辑和数据结构。7.2 一个最小示例LQR 控制二阶系统用 Python 实现一个二阶系统的 LQR 控制可以直接验证状态反馈设计。示例针对一个简化质量-弹簧-阻尼系统不针对具体飞行器模型。import numpy as np from scipy.linalg import solve_continuous_are import matplotlib.pyplot as plt # 质量-弹簧-阻尼系统 m 1.0 k 2.0 c 0.5 # 状态: x [位置, 速度] A np.array([[0.0, 1.0], [-k/m, -c/m]]) B np.array([[0.0], [1.0/m]]) C np.array([[1.0, 0.0]]) D np.array([[0.0]]) # LQR 权重 Q np.array([[10.0, 0.0], [0.0, 1.0]]) R np.array([[0.5]]) # 求解 Riccati 方程 P solve_continuous_are(A, B, Q, R) K np.linalg.inv(R) B.T P print(K , K) # 闭环系统矩阵 Acl A - B K # 状态响应 dt 0.01 t_end 8.0 time np.arange(0, t_end, dt) x np.array([[1.0], [0.0]]) u_list [] x_list [] for t in time: u -K x x_dot A x B u x x x_dot * dt x_list.append(x.flatten()) u_list.append(u.item()) x_list np.array(x_list) plt.figure(figsize(8, 4)) plt.plot(time, x_list[:, 0], labelposition) plt.plot(time, x_list[:, 1], labelvelocity) plt.plot(time, u_list, labelcontrol input) plt.xlabel(time (s)) plt.ylabel(value) plt.legend() plt.grid(True) plt.show()这个示例展示的是“仿真验证”的思路不是笔试答题模板。实际笔试中不需要粘贴这种完整代码但要能描述出来。仿真前先想清楚初始条件是什么输出怎么看是否满足稳定性预期。7.3 仿真验证清单与结果判断仿真结果不是“画出图来能看”就完了。要对照下面清单逐项确认。初始状态是否合理比如位置 1 米、速度 0。状态是否收敛到 0衰减是否有明显振荡。控制量是否超过执行器限幅。权重 Q、R 改变后响应速度和控制量变化是否符合预期。采样时间 dt 是否足够小是否引入离散化误差。模型简化是否合理忽略的非线性项会不会在更大初始条件下导致失真。如果仿真出现发散先检查状态方程符号是否正确再检查 K 是否会计算出错误符号最后检查 Riccati 方程是否真的存在正定解。8. 复习路线、常见坑与考场策略8.1 四周复习路线控制算法笔试覆盖面广建议把复习拆成四周每周围绕一个主题。第一周巩固数学和控制理论基础。重点复习矩阵、状态空间、传递函数、稳定性判据。每天做两道状态空间与传递函数互转的题画一次劳斯表。第二周攻克经典控制。PID 原理、稳态误差、频域指标、串级控制。用 Python 或 MATLAB 做一个简单 PID 调节仿真观察 Kp、Ki、Kd 变化。第三周进入现代控制和状态估计。LQR、MPC 概念、卡尔曼滤波、观测器。争取手推一次 LQR 的 Riccati 方程再写一个一维卡尔曼滤波脚本。第四周专项突击无人机控制。姿态表示、串级 PID、路径跟踪、电机闭环。找几道综合设计题练习把设计题答案写成完整的方案文档。8.2 笔试中的五个常见坑第一个坑是不区分单位而直接套公式。飞行器控制中角度的度与弧度混用会导致控制器输出差异很大。建议答题前先明确单位必要时在公式里标注。第二个坑是忽略系统稳定前提就使用终值定理。稳态误差公式大多基于闭环系统稳定系统临界失稳时结果没有意义。第三个坑是设计观测器前不检查能观性。很多候选人直接写观测器增益公式却没有证明系统能否观逻辑链不完整。第四个坑是离散化只写连续控制律。实际飞行控制器运行在固定周期笔试中如果提到“控制周期 1 ms”就要考虑离散 PID 或离散状态反馈。第五个坑是只写优点不写局限。比如使用 MPC 时不说计算量和模型依赖使用 LQR 时不说约束处理能力。工程问题没有银弹能指出方案边界才是成熟表现。8.3 考场时间分配与答题顺序进入笔试现场后先快速浏览全卷标记出熟悉题和生疏题。建议先做计算题和推导题因为这类题步骤分多写到关键点就能得分。设计题放在中间留足时间梳理模型和控制器结构。代码题可以放在最后因为它的逻辑相对完整即使时间紧张也能写清框架。如果卡在某道题超过 10 分钟先往下做。控制算法笔试经常出现“前面耽误太久后面全崩”的情况实际上多数题目单独分值不高不要为一道题牺牲全卷。最后留 10 分钟检查公式、符号和单位尤其检查传递函数分母的符号、矩阵相乘顺序和角度单位。很多计算错误都出在这些基础细节。控制算法笔试的复习本质上是把“公式记忆”升级成“系统设计能力”。真正拉开差距的不是记住了 PID 还是 LQR 的公式而是遇到一个给定了模型的系统时能不能从建模、控制器设计、参数整定到仿真验证走完整条链路。建议从今天开始拿一个简单的二阶积分模型做练习用 LQR 控制它收敛再用 PID 控制它收敛对比两种方式的参数设计和响应差异。完成后再把对象换成四旋翼滚转通道的简化模型思考串级结构应该怎么设计。这套流程跑通一次笔试中的推导题和设计题就不再是无从下手的陌生题目。