你有没有玩过“踩影子”游戏?太阳把你的影子投在地上,只要别人的脚踩上来,你就得赶紧躲开。其实你的身体里也藏着一个看不见的“影子”,它叫零力矩点(ZMP),是你整个重量压在地面上形成的“压力影子”。站立时,它落在两脚之间;走路时,它随着重心前后漂移。科学家发现了一条铁的规律:只要这个“影子”不跑出脚掌围成的安全区域,你就一定不会倒——这条规律,就是全世界双足机器人平衡控制的基石。 人形机器人走路为什么总是小心翼翼、膝盖微曲、步幅不大?因为电脑每一毫秒都在检查那个看不见的“重量影子”跑到哪里去了。这篇文章会带你从零开始搞懂:这个影子是什么、怎么算、怎么控制它,以及机器人在即将摔倒的那一刻,是怎么用“捕获点”理论迈出救命一步的。

岗位关联

零力矩点是双足机器人稳定性的核心判据,也是从传统机械臂控制走向具身智能的关键思维桥梁。AI 从业者理解 ZMP,才能真正读懂人形机器人步态规划与运动控制的底层逻辑。

目录
  1. 可视化演示
  2. ZMP概念:机器人的“重量影子”
  3. ZMP计算:给“重量影子”测坐标
  4. 线性倒立摆:把身体简化成扫把
  5. 预观控制:端着咖啡走路的智慧
  6. 捕获点理论:救命的那一步
  7. 工程实践:把“踩影子”装进机器人
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

演示双足步行机器人零力矩点ZMP平衡判据:ZMP计算方法、支撑多边形与预观控制策略,保证行走稳定性。

本节配有交互动效(进入视口后自动加载,约 3KB)。

ZMP计算 质心 ZMP ZMP=(Σp·f)/Σf 零力矩点由受力分布确定

ZMP概念:机器人的“重量影子”

小时候玩的踩影子游戏,其实藏着机器人平衡的秘密。太阳照着你,影子投在地面上;你的重量压着地面,同样会形成一个“压力影子”——地面把你的重量反弹回来,所有反弹力的集中作用点,就是零力矩点(ZMP,Zero Moment Point)。名字听着吓人,但“零力矩”和“影子”一样朴素:在这个点上,地面反力不会让你的身体绕水平轴转动。人也好,机器人也好,能不能站稳,就看这个影子落在哪里。

ZMP 理论最早由南斯拉夫学者 Vukobratović 于 1968 年提出,是双足机器人研究史上最重要的概念之一。它的精确定义是:地面反作用力的合力在地面上的作用点,在该点处,地面反力产生的水平力矩为零。注意,ZMP 并不等于重心在脚下的投影——只有在静止不动时两者才重合。一旦你开始加速,重心投影是一个位置,而压力影子会“跑”到另一个位置。

支撑多边形(Support Polygon)是判断稳定性的关键参照系:双脚站立时,它是两脚接触点围成的最大的凸多边形区域;单脚站立时,它退化为脚掌本身的形状。ZMP 平衡判据极其直观:

回到踩影子的比喻:机器人站得稳不稳,跟人玩踩影子游戏完全是一个道理。只不过人靠本能,机器人靠公式——它每时每刻都在心里计算:“我的重量影子现在落在哪里?有没有跑出脚掌的边界?”边界之内是安全,边界之外就是摔倒。

pzmp∈Ωsupport\displaystyle p_{zmp} \in \Omega_{support}
公式说明:$\Omega_{support}$ 是足底接触点围成的凸包区域(安全区),$p_{zmp}$ 是零力矩点。只要重量影子落在安全区内部,机器人整体就不会绕脚踝翻转。
  1. $p_{zmp}$(零力矩点)地面反作用力的合力作用点,也是全身重量压在地面上的“等效落点”。
    pzmp=∑mi(z¨i+g)xi−∑mix¨izi∑mi(z¨i+g)\displaystyle p_{zmp} = \frac{\sum m_i (\ddot{z}_i + g) x_i - \sum m_i \ddot{x}_i z_i}{\sum m_i (\ddot{z}_i + g)}
  2. $\in$(属于)在数学里表示“落在某个集合内部”。影子的位置必须被限定在安全区里才算合格。
    ∈\displaystyle \in
  3. $\Omega_{support}$(支撑多边形)所有脚底与地面接触点围成的凸多边形,是机器人脚下的“安全领地”。
    Ωsupport=Conv(接触点1,接触点2,…,接触点n)\displaystyle \Omega_{support} = \text{Conv}(\text{接触点}_1, \text{接触点}_2, \ldots, \text{接触点}_n)

ZMP计算:给“重量影子”测坐标

你知道影子很重要,但怎么知道影子具体在哪?光靠感觉不够,得用尺子量。人体有几十个关节、几百块肌肉,想精确定位“重量影子”,得把身体拆成一个一个的小块,每个小块都有质量、有位置、有加速度,把它们全部加在一起。

把人体视为 $n$ 个刚性连杆的集合,每个连杆 $i$ 有质量 $m_i$、质心位置 $(x_i, y_i, z_i)$ 和加速度 $(\ddot{x}_i, \ddot{y}_i, \ddot{z}_i)$。将这些惯性力和重力对地面上某一点求矩,令水平力矩为零,解出的那个点就是 ZMP——这就是 ZMP 的力学定义:合力矩为零的点。

完整公式考虑每个连杆的转动惯量,计算量很大。工程中通常采用简化形式:当机器人站在水平地面上、且忽略各关节转动惯量时,ZMP 的二维坐标可以表示为:

好比量影子时,你不能只盯着头顶的太阳,还得考虑你正在往前跑——跑得越急,影子的“实际落点”就越偏离你脚下的中垂线。有了这个坐标公式,机器人就知道自己的影子偏了几厘米,这偏出来的几厘米,就是平衡控制要对付的核心误差。

px=xcom−zcomgx¨com\displaystyle p_x = x_{com} - \frac{z_{com}}{g}\ddot{x}_{com}
  1. $x_{com}$(质心水平位置)整体重心的水平坐标,是全身所有连杆质量的加权平均位置。
    xcom=∑mixi∑mi\displaystyle x_{com} = \frac{\sum m_i x_i}{\sum m_i}
  2. $z_{com}$(质心高度)整体重心离地面的垂直距离。它像一个“杠杆臂”,决定了加速度对 ZMP 偏移的影响程度。
    zcom=∑mizi∑mi\displaystyle z_{com} = \frac{\sum m_i z_i}{\sum m_i}
  3. $\ddot{x}_{com}$(质心水平加速度)质心在水平方向上加速的快慢。你往前冲得越急,影子偏离就越大。
    x¨com=d2xcomdt2\displaystyle \ddot{x}_{com} = \frac{d^2 x_{com}}{dt^2}
  4. $-\frac{z_{com}}{g}\ddot{x}_{com}$(加速度修正项)当质心向前加速时,ZMP 反而向后偏移;急停时 ZMP 又向前跑。这个“负号”揭示了一个反直觉的事实:影子并不总是跟着重心走。
    px−xcom=−zcomgx¨com\displaystyle p_x - x_{com} = -\frac{z_{com}}{g}\ddot{x}_{com}

线性倒立摆:把身体简化成扫把

想精确算出全身影子的位置,需要考虑几十个关节,计算量惊人。但如果把机器人想成一杆立在手掌上的扫把呢?杆的顶部有个重锤(质心),底部是你的手掌(支撑点)。只要手掌不断移动,让扫把保持不倒,这个简化模型就抓住了平衡问题的精髓。

这个模型就是线性倒立摆(Linear Inverted Pendulum Model,LIPM)。机器人被简化为一个位于质心处的点质量,腿部被看作无质量的伸缩杆,并约束质心在一个恒定高度 $z_c$ 的平面上运动。虽然极度简化,但它精确抓住了双足平衡中最主要的矛盾——质心水平运动与 ZMP 之间的关系。

在 LIPM 下,ZMP 与质心运动满足一个极为简洁的微分方程:

这个方程很优美:质心加速度等于一个“弹簧力”,弹簧的刚度由自然频率 $\omega_0$ 决定,而 $\omega_0$ 只和质心高度 $z_c$ 相关。

这个方程就像倒立的扫把立在手掌上:手掌(ZMP)必须始终跟着扫把头跑。扫把头往左倒,手掌就要快速移过去接住;移得慢了,倒得就快。真正的机器人操控“手掌”的方式是迈步和扭转脚踝,让 ZMP 自己移动,进而导演质心的运动轨迹。

x¨com=ω02 (xcom−pzmp),ω0=gzc\displaystyle \ddot{x}_{com} = \omega_0^2\, (x_{com} - p_{zmp}), \quad \omega_0 = \sqrt{\frac{g}{z_c}}
  1. $\ddot{x}_{com}$(质心加速度)质心水平方向加速的快慢,直接决定机器人往前倒还是往后倒的趋势。
    x¨com=d2xcomdt2\displaystyle \ddot{x}_{com} = \frac{d^2 x_{com}}{dt^2}
  2. $\omega_0^2$(自然频率平方)$\omega_0 = \sqrt{g / z_c}$。质心越低、重力越大,这个“弹簧”越硬,身体越容易快速回正。
    ω0=gzc\displaystyle \omega_0 = \sqrt{\frac{g}{z_c}}
  3. $(x_{com} - p_{zmp})$(位置差)质心与 ZMP 的水平偏差。偏差为正说明质心在 ZMP 前方,身体前倾,加速度为正,继续前倒。
    xcom−pzmp>0⇒前倾趋势\displaystyle x_{com} - p_{zmp} > 0 \Rightarrow \text{前倾趋势}
  4. 方程整体(动力学本质)给定一个位置差,加速度立刻确定。这个方程没有时间项,意味着 ZMP 一旦给定,质心的“命运”就完全决定了。
    x¨com−ω02xcom=−ω02pzmp\displaystyle \ddot{x}_{com} - \omega_0^2 x_{com} = -\omega_0^2 p_{zmp}

预观控制:端着咖啡走路的智慧

你端着一杯滚烫的咖啡走过人流,眼睛不是盯着杯子,而是看着前方两三米的路,提前规划好每一步落脚点,遇到台阶提前抬脚,看到人群提前绕行。如果等咖啡洒了才反应,一切都晚了。预观控制(Preview Control)就是给机器人装上这样一双“向前看”的眼睛。

ZMP 平衡控制面临一个根本难题:质心运动与 ZMP 互相耦合,传感器测到的 ZMP 误差已经反映了人体位置偏了,等发现误差再纠正,往往来不及。预观控制的核心思想是:把未来 $N$ 步的参考 ZMP 轨迹(由步态规划器给出)提前“喂”给控制器,让控制器以最优方式预先调整质心的加速度,使实际 ZMP 逼近未来的参考值。

预观控制的优化目标通常写成:

其中 $u(k)$ 是质心加速度控制量,$w$ 是控制能量权重。控制器每一步都在求解这个最优问题。

这个逻辑就像端咖啡时,眼睛扫向未来几米的路径,大脑自动规划每一小步该怎么落,而不是死死盯着杯子里的液面。提前看到台阶,你就提前抬脚;预观控制让机器人也拥有了这种“提前量”——这就是它比普通反馈控制高明的原因。

min⁡u∑k=0N∥pzmp(k)−pzmpref(k)∥2+w∑k=0N∥u(k)∥2\displaystyle \min_{u} \sum_{k=0}^{N} \left\| p_{zmp}(k) - p_{zmp}^{ref}(k) \right\|^2 + w \sum_{k=0}^{N} \| u(k) \|^2
  1. $\min_u$(最小化控制量)在所有可能的质心加速度控制序列中,挑一个让总代价最小的。
    u∗=arg⁡min⁡uJ(u)\displaystyle u^* = \arg\min_u J(u)
  2. $\sum_{k=0}^{N}$(未来窗口求和)把当前时刻到未来第 $N$ 步的每一步代价都累加起来——“向前看”的视野就体现在这个求和上限 $N$ 里。
    ∑k=0N=第0步+第1步+⋯+第N步\displaystyle \sum_{k=0}^{N} = \text{第0步}+\text{第1步}+\cdots+\text{第N步}
  3. $\left\| p_{zmp}(k) - p_{zmp}^{ref}(k) \right\|^2$(ZMP 跟踪误差平方)每一步实际 ZMP 与参考轨迹的偏离平方。偏离越远,惩罚越重。
    ∥pzmp(k)−pzmpref(k)∥2\displaystyle \| p_{zmp}(k) - p_{zmp}^{ref}(k) \|^2
  4. $w \sum \| u(k) \|^2$(控制能量惩罚)$w$ 是权重系数。加速度太大会让电机发热、动作僵硬,加一项惩罚让控制“温柔”一些,在省力与精准之间取折中。
    w∑k=0N∥u(k)∥2\displaystyle w \sum_{k=0}^{N} \| u(k) \|^2

捕获点理论:救命的那一步

玩踩影子游戏时,如果对方突然加速冲过来,你本能地会朝某个方向猛跨一大步,而且这一步踩下去,你神奇地就站稳了。这一脚落向的位置,就是“捕获点”(Capture Point)告诉你的。

捕获点理论回答一个紧急问题:机器人当前质心位置和速度已知,如果它能在某个方向跨出一步,使新支撑点(ZMP)瞬间移到某个位置,然后站着不动就能恢复平衡,那个位置就是捕获点。它最早由 Pratt 等人提出,是 ZMP 理论最重要的补充——ZMP 回答“现在稳不稳”,捕获点回答“怎么迈一步才稳”。

在线性倒立摆模型下,捕获点有极其简洁的闭合解:

注意,捕获点 $\xi \neq x_{com}$:它不是质心在地面上的投影,而是投影加上一个速度修正项。

捕获点和 ZMP 的关系,就像“急救方案”与“日常体检”:ZMP 是平时每时每刻的平衡判据,必须落在支撑多边形内;捕获点是在身体即将失控时告诉你“往哪儿踩一脚就能起死回生”的救命稻草。两者一日常、一应急,共同构成了完整的双足稳定性理论。

ξ=xcom+x˙comω0,ω0=gzc\displaystyle \xi = x_{com} + \frac{\dot{x}_{com}}{\omega_0}, \quad \omega_0 = \sqrt{\frac{g}{z_c}}
  1. $\xi$(捕获点)机器人必须把 ZMP 移到的目标位置,也就是应急一步的落脚点。
    ξ=xcom+x˙comω0\displaystyle \xi = x_{com} + \frac{\dot{x}_{com}}{\omega_0}
  2. $x_{com}$(质心位置项)当前质心在地面上的投影,是捕获点的基准位置。
    xcom\displaystyle x_{com}
  3. $\dot{x}_{com} / \omega_0$(速度修正项)$\dot{x}_{com}$ 是质心水平速度。当身体向前冲(速度为正),捕获点要落在质心前方更远处,给冲刺的身体留出“刹车距离”。
    x˙comω0\displaystyle \frac{\dot{x}_{com}}{\omega_0}
  4. 两项相加的组合意义速度越快,捕获点越远。这就是为什么你被绊到时会不自觉地朝前猛跨一大步——那不是慌乱,而是身体在精确计算捕获点。
    ξ−xcom=x˙comω0\displaystyle \xi - x_{com} = \frac{\dot{x}_{com}}{\omega_0}

工程实践:把“踩影子”装进机器人

理念懂了,怎么落地?就好比你学会了踩影子的各种技巧,现在要把这套技巧教给一个没有本能、只有代码的机器人——每一步都需要算法和硬件的精密配合。

工程上,ZMP 平衡不是孤立的算法,而是一条完整的流水线:步态规划器生成参考 ZMP 轨迹 → 预观控制器把参考轨迹转化为质心运动指令 → 逆运动学把质心指令分配到各关节角度 → 力矩控制器驱动关节电机。与此同时,惯性测量单元(IMU)和脚底力传感器实时反馈机器人真实的姿态和 ZMP 位置,整个系统形成闭环。

关节层控制通常使用 PD 控制或计算力矩法。以踝关节为例,平衡控制力矩为:

真实机器人中,“踩影子”不是一句话,而是一套组合拳:大脑(步态规划器)决定影子该在哪,躯干(预观控制器)决定身体怎么动,脚腕(关节控制器)完成具体发力,传感器则随时报告影子的真实位置。任何一环失灵,影子就会悄悄滑出安全区——机器人的那一跤,就是这么摔的。

τankle=Kp (pzmpref−pzmp)+Kd (p˙zmpref−p˙zmp)\displaystyle \tau_{ankle} = K_p\,(p_{zmp}^{ref} - p_{zmp}) + K_d\,(\dot{p}_{zmp}^{ref} - \dot{p}_{zmp})
  1. $\tau_{ankle}$(踝关节力矩)让机器人踝部转动的力矩,相当于人用脚腕去“够”那个即将跑偏的影子。
    τankle=Kp e+Kd e˙\displaystyle \tau_{ankle} = K_p\,e + K_d\,\dot{e}
  2. $(p_{zmp}^{ref} - p_{zmp})$(ZMP 位置误差)期望 ZMP 与实际 ZMP 之差。偏差越大,说明影子偏离预期越远,需要施加越大的纠正力矩。
    ep=pzmpref−pzmp\displaystyle e_p = p_{zmp}^{ref} - p_{zmp}
  3. $K_p$(刚度增益)相当于弹簧的硬度。$K_p$ 越大响应越快,但太大会引起振荡。
    Kp>0\displaystyle K_p > 0
  4. $K_d(\dot{p}_{zmp}^{ref} - \dot{p}_{zmp})$(阻尼项)抵抗 ZMP 移动速度的“阻尼感”,用来抑制振荡,让动作平滑。
    ed=p˙zmpref−p˙zmp\displaystyle e_d = \dot{p}_{zmp}^{ref} - \dot{p}_{zmp}

AI 应用场景

人形机器人步态控制研发

阶段:机器人控制与仿真部署

解决的问题:人形机器人双足行走极易摔倒,传统手工调参依赖大量物理实验,成本高、周期长、风险大。基于 ZMP 的预观控制让工程师可以在仿真环境中先生成并验证参考 ZMP 轨迹,再部署到真实机器人,大幅缩短开发周期。

具体案例:在优必选 Walker 等双足机器人的步态研发中,工程师为每一段步态预先计算参考 ZMP 轨迹,控制器以数百赫兹频率实时跟踪,配合足底力传感器判断 ZMP 是否越界,最终实现了稳定行走、上下台阶和抗扰动站立。类似方法也是本田 ASIMO 等经典双足机器人的核心步态控制方案。

动力外骨骼助行系统

阶段:智能控制系统设计与实时决策

解决的问题:外骨骼机器人需要根据穿戴者的重心变化实时调整支撑力,若控制不当会摔倒,甚至危害用户健康。利用 ZMP 作为安全判据,系统持续监控穿戴者与设备整体的压力中心,当 ZMP 漂移到支撑边界时及时触发辅助力矩。

具体案例:康复外骨骼在鞋底布置力传感器阵列,实时估算用户身体当前的 ZMP 位置,当检测到 ZMP 逼近支撑多边形边缘时,髋膝电机在几十毫秒内输出补偿力矩,帮助老年人或下肢无力患者保持平衡并安全行走。

足式机器人应急平衡模块

阶段:实时感知与应急决策

解决的问题:机器人在复杂地形或受到碰撞扰动时,需要快速判断“往哪跨一步才能站住”。捕获点理论为应急步态提供了解析解,让机器人在几十毫秒内计算出最佳落足点。

具体案例:在 RoboCup 类人机器人足球赛中,机器人被对手撞歪后,控制程序一帧内计算捕获点位置,并朝该方向快速跨出应急步,在约 0.3 秒内恢复平衡,随后继续投入比赛——这一“救命一步”正是捕获点理论的典型工程落地。

Python 演示

python63 行
"""ZMP平衡控制模拟器: 线性倒立摆 + 预观控制 + 捕获点""" import numpy as np  class LinearInvertedPendulum:    """线性倒立摆: 将机器人简化为质心加无质量腿"""     def __init__(self, z_c=0.9, G=9.81, dt=0.02):        self.z_c = z_c              # 质心高度 (米)        self.g = G                  # 重力加速度 (米/秒^2)        self.dt = dt                # 仿真步长 (秒)        self.omega = np.sqrt(G / z_c)  # 模型自然频率        self.x = 0.0                # 质心水平位置 (米)        self.v = 0.0                # 质心水平速度 (米/秒)        self.p_zmp = 0.0            # 实际ZMP位置 (米)        self.support = 0.15         # 支撑多边形半宽 (米)     def compute_acc(self, p_ref, kp=4.0, kd=1.5):        """预观控制(PD形式): 根据参考ZMP求质心加速度"""        err = p_ref - self.p_zmp    # 跟踪误差: 参考与实际的差        return kp * err - kd * self.v  # 比例加阻尼     def step(self, p_ref):        """推进一个仿真步: 更新状态并重算ZMP"""        a = self.compute_acc(p_ref)        self.p_zmp = self.x - (self.z_c / self.g) * a        self.v += a * self.dt        self.x += self.v * self.dt        return self.x, self.p_zmp     def capture_point(self):        """捕获点: 能站定并恢复平衡的落点"""        return self.x + self.v / self.omega     def is_stable(self):        """判断当前是否稳定: ZMP落在支撑多边形内"""        return -self.support <= self.p_zmp <= self.support  def main():    print("=" * 52)    print("ZMP平衡控制仿真 (线性倒立摆模型)")    print("=" * 52)    robot = LinearInvertedPendulum()    hit = False    for k in range(400):        if k == 80 and not hit:            robot.v += 0.12        # 第80步施加外部冲击            hit = True        robot.step(p_ref=0.0)      # 参考ZMP固定在原点        if k % 50 == 0:            cp = robot.capture_point()            tag = "稳定" if robot.is_stable() else "失稳!"            print(f"t={k * robot.dt:5.1f}s | 质心={robot.x:+.3f}m | "                  f"ZMP={robot.p_zmp:+.3f}m | 捕获点={cp:+.3f}m | {tag}")    print("=" * 52)    result = "站立成功" if robot.is_stable() else "摔倒"    print(f"400步仿真结束, 机器人最终{result}.")  if __name__ == "__main__":    main()
目的:用一个线性倒立摆模型模拟人形机器人站立平衡,在受到外部冲击后通过预观控制(PD 形式)让 ZMP 始终保持在支撑多边形内,并实时计算捕获点位置。
  1. self.omega = np.sqrt(G / z_c)模型的自然频率,决定了系统这个“弹簧”的松紧程度,直接进入捕获点公式。
  2. err = p_ref - self.p_zmp预观控制的第一步:算出期望 ZMP 与实际 ZMP 的偏差。
  3. return kp * err - kd * self.vPD 控制核心:比例项拉回偏差,阻尼项抑制振荡。
  4. self.p_zmp = self.x - (self.z_c / self.g) * a由质心状态反推实际 ZMP,是整个模拟的核心逆公式。
  5. return self.x + self.v / self.omega捕获点公式:位置加上速度修正项,速度越快落点越远。
  6. if k == 80 and not hit:在第 80 步注入冲量,模拟外人推了机器人一把。

常见误区

误区“ZMP 不就是重心往下投到地面的影子吗?把机器人重心竖直投影到地面,那个点就是 ZMP。”

正解重心投影与 ZMP 只有在机器人完全静止(各关节加速度为零)时才重合。只要身体有加速度——比如起步、急停、转弯——ZMP 就会偏离重心投影,偏差量等于 $\frac{z_{com}}{g}\ddot{x}_{com}$。就像跑步时你身体的“压力中心”比“重心投影”先一步移动,两者并不总在同一竖直线上。

为何常见:静力学直觉太强。我们平时站立不动时,ZMP 确实等于重心投影,教材也总从静态平衡引入,让人误以为动态时也成立。

误区“只要 ZMP 在脚掌范围内,机器人就绝对稳定,永远不会倒。”

正解ZMP 判据只保证机器人在准静态意义下不会绕支撑边缘翻转,它不保证动态稳定——比如质心速度极大时,此刻 ZMP 虽然还在支撑多边形内,但下一秒就会冲出边界。这就是为什么还需要捕获点理论和模型预测控制来提供动态层面的保障。ZMP 条件是必要不充分条件。

为何常见:教材通常只展示静态判据的几何解释(影子落在安全区),容易让人把“必要条件”误当成“充分条件”。

误区“零力矩点,名字这么吓人,肯定是极其复杂的数学工具,非专业人士不可能理解。”

正解它确实描述了“该点处水平力矩为零”的力学性质,但通俗理解并不难:它只是地面反力的合力等效作用点。把全身重量想象成一股压向地面的压力,这股压力的“落点”就是 ZMP。为什么水平力矩为零?因为如果地面反力还有个水平方向的翻转作用,身体就会翻倒——ZMP 刻画的是“地面能不能稳稳托住你”。

为何常见:学术术语的常见问题——名字听起来吓人,定义本身却很简单朴素。

误区“我做的是四足机器人或机械臂,ZMP 跟我没关系。”

正解只要是“足式支撑 + 地面行走”的系统,都需要考虑支撑区域内的 ZMP 稳定性。四足机器人每条腿的脚底也有 ZMP,只是四个支撑点让支撑多边形更大、容错更高。机械臂底座若装有力传感器,同样要防止整体 ZMP 超出底座支撑范围导致倾倒。ZMP 是一个普适的稳定性判据,不是双足机器人的专利。

为何常见:教材总是拿双足行走举例,初学者容易把 ZMP 当作“双足专有”的概念。

面试题

Q1. ZMP 的英文全称是?

单选题 · easy

  • A.Zero Moment Point← 正确答案
  • B.Zero Momentum Point
  • C.Zero Motion Point
  • D.Zoned Movement Point

答案:A。ZMP 是 Zero Moment Point(零力矩点),指地面反力合力作用点。B 选项多了一个字母 m,是“动量”的意思,概念完全不同;C 和 D 都是干扰项。

Q2. ZMP 在什么条件下与重心投影重合?

单选题 · easy

  • A.机器人加速前进时
  • B.机器人完全静止时← 正确答案
  • C.机器人匀速转弯时
  • D.机器人跳跃离地时

答案:B。只有当机器人静止(所有加速度为零)时,ZMP 才等于重心在水平地面的投影。加速前进、转弯、跳跃都会产生水平加速度,使 ZMP 偏离重心投影,这正是 ZMP 与重心两个概念最关键的区别。

Q3. 支撑多边形指的是什么?

单选题 · easy

  • A.机器人重心与地面的垂直投影点
  • B.双脚接触点围成的凸多边形区域← 正确答案
  • C.机器人手臂可触及的整个范围
  • D.关节角度极限构成的区域

答案:B。支撑多边形是脚底与地面所有接触点围成的凸包区域,是 ZMP 平衡判据中的“安全区”。A 是一个点不是区域,C 属于工作空间概念,D 是关节限位概念,都与稳定支撑无关。

Q4. 线性倒立摆模型的自然频率表达式是?

单选题 · mid

  • A.ω = sqrt(g/z_c)← 正确答案
  • B.ω = sqrt(g·z_c)
  • C.ω = sqrt(z_c/g)
  • D.ω = sqrt(2g/z_c)

答案:A。线性倒立摆的自然频率 ω₀ = √(g/z_c),其中 g 是重力加速度,z_c 是质心恒定高度。质心越低,自然频率越大,系统“弹簧”越硬,恢复平衡越快。B 量纲不对,C 分子分母倒置,D 多了系数 2。

Q5. 预观控制相比传统反馈控制的突出优势是?

单选题 · mid

  • A.不需要额外传感器支持
  • B.能提前利用未来参考轨迹← 正确答案
  • C.计算量严格为零开销
  • D.完全消除了重力影响

答案:B。预观控制的核心是把未来 N 步的参考 ZMP 轨迹提前纳入控制律,让控制器“向前看”而不是等误差出现才反应,类似端咖啡时提前看路。它仍然需要传感器(A 错),计算量不为零(C 错),也无法消除重力(D 错)。

Q6. 捕获点的准确定义是?

单选题 · hard

  • A.地面反力合力的作用中心
  • B.质心速度恰好为零的位置
  • C.跨出一步就能静止恢复的落点← 正确答案
  • D.支撑多边形的几何质心

答案:C。捕获点是机器人当前状态下,迈出一步使新的 ZMP 落于此点后,不继续迈步也能完全静止恢复平衡的位置。A 是 ZMP 的定义,B 是瞬时速度零点的描述,D 是支撑区域的几何中心,都不是捕获点的力学含义。

Q7. 下列哪些方法可用于 ZMP 平衡控制?

多选题 · mid

  • A.预观控制策略← 正确答案
  • B.踝关节 PD 力矩← 正确答案
  • C.捕获点应急步态← 正确答案
  • D.增大电机功率

答案:ABC。预观控制生成最优质心加速度轨迹,踝关节 PD 控制提供关节层力矩,捕获点应急步态在失稳时挽救平衡,三者都是成熟方法。盲目增大电机功率不改变 ZMP 位置,反而可能加剧振荡。

Q8. 关于 ZMP 与捕获点的关系,下列说法正确的是?

多选题 · mid

  • A.捕获点总是位于 ZMP 前方
  • B.ZMP 用于日常平衡稳定性判断← 正确答案
  • C.两者在质心静止时位置重合← 正确答案
  • D.捕获点与 ZMP 完全无关

答案:BC。ZMP 是日常行走时每时每刻的稳定性判据,捕获点是应急步态的落点指引,两者相辅相成。质心静止(速度为零)时,捕获点等于质心投影;若此时 ZMP 也在质心投影处,则二者重合。A 错误,速度方向为负时捕获点在 ZMP 后方;D 明显错误。

Q9. 当 ZMP 超出支撑多边形边界时,机器人会?

单选题 · hard

  • A.自动恢复正常运动状态
  • B.绕支撑边缘翻转然后倒地← 正确答案
  • C.质心高度自动降低稳定
  • D.关节锁定保持当前姿态

答案:B。ZMP 越过支撑边界意味着地面反力无法再提供抵抗翻转的力矩,身体会绕脚踝边缘开始翻转,若不及时迈步修正,最终必然倒地。ZMP 判据的本质就是预测这个翻转临界点,所以“影子出界=要摔”。

Q10. 在 ZMP 的工程实现中,通常需要哪些传感器的配合?

多选题 · extreme

  • A.足底力传感器阵列← 正确答案
  • B.惯性测量单元 IMU← 正确答案
  • C.关节角度编码器← 正确答案
  • D.环境激光雷达

答案:ABC。足底力传感器直接测量地面反力以计算实际 ZMP,IMU 提供姿态和加速度用于状态估计,关节编码器反馈关节角度以支撑动力学解算。激光雷达主要用于环境感知与导航,与 ZMP 平衡的直接计算无关。