去年我帮朋友调试一台双足样机,上层接了一个当时刚火起来的开源大模型做任务规划。演示流程设计得很顺:让机器人去茶几上拿水杯,大模型把"走到茶几→伸手→抓取→返回"拆得清清楚楚,连避障路线都提前选好了。结果真机一上电,机器人站起来才迈出半步,髋关节就力矩报警,整个机身往右前方一歪,"哐当"一声摔在泡沫垫上。在场的人都不太愿意说话,因为这不是个例,而是目前人形机器人行业每天都在发生的事——大模型的大脑越来越聪明,但身体的稳定性还是小学生水平。
这个反差背后其实藏着一个真正值得聊的话题:大模型负责的"规划"和人形机器人需要的"站稳",本质上是两个不同层级的事。这篇文章我想从工程实操的视角,把"为什么大模型会规划、机器人还是站不稳"这件事拆开讲清楚,重点说说行业里正在用的"双层控制"架构到底是怎么设计的,以及如果你自己想做实验或复现,应该从哪里下手。
1. 大模型进场之后,机器人为什么还是"眼高手低"
1.1 大模型在机器人系统里的真实身位
很多人对大模型和机器人的关系有一个很自然的想象:大模型这么强,直接当作机器人的大脑,它说什么机器人执行什么,不就行了?实际上,目前业内对这件事的定位非常克制。大模型在机器人系统里扮演的是**"任务规划器"和"语义接口"**,负责把自然语言指令、视觉场景、常识推理转化成一段可执行的高层任务序列——比如"去厨房拿一个红色杯子"会被分解成"走到厨房→找到红色杯子→伸出右手→抓取→原路返回→放到餐桌"。这个过程确实是大模型的强项,因为它需要语言理解、物体识别、空间关系推理和常识判断。
但问题在于,这段任务序列传到机器人身体之后,接下来的事情大模型基本插不上手。机器人要站起来、保持平衡、迈步、落脚,每一步都涉及到实时的状态反馈、动力学计算和关节力矩控制,这些动作不是"想出来"的,而是"算出来+调出来"的。大模型做的规划是宏观的、离散的、慢节奏的;机器人身体需要的是微观的、连续的、快节奏的控制信号。两者之间天然存在一条巨大的鸿沟。
1.2 规划与执行之间差了几个数量级
我用一张表把这个差距摆出来,大家感受会更直接:
| 层级 | 典型周期 | 代表组件 | 核心作用 |
|---|---|---|---|
| 任务规划 | 秒级 | 大模型、语义地图、场景图 | 理解指令、拆解任务、生成宏观动作序列 |
| 轨迹规划 | 100毫秒级 | 步态规划器、路径规划器 | 生成可行的落脚点、参考轨迹 |
| 平衡控制 | 1~10毫秒级 | MPC、WBC、力控 | 把参考轨迹实时转化为关节力矩 |
| 关节伺服 | 0.1~1毫秒级 | 电流环、位置环 | 执行力矩指令并反馈状态 |
从这张表可以看得很清楚:大模型的响应周期是秒级,而机器人保持平衡需要的控制周期是毫秒级,两者之间差了两到三个数量级。这意味着,如果让大模型直接参与每一个关节力矩的决策,等它"想清楚"要输出什么力矩,机器人早就倒在地上两回了。
1.3 "会规划"和"会站稳"是两种完全不同的智能
我再打一个生活化的比方:一个围棋九段大师,能看清全局、算到后面几十步,你让他在棋盘上坐一整天都没有问题;但你要是突然推他一把,他照样站不稳。围棋需要的智能是运算和抽象,站不稳需要的智能是前庭觉、肌肉反射和身体协调——这两件事用的根本不是同一套系统。人形机器人也是同理,大模型解决的是"我知道接下来该做什么"的问题,而站稳解决的是"我怎么在重力、惯性、摩擦这些物理约束下不倒下"的问题。
所以结论比较反直觉但很实际:大模型越聪明,反而越暴露出底层运动控制的重要性。任务规划做得再精细,身体这个"执行器"跟不上,整个系统照样是废的。这也是为什么最近两年,人形机器人圈子里"双层控制"这个说法越来越流行。
2. "站不稳"的物理本质:每个关节都在对抗地心引力和自己
2.1 人形机器人本质上是一个高阶倒立摆
先说一个最简单的物理模型。一个直立的人形机器人,重心在身体上半部分,脚掌是唯一的支撑面,如果忽略关节和姿态控制,它在物理上就是一个倒立摆。倒立摆的特性大家都清楚:重心在支点上方,稍微偏离垂直位置一点,重力力矩就会让它加速倒向一边,而且这个不稳定是发散的——越倒越快,越倒越难救回来。
更麻烦的是,人形机器人不是一根杆子,而是由十几个甚至几十个关节串联起来的运动链。髋、膝、踝每个关节都有多轴自由度,下肢质量分布不均匀,大腿小腿之间的惯性耦合严重,再加上迈步时重心的移动和地面反作用力的变化,整个系统是一个高阶、非线性、强耦合的动力学系统。用教材里的话说,这就是一个"多刚体欠驱动系统"。欠驱动的意思是,脚底和地面接触的方式决定了你能施加多少力和力矩,很多控制意图根本没法直接落实,只能靠调整姿态和受力来间接实现。
2.2 静态稳定窗口小得可怜,动态稳定才是常态
人形机器人的脚掌面积和整个身高体重相比是很小的。波士顿动力Atlas的脚掌长度大概也就二十多厘米,而身高超过一米五。重心投影一旦超出这个"支撑多边形",理论上单靠静态支撑是不可能站住的,必须通过动态调节——比如踝关节蹬地、髋关节摆、迈步调整落脚点——把重心重新拉回支撑范围内。
这就引出一个关键概念:ZMP(零力矩点)。简单理解,ZMP就是地面反作用力的合力的作用点,它必须始终落在支撑多边形内部。一旦ZMP跑到了支撑脚边缘之外,脚掌就会离地翻转,机器人立马失去平衡。控制系统的核心任务之一,就是通过实时调整各关节力矩,保证ZMP始终被约束在安全区域里。
2.3 外部扰动留给控制系统的反应窗口极短
还有一个常常被忽略的问题:扰动窗口。人在行走时如果被推一下,大约有几百毫秒的时间来做出反应,这个时间足够神经系统调动肌肉反射。但对人形机器人来说,外部扰动的检测、状态估计刷新、控制指令计算、关节电机执行,这一整套闭环走完的时间预算往往只有几十到一百毫秒。等你把状态估计算完、MPC求解出来、力矩指令发到关节,机器人的姿态可能已经偏离到不可恢复的程度了。
这也是为什么真实环境站立的调试这么难。实验室地板上参数调得好好的,挪到水泥地、地毯、斜坡、瓷砖这类不同摩擦和硬度环境,全都得重新调。地面每软一点、滑一点,ZMP的约束条件就变一个样,底层控制器必须足够快、足够鲁棒,才能接住各种意外。
2.4 一个直观类比:想象你在真冰上穿着旱冰鞋
这节最后,我给大家一个能真正建立体感的类比。你想象自己穿着旱冰鞋站在真冰面上,脚底几乎没有摩擦,身体稍微前倾就会滑出去。这时候你的大脑在做的事情,本质上就是一个超高频的平衡控制器——每时每刻都在接收前庭觉、视觉、足底压力的信息,然后迅速调整全身几十块肌肉的张力,来维持重心。你之所以能做到,是因为你的神经反射延迟只有几十毫秒,并且肌肉可以持续输出精细的力控制。人形机器人的底层控制器,要模仿的恰恰就是这一套机制——只不过它没有上亿年的进化来调参数,只能用工程手段硬凑出来。
3. 双层控制的核心:上层想远,下层守稳
3.1 第一层:任务规划层,大模型的用武之地
"双层控制"里的第一层,就是我们前面反复提到的大模型任务规划层。在这一层里,大模型接收多模态的输入——自然语言指令、视觉图像、激光雷达点云、甚至语音——然后输出一个结构化的任务序列。这个序列不需要精细到每个关节角度,而是宏观的"动作描述",比如:
- 走到餐桌前,距离0.8米,朝向正前方;
- 伸出右手,末端目标坐标(x, y, z);
- 五指闭合,施加5N的抓取力;
- 收回右手,转身走向水槽;
- 松开手指,返回初始站立姿态。
这些描述在工程上通常被转成高层宏命令,传给下一层控制模块。任务规划层的更新频率很低,一秒一次甚至几秒一次都行,因为它处理的是"下一步做什么"这个慢决策问题。这一层的核心是语义正确性、推理合理性和任务可达性——至于每一步怎么落地、怎么保持平衡,它不负责。
3.2 第二层:实时运动控制层,真正的稳定担当
第二层是真正决定机器人"站不站得稳"的层级。它通常由几个模块协同工作:
- 状态估计器:融合IMU(惯性测量单元)、关节编码器、足底力传感器数据,通过扩展卡尔曼滤波(EKF)等算法估计机身的姿态、角速度、线速度、位置,以及各关节角度和角速度。这个模块是整个控制闭环的"眼睛",估计不准,后面全都白搭。
- 模型预测控制器(MPC):基于机器人的动力学模型,滚动求解一个带约束的最优控制问题。常见做法是先把机器人简化成质心模型或线性倒立摆模型(LIPM),预测未来几百毫秒到一两秒的状态,同时优化落脚点和质心轨迹。MPC的更新频率一般在几十到几百赫兹。
- 全身控制器(WBC):在MPC给出参考质心轨迹和落脚点之后,WBC进一步把任务分配到全身各个关节,考虑关节限位、力矩上限、摩擦锥等约束,求解一个二次规划问题(QP),输出每个关节的目标力矩。WBC的频率更高,通常在1kHz左右。
- 关节伺服环:最底层,直接驱动电机输出力矩,同时做电流闭环和摩擦力补偿,频率在几kHz。
这里面的核心思想就是把"稳定"这个大问题分层拆解:MPC负责"接下来怎么动才不倒",WBC负责"为了实现这个动,每个关节该怎么出力",伺服环负责"说好的力就一定给到"。每一层只关心自己那一级的事情,接口清晰,调试起来也方便——这也是双层架构最大的工程优势。
3.3 连接两层的关键:中间接口层
双层架构里最容易出问题的地方,其实不是顶层也不是底层,而是中间那一层接口。大模型输出的宏观任务序列怎么翻译成控制层能用的参考轨迹?这一步必须由"轨迹规划器"和"步态规划器"来完成。比如大模型说"走到餐桌前",轨迹规划器需要根据当前机器人姿态、地形、避障要求,生成一条具体的落脚点序列和质心轨迹,然后再交给MPC作为参考输入。
我见过不少项目在这地方踩坑:大模型输出的是高度抽象的描述,要么缺数值参数,要么参数范围和物理可行性对不上——比如指令一个身高1.5米的机器人迈出1米的大步,这种轨迹在MPC里直接因为约束不满足而优化失败。所以现在的做法是加一层**"可执行性校验"**:任何高层任务在传递下去之前,先用一个简化的运动学模型检查参数范围、关节限位、地面条件,不合格就退回给大模型重新规划。这套"先体检再执行"的思路,能省掉大量真机调试时间。
3.4 一个直观的伪代码流程
把上面的逻辑串起来,一套双层控制主循环大概长这样:
# 伪代码:双层控制主循环 while robot.is_alive(): # 上层:任务规划,低频执行,秒级 if task_plan_ready: task_seq = llm_plan(scene_graph, instruction) ref_trajectory = plan_trajectory(task_seq) # 落脚点+质心轨迹 # 下层:实时控制,高频执行,毫秒级 state = estimator.update(imu, joint_encoders, foot_forces) mpc_action = mpc.solve(state, ref_trajectory) # 参考质心运动/落脚点 joint_torque = wbc.solve(mpc_action, state) # 全身关节力矩 robot.send_torque_cmd(joint_torque) time.sleep(1.0 / CONTROL_FREQ) # 通常是1kHz注意这里的核心是异步、异构、不同频率:上层的输出不要求实时响应,只要在需要的时候给出参考即可;下层的每个周期都必须严格在预算时间内完成,任何一步超时都可能导致机器人失去平衡。很多初学的人在这个地方犯的最大错误,是拿单线程同步的思路去写机器人控制——上层一卡顿,下层也跟着停摆,机器人当然站不稳。
4. 为什么不干脆端到端?三个工程现实问题
4.1 延迟不对等:大脑再快也救不了身体的慢动作
有人会问:既然双层控制这么麻烦,为什么不干脆训练一个端到端的大模型,输入传感器数据,直接输出关节力矩?这样省掉中间所有环节不是更直接吗?这个问题我想了好一阵,也看过不少团队的尝试,结论是:端到端思路在特定任务上可以跑通,但目前很难作为通用方案落地,原因有三。
第一个原因就是延迟不对等。大模型的推理延迟通常几百毫秒到几秒,就算用蒸馏和量化压到几十毫秒,也和关节伺服需要的1kHz频率差了整整一个数量级。你可以让大模型在"作战指挥室"里做参谋,但不能让它在一线当单兵——信号传到前线的每一毫秒延迟,都可能决定你是稳住还是摔倒。这就像你开车的时候,处理突发情况的反射只需要几十毫秒,而如果每次操作都要先问一遍顾问团队,那事故早就发生了。
4.2 数据稀缺和Sim2Real鸿沟:端到端没那么多"喂"的料
第二个原因是数据。端到端强化学习的成功,比如OpenAI训练Dota机器人和围棋AI,前提是模拟环境里可以无限采样,而且每局胜负奖励非常清晰。但人形机器人在真实世界的交互数据是极其昂贵和稀缺的——遥操作采集一组高质量站立扰动数据,可能就要工程师在工位上耗一整天。而仿真环境虽然可以生成海量数据,但仿真和现实之间存在巨大的Sim2Real鸿沟:关节摩擦、电机延迟、地面形变、传感器噪声,这些细节在仿真里做得再逼真,迁移到真实机器人上依然会有性能下降。用域随机化可以缓解,但解决不了本质问题——你让大模型直接端到端学习所有这些物理细节,模型的容量、训练成本和调参难度都是指数级上升的。
4.3 安全与可解释性:摔坏了算谁的?
第三个原因可能被很多人忽略,但工程上非常重要:安全和可解释性。端到端模型是一个大黑盒,输入图像和关节状态,输出力矩。如果它在一个从来没见过的地面条件上做出了错误决策,工程师排查起来会非常困难——你不知道是感知的问题、模型泛化的问题,还是训练数据覆盖不够。但双层架构不一样,每一层都有明确的输入输出和可验证的约束条件。底层控制器如果Math Lim出了ZMP,或者某个关节力矩超限,报警信息可以直接指向具体模块,工程师能在几分钟内定位问题。这在真机调试阶段几乎是决定性的优势——人形机器人摔一次的成本可不低,能把问题锁在某个明确层级里,就是省真金白银。
5. 不造机器人,也能验证双层控制:仿真复现思路
5.1 环境选择与模型搭建
我知道大部分人没有一台人形机器人样机放在手边,但双层控制的核心思想完全可以用仿真环境验证。我用过的方案里,MuJoCo和Isaac Lab都值得推荐。MuJoCo的优势是轻量、物理引擎精度高、社区生态成熟,很多经典的双足控制实验结果都能在上面复现;Isaac Lab则更面向大规模并行强化学习,适合跑数据。如果你的目标只是理解分层思想,MuJoCo就够了,官方自带的Humanoid模型可以当起步。
具体做法很简单:先不要急着接大模型,而是在MuJoCo里把底层控制器跑通。先从"站桩"开始——让机器人保持直立姿态,给机体加各种方向的脉冲扰动,观察控制器能不能把它拉回来。这个过程你会非常直观地感受到我之前说的"扰动窗口只有几十毫秒"是什么意思:扰动力度稍微大一点,或者控制器更新频率稍微低一点,机器人就直接倒下去了。
5.2 底层控制的简化实现:从LQR到MPC
底层控制器的实现,我建议走一条由浅入深的路线。第一步,先忽略全身自由度,把机器人简化成单刚体或线性倒立摆模型,用**LQR(线性二次型调节器)**做姿态控制。LQR的思路是给状态偏差算一个最优反馈增益矩阵,虽然处理不了复杂约束,但用来理解"状态反馈+加权优化"这个控制思想完全够用。第二步,再换到MPC,加点"预测未来几步"的能力,你会发现同样的扰动下,MPC的响应明显更平滑,因为它在做优化之前就已经考虑了未来一段时间的演变。
MPC实现的时候有一个特别容易踩的坑:预测时域的长度。太短,优化来不及反应扰动;太长,计算量爆炸,在仿真里就是每个控制周期都超时,机器人动作一顿一顿的。我在试的时候,对一个简化双足模型,预测时域大概取0.5~1秒、控制步长10毫秒左右,效果比较平衡。这个参数在不同机器人上差异很大,核心思路是:在控制频率允许的前提下,预测时域能开多大开多大,但一定要保证实时性优先。
5.3 上层任务规划:用现成LLM做宏命令生成
底层控制跑稳之后,再接入上层大模型就安全多了。最省事的方案是直接用现成的开源语言模型,比如Qwen系列或Llama系列的本地部署版,通过API或本地推理接口给它发一句话指令,让它输出一段格式化的JSON动作序列。关键是给你的大模型写清楚格式约束,让它的输出可以被解析脚本直接消费,而不是自由发挥。
我自己的经验是,给大模型加这些约束非常有效:
- 指令格式固定为"动作类型+目标参数",例如"move_to": {"x": 0.8, "y": 0.0, "z": 0.0}
- 所有数值范围预先给出来,比如步幅不超过0.4米,手臂抬升高度不超过0.3米
- 明确告诉它哪些动作在当前地图中不可行,它就会自动重新规划任务序列
这一步能让大模型的输出从"听起来合理"变成"真正可执行"。不要小看这个约束工作,它往往是整个上层最容易出效果也最容易出问题的环节。
5.4 对接和测试:先验证接口,再验证能力
最后一步才是把两层接起来。我建议的测试路径是:先用脚本写死一段宏任务,验证底层MPC和WBC能跟踪参考轨迹;然后用大模型生成同一段宏任务,对比输出格式是否一致、参数是否出界;最后才放开让大模型自由发挥。每个阶段都最好留下日志,方便排查到底是哪一层的问题。
我在这个环节还会额外加一道"异常回退"逻辑:如果底层控制器检测到ZMP接近边界或者某个关节力矩饱和,就立刻放弃当前参考轨迹,切换回站立模式,同时向上层发送一条"当前任务不可执行,请重新规划"。这一步模仿的正是生物体里的"反射优先于意识"——大问题是你可以慢慢想,但身体安全问题不能等意识决策。
6. 从"站得住"到"走得好",剩下的难题和我的一些体会
6.1 动态行走的难度升级
老实说,能站住只是解决了人形机器人最基础的问题,接下来还有更难的:动态行走。站立时的情况相对简单,重心可以一直维持在支撑多边形附近;但走路时重心会不停地在左右脚之间切换,每一步都要经历"单脚支撑"的阶段,支撑多边形瞬间缩小到一只脚的大小,ZMP的约束收紧很多。
动态行走真正难的还不是"迈步",而是"衔接"。每一步末尾的状态会成为下一步的初始条件,任何一点的微小误差都会沿着步态序列累积放大。这也是为什么你看许多实验室的机器人,站着的时候四平八稳,一走路就歪歪扭扭——因为走路本质上是一个"不断主动制造失稳、再不断恢复稳定"的循环过程,每一步都是一个小的高难度动作。MPC在走路场景里要同时优化落脚点和质心轨迹,计算量比站立时大得多,对实时性的要求也更苛刻。
6.2 未来的方向:VLA、学习控制器和分层的融合
最近一两年行业里讨论得比较多的方向是VLA(Vision-Language-Action Model),也就是把视觉、语言和动作统一到一个模型里。这种模型确实能降低上层任务规划的复杂度,让机器人"看一眼就知道该怎么动",但它依然很难替代底层MPC和WBC——原因还是我们前面说的那三个工程问题:延迟、数据、安全。我的判断是,未来不是"分层架构被端到端取代",而是"大模型越来越聪明地调用底层控制能力"——顶层提出意图,底层保障执行,中间接口层继续承担翻译和校验的角色。强化学习出来的控制策略也会越来越多的和MPC做融合,让底层既拥有数据学习的灵活性,又保留物理模型的安全边界。
6.3 我的一点大实话
最后说点个人体验。我曾经带着一个很小的两自由度倒立摆项目去做实验,当时为了展示"智能化",给上层接了一个大模型,让它根据语音指令生成摆杆的参考轨迹。结果轨迹规划得确实漂亮,但一下到真机上,摆杆一直在抖——我折腾了两天,最后发现根本不是大模型的问题,而是底层控制频率没提上去,LQR算出来的力矩到执行端已经过时了。那次之后我彻底理解了一个道理:机器人系统的智商上限由上层的模型决定,但能力下限由底层的控制器决定。你上层的脑袋再灵光,只要身体还在打摆子,整个系统就仍然是不可用的。
如果你正准备入门这个方向,我的建议是:别一上来就追大模型,先把底层控制搞扎实。找一个开源的双足模型,把LQR、MPC、WBC这三件套在仿真里真正跑通,感受一下什么叫"扰动来了你得在几十毫秒内做出反应"。等你对底层的物理约束有了体感,再回头去接LLM,你会明白大模型那部分只是冰山一角——真正让机器人站住、站稳的,永远是那些看起来不那么酷、但每一毫秒都在坚守岗位的控制算法。这也是我写这篇文章最想传达的一件事。