宇树科技 运动控制二面:MPC/WBC 与状态估计
- 轮次
- 二面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 请你先做一个自我介绍,然后讲讲你在足式机器人运动控制方面做过什么。
- 你项目里的机器人是几足?自由度多少?用的什么电机?
- 关节控制用的什么?位置控制、速度控制还是力矩控制?
- 控制频率多少?和感知频率怎么对齐?
- 你用的什么步态?Trot、Walk 还是 Bound?
- 步态切换的时候怎么保证稳定?有没有状态机?
- MPC 你用过吗?预测时域多长?控制时域多长?
- MPC 的权重怎么调?状态权重和控制权重分别怎么设?
- 如果 MPC 求解太慢,你怎么优化?有没有用 OSQP?
- WBC 你了解吗?和 MPC 怎么配合?
- 如果地面摩擦系数变化,你怎么让机器人适应?
- 状态估计你怎么做的?用的什么滤波器?
- IMU 和关节编码器怎么融合?卡尔曼还是互补滤波?
- 如果 IMU 漂移,你怎么检测和补偿?
- 足端力控你怎么做的?有没有用力传感器?
- 如果没有力传感器,你怎么估计足端接触力?
- 摔倒检测你怎么做的?检测到之后怎么保护?
- 如果机器人单腿失效,你怎么让它继续走?
- 你怎么做仿真验证?用的什么仿真器?
- Sim2Real 你做过哪些工作?电机模型怎么标定?
- 如果仿真里能走但真机上站不稳,你怎么排查?
- 你怎么评估一个步态的好坏?指标有哪些?
- 能耗你关注吗?怎么优化?
- 如果让你设计一个四足机器人的全身控制框架,你会怎么分层?
- 感知、规划、控制三层怎么通信?延迟怎么控制?
- 你怎么做可观测性?关键日志记录哪些?
- 线上出问题怎么排查?先看什么?
- 你怎么控制成本?用的什么计算平台?
- 你怎么跟进足式机器人领域的最新进展?最近看了什么?
- 如果让你从零搭建一个运动控制团队,你会怎么招人?
- 反问:团队现在做的是哪款机器人?
- 手撕:实现一个简单的 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 到临界振荡、再压比例加积分、最后加微分,并配合阶跃响应验证超调与调节时间。