面灵AI→

宇树科技 运动控制二面:MPC/WBC 与状态估计

轮次
二面
时间
2026-10
来源
牛客网

《面试题目》

  1. 请你先做一个自我介绍,然后讲讲你在足式机器人运动控制方面做过什么。
  2. 你项目里的机器人是几足?自由度多少?用的什么电机?
  3. 关节控制用的什么?位置控制、速度控制还是力矩控制?
  4. 控制频率多少?和感知频率怎么对齐?
  5. 你用的什么步态?Trot、Walk 还是 Bound?
  6. 步态切换的时候怎么保证稳定?有没有状态机?
  7. MPC 你用过吗?预测时域多长?控制时域多长?
  8. MPC 的权重怎么调?状态权重和控制权重分别怎么设?
  9. 如果 MPC 求解太慢,你怎么优化?有没有用 OSQP?
  10. WBC 你了解吗?和 MPC 怎么配合?
  11. 如果地面摩擦系数变化,你怎么让机器人适应?
  12. 状态估计你怎么做的?用的什么滤波器?
  13. IMU 和关节编码器怎么融合?卡尔曼还是互补滤波?
  14. 如果 IMU 漂移,你怎么检测和补偿?
  15. 足端力控你怎么做的?有没有用力传感器?
  16. 如果没有力传感器,你怎么估计足端接触力?
  17. 摔倒检测你怎么做的?检测到之后怎么保护?
  18. 如果机器人单腿失效,你怎么让它继续走?
  19. 你怎么做仿真验证?用的什么仿真器?
  20. Sim2Real 你做过哪些工作?电机模型怎么标定?
  21. 如果仿真里能走但真机上站不稳,你怎么排查?
  22. 你怎么评估一个步态的好坏?指标有哪些?
  23. 能耗你关注吗?怎么优化?
  24. 如果让你设计一个四足机器人的全身控制框架,你会怎么分层?
  25. 感知、规划、控制三层怎么通信?延迟怎么控制?
  26. 你怎么做可观测性?关键日志记录哪些?
  27. 线上出问题怎么排查?先看什么?
  28. 你怎么控制成本?用的什么计算平台?
  29. 你怎么跟进足式机器人领域的最新进展?最近看了什么?
  30. 如果让你从零搭建一个运动控制团队,你会怎么招人?
  31. 反问:团队现在做的是哪款机器人?
  32. 手撕:实现一个简单的 PID 控制器,要求支持积分限幅和输出限幅。

《参考解析》

平台与控制模式:三层控制接口的取舍。 足式平台通常分三层:关节空间底层(电流/力矩环,频率最高,由电机驱动器闭环)、中层(关节位置/速度/力矩指令,几十到一两百赫兹)、上层(步态与全身控制,几十到几百赫兹)。位置控制简单、抗扰动差、柔顺性差;速度控制适合轮式或特定关节;力矩控制(或阻抗/导纳)是足式的主流,因为它能直接表达接触力需求,落地冲击小、能适应不同地面。实际工程里多用力矩前馈 + 关节阻抗,即上层算出力矩期望,底层用高增益力矩环跟踪。谈项目时要把「电机类型(准直驱/谐波减速/行星)、额定与峰值力矩、编码器精度、通信总线(EtherCAT/CAN,周期抖动)」讲清楚,因为这些参数决定了上层能设计多高的控制带宽。抖动和总线周期是常被忽视的坑:控制环路标称 1kHz,但通信抖动和驱动器内环延迟会让实际相位裕度明显下降,所以设计时要把总延迟明确算进去。

控制频率、感知对齐与步态切换。 多层频率必须成整数比并且有确定性的时序:控制环固定周期(如 1ms)、步态与 MPC 在较低频率(如 50–200Hz)、感知与状态估计在其间插值,用时间戳对齐而不是「收到就用」。常见做法是控制线程只读一份共享的最新状态快照,并在等待新数据超时后按模型外推,避免因为感知卡顿把控制环拖住;跨层通信要无锁或带优先级的实时队列,绝不在控制线程里做动态内存分配和阻塞 IO。步态切换靠有限状态机(或行为树)管理,每个状态定义进入条件、退出条件、支撑相/摆动相时序、以及切换时的过渡策略;切换瞬间最容易失稳,工程上的解法是保证「至少三足支撑」或缩短腾空时间、在切换前后对落脚点与质心速度做约束、并对接触力做平滑过渡。Trot(对角小跑)简单稳定、速度中高;Walk 四足依次迈步,低速稳定但复杂;Bound/Pace 更难但速度快。答这题时主动说明不同步态的适用速度区间与切换时的连续性处理,比只报一个名字更容易拿分。

MPC 的时域、权重与求解加速。 预测时域要覆盖「从当前状态到下一次可改动的时刻」的物理时间,通常 0.5–1.5 秒,步长在近端密、远端疏(或用变步长);控制时域只施加前若干步,其余丢弃并在下一周期重算(滚动时域)。时域太短会在扰动后来不及规划恢复,太长则求解变慢且远端模型误差让解无意义。权重调参的经验做法是先把状态权重按量纲归一化(位置误差按厘米、速度按 m/s、姿态角按弧度分别标定),否则不同量纲的权重没法比较;再按优先级排序——稳定性相关的项(质心高度、姿态、足端接触)权重最高,跟踪精度次之,控制量(力矩/加速度变化率)作为平滑正则权重最低但必需,用来抑制抖动。调参要配合可解释的实验:单独激励某个维度(推一下、给定速度阶跃),看响应曲线再改权重,而不是盲调。求解加速手段按收益排:问题规模控制(减少接触点与决策变量、用简化动力学如单刚体模型 SRBD)、暖启动(用上一周期的解做初值,收敛快很多)、稀疏结构与固定结构(预分解、避免每步重建矩阵)、以及选对求解器(OSQP 适合 QP 且支持热启动,rti 的思路是先做一次近似求解、再在剩余时间内迭代改善)。实时性判断应看最坏求解时间而非平均,并在超时时用上次解或退化到安全的站立策略。

WBC 与 MPC 的配合、地面适应。 分层关系通常是:MPC 在简化模型(单刚体、点足)上求解质心轨迹与足端接触力或落脚点,WBC(全身控制)在完整动力学上把这些高层目标与硬约束(关节限位、摩擦锥、力矩上限、接触不滑动)转成关节力矩,用 QP 表达「任务优先级的软硬约束」。MPC 决定「去哪、用多大力」,WBC 决定「怎么分配到关节」。两者频率不同,MPC 几十赫兹、WBC 数百到上千赫兹,中间要做目标插值。地面摩擦变化时的适应有几条路:把摩擦系数做成在线估计量(从足端切向力与法向力的比值、以及是否出现滑移来判断),并在 WBC 的摩擦锥约束里用估计值而非标称值;控制策略上降低切向力需求(缩短步长、增大落脚频率、改用更多足支撑);感知侧用足端滑移检测(编码器速度与 IMU 推算的实际运动不一致、力矩异常)触发反应式调整。更激进的做法是学习一个残差策略在经典控制之上补偿,但要保证它有边界与安全回退。

状态估计:IMU 与编码器融合、漂移检测。 足式状态估计的难点是接触导致的非连续运动学约束与 IMU 的积分漂移。常见架构是「IMU 预积分做高频姿态与速度估计 + 腿部运动学(关节编码器 + 正向运动学)提供低频位置/速度观测 + 接触状态判断哪些腿可信」,用误差状态卡尔曼滤波(ESKF)或不变 EKF 融合;姿态也常用互补滤波(陀螺高频、加速度计/磁力计低频)作为轻量方案,但对动态加速度敏感,快速运动时会引入姿态偏差,所以专业方案会给加速度计观测加运动门控。漂移的检测手段包括:静止检测(陀螺偏置在线估计,注意只在确认静止时更新)、与视觉/激光或外部动捕的一致性检查、以及开环积分与腿部里程计之间的残差监控;补偿主要靠在线零偏偏置估计、接触约束修正(支撑腿速度应为零)、以及引入外部绝对观测。要强调可观测性:只靠 IMU + 编码器无法长期约束位置,必须接受「位置漂移由外部传感器兜」的事实。

足端力估计与无传感器的接触力推断。 有力传感器时,控制上通常做导纳/阻抗控制:以期望接触力为目标,用传感器反馈构成闭环,能精确控制落地冲击与支撑力分配。没有力传感器时靠模型与电流估计:关节力矩 = 电机电流 × 力矩常数(考虑减速比与传动效率),再通过雅可比把关节力矩映射到足端力(τ = Jᵀ F,反解 F = (Jᵀ)⁻¹τ 或其伪逆/最小二乘形式),精度受摩擦、效率、以及关节加速度项影响,通常要做摩擦辨识与温度补偿。更稳的做法是只估计「是否接触」与「合力大致方向」而不追求精确三维力:用腿部动力学残差(期望加速度与实际加速度的差)、关节力矩与运动学一致性来判断接触事件,配合广义动量观测器估计外力。工程上要注意三点:标定(力矩常数、零偏、重力补偿)、滤波(力信号噪声大,需要低通但会引入相位延迟,影响阻抗控制的稳定性)、以及故障检测(传感器卡死/漂移时的降级策略)。

摔倒保护、单腿失效与仿真验证。 摔倒检测用多来源交叉判断更可靠:姿态角超阈值(俯仰/横滚超过安全范围)、质心高度骤降、足端接触力异常(本应支撑的腿无接触)、以及 MPC 求解连续失败或跟踪误差发散。检测到后的保护动作要有优先级:先停止激进运动(速度指令归零)、再主动收缩腿部与降低质心、必要时切断电机使能或进入阻尼模式以减小冲击,同时上报状态。单腿失效的容错可以从三个层面讲:静态层面用剩余腿寻找可行支撑多边形(三足或对角站立);动态层面降低速度、增大支撑时间、用身体的俯仰/横滚产生补偿力(例如后腿失效时前腿抬起以把质心移回支撑区);任务层面直接降级为「原地稳定 + 请求人工干预」也是合格答案,因为不该为了炫技冒翻倒风险。仿真验证上,MuJoCo/Isaac 适合接触与并行训练,Gazebo 偏系统集成;电机模型标定是最关键的 Sim2Real 环节,做法是把电机当成「力矩常数 × 电流 + 摩擦项 + 延迟」的模型,用台架实验(阶跃指令下的力矩/速度响应)辨识摩擦与延迟参数,再把总线周期与计算延迟显式建模进仿真。真机站不稳时按「接触与摩擦、电机模型与延迟、传感器标定、控制器参数与频率」的顺序排查,同时先降到静态站立与单腿测试缩小范围。

评估指标、能耗、可观测性与团队搭建。 步态评估要分层:稳定性(是否摔倒、姿态与速度的收敛性、扰动恢复时间)、运动性能(速度跟踪误差、转向能力、越障高度)、效率(单位距离能耗、CO₂ 估算法即机械功与电功之比)、以及鲁棒性(不同地面、负载、传感器故障下的表现)。能耗优化路径:减少不必要的摆动与减速(低阻抗、利用被动动力学)、优化落脚点与步频(高频小步通常更耗能)、回收制动能量、以及降低电机铜损(工作点在效率最优区间)。可观测性上,足的日志要包含:时间戳、关节目标与实际(位置/速度/力矩)、IMU 原始与估计姿态、接触状态与估计力、状态机当前状态、MPC 求解耗时与是否可行、以及通信抖动;这些字段能区分「控制不稳」和「数据不同步」两类问题。线上排查顺序是「先看是否可复现(同一指令/地面)、再看日志里的时序与状态机状态、然后看 MPC 可行性、最后才是参数」。团队搭建的问题(怎么招人)建议按能力互补回答:实时系统与嵌入式、控制理论(MPC/WBC/优化)、状态估计与传感器融合、仿真与工具链、以及系统集成与测试;同时强调把「真机试验的流程与安全规范」当成一项独立能力,不能只靠个人英雄式的现场调试。

手撕带限幅的 PID。 标准实现是 u = Kp·e + Ki·∫e dt + Kd·de/dt,工程上要处理四件事。第一,积分限幅(anti-windup):积分项累加后要 clamp 到一个范围(按输出限幅与 Ki 反推,或直接对积分项 clamp),并且在输出饱和且误差符号与饱和方向一致时停止积分(条件积分法),否则大误差持续时会积到极大值,反向时迟迟退不出饱和。第二,输出限幅:最终输出 clamp 到执行器能力区间,并明确饱和时的返回(是只返回限幅值,还是带一个饱和标志供上层判断)。第三,微分项怎么实现:直接用 (e_k - e_{k-1})/dt 会被测量噪声放大,工程上要么对误差做低通后再微分,要么只对测量值微分(避免设定值阶跃时产生微分冲击),并可以对设定值加斜坡。第四,离散化与 dt 处理:用实际时间间隔而不是名义周期(控制周期抖动时按名义 dt 积分会产生偏差),并注意 dt 极小时的数值稳定性。附加可讲的点:积分分离(误差大时不积)、前馈补偿、以及输出变化率限制。写完后最好主动说明「参数怎么整定」——先 P 到临界振荡、再压比例加积分、最后加微分,并配合阶跃响应验证超调与调节时间。