宇树科技 四足机器人算法工程师 面试题精选
企业背景:宇树科技(Unitree)是全球四足机器人领域的领军企业,产品线覆盖消费级(Go2)和行业级(B2、Aliengo)。面试风格注重算法理论与工程实践的深度结合,考察候选人从数学推导到代码落地的全链路能力。
一、正逆运动学(2题)
问题1:请推导四足机器人单腿的逆运动学解。以宇树机器人典型的3自由度腿部构型(髋关节侧摆HAA、髋关节前摆HFE、膝关节KFE)为例,已知足端期望位置,如何得到三个关节角度?
考察点:运动学建模、几何法/解析法求解、多解选择、奇异位形
答案:
首先你得说清楚四足机器人的单腿长什么样。宇树的腿基本是 "3自由度" 构型——髋关节有个侧摆(HAA,绕X轴转),然后髋关节前摆(HFE,绕Y轴转),再连到膝关节(KFE,也绕Y轴转)。说白了就是一个侧摆加一个"大腿+小腿"的平面连杆。
正向推导逻辑:
已知三个关节角 θ₁(HAA)、θ₂(HFE)、θ₃(KFE),还有大腿长度 L₁、小腿长度 L₂,足端在腿基坐标系下的位置就能写出来:
x = L₁ * sin(θ₂) + L₂ * sin(θ₂ + θ₃) y = -L₁ * cos(θ₂) - L₂ * cos(θ₂ + θ₃) (假设侧摆角θ₁=0时的简化情况)
逆运动学就是反过来——已知足端位置 (x, y, z),求 θ₁、θ₂、θ₃。典型解法分两步:
-
先求 θ₁(侧摆角):这其实是最简单的,因为侧摆直接决定了足端在Y方向的偏移。如果基坐标系原点在髋关节,那足端坐标里的 y 分量跟侧摆角的几何关系可以直接写出:
θ₁ = atan2(y, z) (注意符号看具体坐标系定义)
-
再解平面二连杆(θ₂ 和 θ₃):把问题投影到侧摆后的新平面上,这就变成一个标准的平面二连杆逆运动学问题了。余弦定理直接上:
cos(θ₃) = (x² + z'² - L₁² - L₂²) / (2 L₁ L₂)
θ₃ = ±acos(cos(θ₃))
注意这里的 ± 对应 "膝朝外" 还是 "膝朝内"——宇树机器人通常选膝朝外(负角),因为这样运动范围大、不容易自碰撞。
然后求 θ₂:
θ₂ = atan2(z', x) - atan2(L₂ sin(θ₃), L₁ + L₂ cos(θ₃))
面试官会追问的坑:
-
多解怎么选?标准答案是:选让膝盖弯曲方向符合机器人机械限位的那一组。宇树Go2的膝关节范围大概在 -150° 到 0° 之间,所以选 θ₃ 为负的解。
-
奇异位形:当足端刚好在髋关节正下方(x=0, z=-L₁-L₂),膝完全伸直(θ₃=0),这时候雅可比矩阵会降秩,微分运动学失效。你需要在控制里避开这种位形。
-
有没有用解析解而不是数值解?为什么? 解析解闭式表达式计算快(微秒级),数值解如IK求解器需要迭代(毫秒级),四足机器人的控制频率通常在 400Hz-1kHz,每步都要算4条腿的IK,所以必须用解析解。
问题2:什么是四足机器人的正运动学与雅可比矩阵?雅可比矩阵在四足控制中有什么具体用途?
考察点:正运动学、雅可比矩阵、力-力矩映射、奇异性分析
答案:
正运动学就是"给关节角,算足端位置和姿态"。跟上面说的反过来,把四个关节角度往里一套,通过齐次变换矩阵连乘,得到足端在机身坐标系或世界坐标系下的位姿。这玩意是IK验证的基础——你算出来的IK对不对,拿FK跑一遍对照一下就知道了。
雅可比矩阵 J 是关节空间到任务空间速度的线性映射:
v_foot = J(q) · dq/dt
v_foot 是足端速度(3维线性速度 + 3维角速度),dq/dt是关节速度(3维)。
雅可比在四足控制中的核心用途:
第一,力控——这个最重要。四足机器人MPC算出的是"足端期望的地面反作用力",但电机只吃力矩指令。怎么把力转成关节力矩?靠虚功原理:
τ = Jᵀ · F
也就是说,你想在足端施加某个力 F,就用雅可比转置矩阵左乘这个力,得到关节力矩 τ。这就是"力控"的核心数学基础。宇树机器人底层跑的就是这个——上层MPC输出足底力,经过 Jᵀ 映射到12个关节力矩。
第二,逆速度运动学。如果想控制足端按某个速度轨迹运动(比如摆动腿规划),可以反过来求关节速度:
dq/dt = J⁻¹ · v_desired
但 J 不一定是方阵(3×3对于单腿来说正好是方阵),而且有奇异情况,所以实际常用伪逆 J⁺。
第三,奇异性检测。计算 det(J) 或 condition number(J),判断当前腿是否接近奇异位形。如果接近奇异,你算出来的关节力矩会变得巨大,实际电机根本发不出来。所以好的四足控制器会在接近奇异时主动调整姿态或者切换控制策略。
面试官可能会问:对于单腿3自由度,J是3×3方阵,什么情况下会奇异?答:当膝关节完全伸直(θ₃=0)或者大腿水平时,J的列向量线性相关,det(J)=0,对应足端在某些方向上失去运动能力。好的四足控制器会保证关节始终远离极限位置。
二、步态生成与摆动腿规划(3题)
问题3:四足机器人的典型步态有哪些?请对比 Trot(对角小跑)、Pace(同侧步)、Bound(跳跃步)和 Gallop(奔跑步)的相位关系、稳定性和适用场景。宇树的机器人通常使用哪几种步态?
考察点:步态分类、相位关系、占空比、稳定性分析、场景匹配
答案:
四足步态的核心变量是相位和占空比(duty factor β)。β=0.5 表示腿在空中和在地上的时间一样长。按速度从慢到快排:
1. Crawl/Walk(爬行步)
-
β≈0.75,任何时候至少三条腿着地
-
静态稳定——质心投影始终在支撑多边形内
-
速度慢但稳,适合复杂地形
-
相位顺序:LF→RF→LR→RR(或类似顺序)
2. Trot(对角小跑) ⭐ 宇树最常用
-
β=0.5,对角腿成对运动:(LF+RR)同时摆动,(RF+LR)同时支撑
-
动态稳定——两条腿支撑时质心在支撑对角线之外,靠惯性维持平衡
-
速度适中(1-3 m/s),效率和稳定性trade-off最好
-
宇树Go2的默认步态就是Trot
3. Pace(同侧步)
-
β=0.5,同侧腿成对:(LF+LR)同时摆动,(RF+RR)同时支撑
-
侧向稳定性差,容易左右摇晃
-
用在窄通道等特殊场景,宇树一般不默认用这个
4. Bound(跳跃步)
-
β≈0.3-0.4,前双腿和后双腿分别成对
-
前腿先触地→后腿触地→腾空期
-
速度快(3-5 m/s),适合冲刺和跨越障碍
-
高速时有明显腾空期,难度大
5. Gallop(奔跑步)
-
β<0.5,四条腿各有相位,有腾空期
-
最快的步态,但最复杂,四条腿相位各不相同
-
宇树机器人上较少使用,主要用于高速场景展示
面试要突出宇树的特点:宇树Go2在实际控制中主要用 Trot,因为它的能量效率和动态稳定性的综合表现最好。B2等工业机型会增加 Crawl 用于复杂地形。步态切换通常是基于速度的分段策略——低速用 Crawl,中速切 Trot,高速尝试 Bound。
补充点加分:实际工程中,步态切换是个难点。从Trot切到Bound时,所有腿的相位要连续变化,不能跳变,否则机器人会一个趔趄摔倒。常见的做法是用一个相位调制器,让占空比和相位偏移按速度线性过渡。
问题4:请详细介绍摆动腿的轨迹规划。为什么不能直接用直线插值?常用的轨迹曲线有哪些?如何保证足端落地时的冲击最小化?
考察点:轨迹规划、连续可微性、冲击控制、贝塞尔曲线/样条
答案:
为什么不能直线走?
如果你让足端从A点直线走到B点,在A点启动时速度和加速度突变(瞬间从0跳到某个速度),在B点落地时也是急停——这会产生冲击力骤变,造成:1)电机电流尖峰;2)机身抖动;3)落地噪声大;4)机身不稳甚至摔倒。
所以核心要求是:足端的位置、速度和加速度全程连续,尤其是起点和终点的速度和加速度都归零。
常用的摆动腿轨迹:
1. 摆线轨迹(Cycloid)——最经典
x = S * (t/T - sin(2πt/T) / (2π)) // S是步长,T是摆动周期 z = H * (1 - cos(2πt/T)) / 2 // H是抬腿高度
好处是位置、速度、加速度全部连续,起点终点速度和加速度自然为0。而且曲线像个拱形——起腿和落腿都平缓,中间抬得最高。宇树的很多控制方案底层就在用这个。
2. 贝塞尔曲线(Bezier)——可调节性更强
用5阶贝塞尔曲线(需要6个控制点),可以独立调节抬腿高度、入地角、离地角。比如你想让足端摆得快一点但落地轻一点,可以调整控制点位置。适用于地形适应性更强的场景。
3. 三次/五次多项式插值
简单粗暴,但加速度可能在连接点不连续。五次多项式可以保证加速度连续。
冲击最小化的策略:
-
落地速度为零:终点速度和加速度必须归零,这是底线要求
-
接地角度控制:足端轨迹末端切线方向最好与地面平行,避免"铲地"
-
触地检测后主动柔顺:如果用MPC或者RL,落地后立刻切换到力控模式,让足端"软着陆"。宇树的机器人有足底力传感器或者关节力矩传感器,检测到触地后会把足端速度控制目标设为零,力矩切换到阻抗控制
-
分阶段控制:摆动期用位置控制(跟踪轨迹),触地瞬间切换成力控(JᵀF映射),避免硬着陆反弹
加分点:实际宇树面试中可能会问——如果是跑动中,足端落地时有水平速度怎么办?答案是:通过调整步长与机身速度的匹配关系,让足端相对地面的速度在触地瞬间接近零(Raibert的"足部放置法则")。
问题5:请解释 Raibert 足部放置法则(Foot Placement Rule)在四足机器人上的原理和应用。它对 Trot 步态的稳定性有什么帮助?
考察点:Raibert控制理论、步态稳定性、足端位置规划、落足点自适应
答案:
Raibert 是腿足机器人的祖师爷,他提出的核心思想是:把腿足运动解耦成三个独立控制问题——身体高度、前进速度、身体姿态。足部放置法则是解决"前进速度控制"的关键。
基本原理:
假设你的四足机器人正在以速度 v_swing 前进,在摆动腿触地前,足端应该放在哪里?Raibert给出的公式极其简单优雅:
x_foot = x_hip + 0.5 * v_swing * T_stance + k * (v_swing - v_desired)
-
x_foot: 落足点位置
-
x_hip: 髋关节在水平方向的投影位置
-
v_swing: 当前实际速度
-
T_stance: 支撑相时长
-
k: 校正增益
这公式的理解方式特别直观:你的脚应该落在身体前面什么位置,取决于你跑多快。
-
前半部分 (0.5 v_swing T_stance) 是一个"前馈"项——如果你匀速跑,脚落在身体前方半个步长的地方正好
-
后半部分是"反馈"项——如果你当前速度比期望速度慢,脚就多往前伸一点,下一次摆动会让你减速?不对,实际上这正好反过来!
最关键的逻辑(面试常考):足端如果落在身体更前面的位置,在支撑相时地面反作用力会给身体提供一个向后的力矩,从而减速。如果落得靠后,推力会让你加速。所以:
-
速度太快 → 落得靠前 → 减速
-
速度太慢 → 落得靠后 → 加速
-
速度正好 → 落在中性位置 → 匀速
在 Trot 步态中的应用:
Trot 步态是两条对角腿同时摆动。Raibert法则对每条腿独立施加即可,但因为同时对侧腿落地,需要用"虚拟腿"(Virtual Leg)的概念来处理——把一对对角腿看作一条虚拟腿,它们的合力效果决定机身运动。
在宇树机器人的工程实践中,Raibert法则仍然广泛用于落足点规划的第一步,然后加上地形约束(比如不能落在坑里或石头上),再做微调。
面试官扩展提问:如果地面是倾斜的怎么处理?答:要把地面坡度投影到前进方向上,修正 x_foot 的计算,在上坡时足端比平地稍微靠前,下坡时靠后。
三、MPC控制(2题)
问题6:请解释四足机器人上的单刚体模型预测控制(SRB-MPC)。为什么可以用单刚体模型来近似整个机器人?状态空间如何搭建?QP问题的核心是什么?
考察点:MPC理论、单刚体动力学、模型简化、凸优化、QP求解
答案:
为什么可以用单刚体模型?
这是一个"该简化时必须简化"的问题。四足机器人有12个关节 + 1个机身 = 13个刚体,全动力学模型有 78 个状态量(每个刚体6维位姿+6维速度)。在线跑MPC,你算10步前瞻步,这优化变量就爆炸了,算一次就要几百毫秒——机器人早摔了。
关键假设:四条腿的质量相对于机身来说很小(占总量不到20%),而且腿的惯性效应主要在摆动期起作用。MPC负责的是支撑相的控制,这时候腿主要传递力,腿本身的惯性对机身运动影响可以忽略。
所以状态量直接简化成:
x = [p_com, θ, v_com, ω] ∈ ℝ¹²
-
p_com:机身质心位置(3维)
-
θ:机身姿态(3维,通常用欧拉角,实际上内部用旋转矩阵)
-
v_com:质心线速度
-
ω:机身角速度
控制输入:
u = [f₁, f₂, f₃, f₄] ∈ ℝ¹²
四条腿足端的地面反作用力,每条腿3维力。
动力学方程(牛顿-欧拉):
m · dv_com/dt = Σfᵢ + mg (质心平动) I · dω/dt = Σ(rᵢ × fᵢ) (机身转动)
rᵢ 是从质心到第i个足端接触点的向量。
离散化成状态空间:
x_{k+1} = A · x_k + B · u_k
QP问题的cost function:
min Σ (x_k - x_ref)ᵀQ(x_k - x_ref) + u_kᵀR u_k
约束条件:
-
摩擦锥约束(足底力在摩擦锥内,防止打滑)
-
足底力幅值上下限
-
接触力只能推不能拉(地面不会吸住你的脚)
-
机身姿态/高度/速度的软约束
面试官会追问的关键点:
-
Q和R怎么调?Q大表示跟踪精度优先,R大力矩优先。一般Q中对姿态误差权重大一些(机身稳住比位置准确更重要),R中垂向力权重小一些(支撑重力是基本需求)。
-
摩擦锥通常用4边形或16边形近似,变成线性约束,这样QP还能保持凸性。
-
MPC频率:宇树上大概跑30-50Hz(步长20-30ms,预测10步约200ms),VMC可以跑500Hz以上,但MPC的预测能力让它在扰动和地形变化时表现更好。
问题7:MPC+WBC(模型预测控制+全身控制)是目前四足机器人的主流控制框架。请解释为什么需要两层控制?WBC在MPC之后具体做什么?MPC的什么局限让WBC必须上场?
考察点:分层控制架构、WBC原理、任务优先级、力-运动分解
答案:
为什么需要两层?
直接说核心矛盾:MPC的模型太粗糙,但WBC可以精细兜底。
MPC用的单刚体模型忽略了关节动力学、腿的惯性、柔性等。它算出来的足底力 f 是"理想情况下的力",但真正到执行层面,你需要:
-
把力 f 分配到具体的12个关节力矩上(Jᵀ 映射)
-
同时保证摆动腿精确跟踪规划轨迹
-
处理关节限位、速度限幅、力矩饱和
这就是WBC上场的时候了。
WBC具体做什么?
WBC是一个多任务优先级优化器。它接收:
-
MPC算出来的足底力参考值
-
操作者/规划器给的机身姿态指令
-
摆动腿期望轨迹
然后求解一个带优先级的QP问题,输出:12个关节的力矩 τ 和机身加速度。
任务优先级从高到低通常是:
优先级1:接触约束——着地腿的足端速度必须为0(不能在地面上滑来滑去),这是等式约束
优先级2:摆动腿任务——摆动腿的足端跟踪期望轨迹(比如贝塞尔曲线),这是高优先级任务
优先级3:机身姿态跟踪——跟踪MPC给出的机身姿态期望
优先级4:关节限位——如果某个关节快碰到限位了,投影一个虚拟力矩别让它撞墙
优先级5:力矩最小化——在满足前面所有任务的前提下,力矩越小越好,省电
MPC做不到的事,WBC来解决:
-
非线性的关节约束:MPC里没法加"关节不能超过150度"这种非线性约束(因为模型是线性的),WBC可以
-
腿的惯性补偿:MPC当腿没有质量,但实际腿有。WBC通过浮动机体动力学模型把这部分补回来
-
力矩饱和后的优雅退化:如果某个电机达到力矩上限,WBC会按优先级把低优先级的任务"砍掉"来优先保证高优先级任务。这叫"task hierarchy",是普通MPC没有的能力
-
切换瞬态:腿从摆动切换到支撑时,WBC确保接触力平缓过渡,不会出现力跳变
宇树实际方案:一般是MPC在30-50Hz算足底力,WBC在200-500Hz做力矩分配和任务协调。
四、状态估计(1题)
问题8:四足机器人的状态估计(机身位姿/速度/足端接触)是控制的基石。请解释常用的估计框架。为什么接触检测(contact detection)在四足机器人中尤为关键?请介绍一种你熟悉的接触检测算法。
考察点:状态估计、卡尔曼滤波/因子图、接触检测、IMU+运动学融合
答案:
四足机器人状态估计的核心挑战:
轮式机器人打个滑,靠轮子里程计还能凑合一会儿。四足机器人每一步都在"打滑"——足端触地瞬间速度为零,支撑期间理论上速度为零,但实际地面松软、脚会滑动。所以你的状态估计器不能像轮式机器人那样用地面的里程计直接积分,必须利用腿的运动学 + IMU + 接触状态来做融合。
主流框架:接触增强的扩展卡尔曼滤波(Contact-Aided EKF / InEKF)
大多数四足机器人(包括宇树的方案)采用以下传感器融合策略:
-
IMU(加速度+陀螺仪):提供高频(1kHz)的姿态和加速度观测,但有积分漂移
-
关节编码器:通过正运动学算出每条腿足端相对于机身的位置(低频但准确)
-
接触检测:判断哪条腿着地,着地腿的足端速度为零,这是一个"虚拟观测"
核心思想:当某条腿着地时,它的足端相对地面速度为零,这相当于给状态估计器提供了一个"地面锚点",从而抑制IMU的漂移。
具体来说,InEKF(不变扩展卡尔曼滤波)是目前最先进的方案:
-
预积分阶段:IMU数据 → 预测机身位姿和速度
-
更新阶段:足端运动学 + 接触状态 → 计算机身位姿的观测误差,做修正
-
不变性(Invariant)性质保证收敛性更好,特别是姿态估计
接触检测(Contact Detection)算法:
这是四足专用的难题。因为没有传感器直接告诉你"脚触地了"(或者有但是噪声大)。
最实用的方法是基于关节力矩/电流的阈值法:
if τ_z / (m·g/4) > threshold_contact: contact_flag = True else: contact_flag = False
判断用到支撑腿的垂直地面反作用力有多大。但阈值法的问题在于硬地面和软地毯上的触地特征完全不同,阈值不好设。
进阶方案:用概率模型检测接触。比如基于HMM(隐马尔可夫模型)的方法——将机器人的运动建模为在不同接触模式之间切换的随机过程。观察到关节编码器、IMU、力矩数据后,推断当前最可能处于哪个接触状态。ANYmal 和 MIT Cheetah 上都有好论文。
另一个实际工程做法是结合足端速度和加速度的残差来判断:如果运动学说足端速度为零,但IMU说机身还在动,那大概率触地了;反之运动学算出来足端速度很大,但机身实际没怎么加速,说明腿正在空中自由摆动。
面试官可能会问:如果足底打滑怎么办?答:打滑时触地假设失效,足端速度不为零,导致状态估计漂移。解决方法包括检测滑动(足端位置残差超过阈值就降低该腿的观测权重),或者用鲁棒代价函数(如 Huber Loss)来抑制异常值的影响。
五、强化学习运动控制(2题)
问题9:深度强化学习在四足机器人运动控制中的应用近年取得了巨大进展。请简述一个典型的RL训练pipeline:从仿真环境搭建、状态/动作空间设计、奖励函数构建到sim-to-real迁移。Domain Randomization在其中的作用是什么?
考察点:RL在四足中的应用范式、MDP设计、Sim-to-Real、Domain Randomization
答案:
典型 pipeline(以宇树机器人为例):
第一步:仿真环境搭建
-
常用MuJoCo、Isaac Gym、RaiSim
-
导入宇树Go2/A1的URDF模型(包含质量、惯性、碰撞网格)
-
最关键的是执行器模型——不是简单的理想电机,而是从真实机器人上标定出来的执行器动力学模型(包含摩擦力、阻尼、延时等)。这步做不好,sim-to-real必然失败
第二步:观测空间
观测 = [机身姿态(四元数), 机身角速度, 机身线加速度,
关节位置(12维), 关节速度(12维),
足端接触状态(4维),
命令(期望速度/方向)]
有时候也用历史帧(stacked observations),形成部分可观测的POMDP。
第三步:动作空间
常见两种设计:
-
关节位置增量式:输出 Δq,电机层用PD追踪 → 训练稳定,宇树常用
-
关节力矩直出:输出 τ → 上限高但训练难度大
第四步:奖励函数
r_total = w₁·r_speed(跟得上期望速度)
+ w₂·r_energy(力矩小,省电)
+ w₃·r_alive(别摔倒)
+ w₄·r_smooth(动作平滑)
+ w₅·r_foot_clearance(抬腿够高,别绊倒)
+ w₆·r_orientation(机身姿态保持水平)
这是"调reward的痛苦之路"——大部分人在这能调一周。
第五步:训练算法
PPO(Proximal Policy Optimization)是目前四足运动控制的默认选择。稳定、好调、适用于连续动作空间。
第六步:Sim-to-Real 迁移(决定成败的关键)
仿真里走得稳稳当当的policy拿到真实机器人上,95%的情况是一步都走不了。为什么?Reality Gap(现实鸿沟)。解决思路以Domain Randomization(域随机化)为核心:
Domain Randomization具体随机化哪些参数:
| 参数 | 随机范围 | 为什么要随机 |
| 机身质量 | ±20% | 装上电池/负载后重量会变 |
| 地面摩擦力 | 0.3 - 2.0 | 瓷砖vs地毯vs泥地完全不一样 |
| 电机阻尼 | ±30% | 温度不同电机特性变化 |
| 传感器噪声 | 高斯噪声 | 真实传感器永远有噪声 |
| 延时 | 1-5步控制周期 | 系统延时真实存在 |
| 地形高度 | ±5cm随机凹凸 | 真实地面不平的 |
| 外力扰动 | 随机推一把 | 有人突然碰一下机器人 |
核心哲学:如果你在仿真里见过各种各样稀奇古怪的情况,真实世界对policy来说就"没那么离谱"了。换句话说,你在仿真里看到的极端情况,覆盖了真实世界中的各种不确定性。
宇树的具体工程实践:宇树的RL方案通常先在Isaac Gym里训练(利用GPU并行加速,几千个environment并行跑),训练大约1-2小时收敛。然后zero-shot部署到真实Go2上。如果效果不好,需要调整randomization的范围或者加入更多真实数据的system identification。
问题10:在四足机器人RL控制中,如何处理不同步态之间的切换?如何让学出来的策略自然过渡到不同的运动模式(如从走到跑、从平地道爬楼梯)?请介绍基于Phase的工作或基于Encoder的工作。
考察点:RL步态生成、隐式/显式步态调制、contact schedule、地形感知
答案:
核心难点:RL学出来的策略如果没有任何步态先验,它可能学出一个很奇怪的"狗刨式"步态——四条腿乱动但也走得动——但效率低、难看、而且不好控制速度切换。
方法一:基于相位(Phase-Based)——显式步态调制
给策略加一个相位输入,用正弦波表示每条腿当前处于摆动还是支撑:
φᵢ(t) = (t/T + phase_offsetᵢ) mod 2π
-
φ ∈ [0, π): 摆动期
-
φ ∈ [π, 2π): 支撑期
不同步态对应不同的 phase_offset:
-
Trot: LF=0°, RR=0°, RF=π, LR=π
-
Pace: LF=0°, LR=0°, RF=π, RR=π
-
Bound: LF=0°, RF=0°, LR=π, RR=π
策略网络输入这个相位信息,它自然知道这条腿现在应该抬还是应该撑。改变相位偏移和频率,就能平滑切换步态和速度。
这个方案的代表工作:ANYmal的RL控制器 "Learning to Walk in Minutes Using CPG-Inspired RL"。
方法二:作为隐式的接触调度
不直接把相位给策略,而是在奖励函数里隐式指定预期接触模式。比如在trot模式下,奖励函数惩罚非对角腿同时着地或同时摆动。策略会在训练中自己学会"走对角"。这个方法更灵活——到了复杂地形,策略可以自主偏离相位,临时变成"自由步态"来适应。
步态平滑切换:
从Trot加速到Bound,不能瞬间跳变。工程做法:
-
Phase渐变:让相位偏移和频率在几个步长内线性过渡
-
Teacher-Student蒸馏:先训练一个教师策略让它学会按照连续速度指令做步态切换,然后用学生策略蒸馏模仿
-
HRL(分层强化学习):高层策略输出步态模式和速度,低层策略负责执行
地形适应的RL策略(宇树实际场景):
从平地到爬楼梯,RL策略需要感知输入:
-
高度图(height map):地形高度栅格图,用深度相机或LiDAR获取
-
足端可达性:策略判断当前足端期望位置是否落到地形凹陷处,如果是则调整落足点
典型做法是感知编码器(用CNN或Transformer处理高度图)加上地形注意力机制,让策略学会"看路走路"。RMA(Rapid Motor Adaptation)方案甚至可以在域随机化训练中隐式学出地形适应能力,不用显式感知。
宇树的RL实践:宇树有自研的RL训练平台,Go2支持用户做RL运动控制开发。面试中最好能展示你用过Isaac Gym训练过四足策略,并且了解从训练到部署到真机的完整链路(包括ONNX导出、部署到宇树的SDK接口等)。
六、场景应用题(1题)
问题11:假设你要让宇树Go2机器人从平地走上30度的斜坡,然后通过一段碎石路面,最后爬上三级台阶(每级15cm高)。请描述你的完整技术方案:包括步态选择、状态估计调整、控制策略切换、感知融合。你会选择传统控制方法(MPC+WBC)还是RL方法?为什么?
考察点:系统工程能力、任务分解、方案对比、算法选型、实际部署
答案:
分阶段分析:
阶段一:平地 → 斜坡过渡
-
步态:Trot(β=0.5),但入坡时降速(0.5 m/s)
-
控制调整:前馈项加入地面倾斜补偿,MPC中的重力方向要投影到倾斜地面上,摩擦锥约束要适应斜坡(需要更大的摩擦系数裕度)
-
姿态:机身滚动和俯仰保持与斜坡平行?还是保持水平?答案是机身保持水平可以让足端有更大的运动范围,抬腿更高,不容易磕地
-
落足点:Raibert法则要加上坡度修正——上坡时足端比平地略微靠前
阶段二:碎石路面
-
步态:切换到 Crawl(β=0.75),任何时候保证三条腿触地,静态稳定
-
接触检测:碎石上踩下去可能打滑,接触检测要更灵敏(降低触地阈值),检测到打滑后立刻调整位置
-
MPC摩擦锥:摩擦系数估计要保守(从μ=0.8降到μ=0.4),否则MPC算出来的足底力会超出地面能提供的摩擦力,导致打滑
-
状态估计:接触噪声大,InEKF里降低接触观测的权重,更多依赖IMU预测
阶段三:爬台阶(15cm/级)
-
步态:低速 Crawl 或特殊爬梯步态,每次只抬一条腿
-
抬腿高度:从Trot的8cm抬高到20cm以上
-
落足点规划:需要用深度相机或LiDAR做地形感知,检测台阶的边缘和平面,把落足点规划到台阶平面中间,避免踩到边缘滑落
-
惯性前馈:爬台阶时机身重心转移大,前腿跨上台阶时后腿要提供足够的推力,MPC里的前馈项要补偿
控制方案选型:传统 vs RL
说实话,从实际工程效果来看:
复杂地形更推荐RL。原因是:
-
RL策略经过Domain Randomization训练后,对地面摩擦、坡度、障碍物高度等变化更鲁棒
-
传统MPC在碎石路面很难准确建模——每个石头形状不一样,MPC的简化模型误差大
-
RL可以学出"试探性踩踏"行为——脚轻轻探一下地面,发现不稳固就迅速调整,这是传统MPC难以编码的行为
但如果你必须用传统控制:
-
你需要精确的地形感知(高度图)
-
每个地形段手动调参(步态、MPC权重、抬腿高度等)
-
对碎石路段,最好的策略可能是快速通过减少单腿触地时间,而不是小心翼翼
完整系统框图(加分项):
地形感知(深度相机) → 高度图 → 地形分类器
↓
上层规划器(步态选择 + 速度指令 + 足端位置修正)
↓
MPC/WBC (30-50Hz 足底力优化) 或 RL Policy (50Hz 动作输出)
↓
底层力矩控制(JᵀF映射 + PD跟踪)
↓
电机执行 + 编码器/IMU反馈 → 状态估计 (InEKF)
↓
接触检测 → 更新状态估计 → 反馈到上层
面试中展示这种"端到端思考"的能力是宇树面试的加分项——他们不只看你会不会调一个MPC或跑一个RL算法,而是看你有没有能力把整个系统串起来考虑,理解每个模块在上了一个场景时各自需要做什么调整。
总结:宇树科技的四足机器人算法工程师面试,考察的不是单一的算法知识点,而是从"如何让一条腿动起来"到"如何在30度碎石坡上稳定行走"的全链路能力。扎实的运动学基础 + 前沿的控制架构理解 + 工程落地的务实思维,是在面试中脱颖而出最关键的三要素。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)