双足机器人ZMP预观控制算法及代码实现

本文介绍了双足机器人行走控制中的ZMP预览控制算法,通过将机器人简化为桌子小车模型,结合三维线性倒立摆模型,提出了预览控制算法来精确跟踪ZMP轨迹,确保机器人稳定性。通过预览控制,可以在每个采样时间内预测未来的ZMP位置,实现平滑的COM轨迹。文章还对比了不同预览时间对轨迹的影响,并提供了Python代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1. 简介

本文的主要内容参考了Kajita等人2003年的论文,Biped Walking Pattern Generation by using Preview control of Zero-Moment Point 以及《仿人机器人》一书,算法的代码已开源,详见文末链接。

把双足机器人简化为一个桌子小车(Cart-Table)模型,会比较方便于处理ZMP问题。本算法提出了一种混合了ZMP和倒立摆模型的预观控制算法,可用于伺服跟踪ZMP的轨迹。基于预观控制算法,就算我们的仿真模型是简单的倒立摆模型,也可以解决更加复杂的双足机器人的动力学控制问题。

52ca9950cdd62669e5105ecd9b0bad3b.png

2. 双足机器人的动力学模型

2.1 三维线性倒立摆模型

如图所示,考虑在三维笛卡尔空间当中运动的三维线性倒立摆模型(3D-LIPM),该模型的绕其支点 转动,质心可以在一个虚拟的约束平面运动内运动。 所在的平面为水平地面, 轴竖直向上,与地面垂直,并且我们指定 的正方向为机器人前进的方向。

9ec61047ec5b49a82f0dba70182d671f.png

约束平面可使用该平面的法向量表示为 ,并且 轴与该平面的交点为 ,则对于约束平面来说:

如果约束平面是水平的,则有 ,此时,倒立摆模型的质心在该约束平面内的运动过程由下面的运动方程表示:

其中, 表示质心的质量, 表示重力加速度常数, 分别表示倒立摆模型绕轴和轴旋转的扭矩。即使对于约束平面非水平()的坡道步行过程,我们也可以为扭矩添加额外的约束来使得该动力学过程成立:

对于约束平面水平的情况,零力矩点(ZMP)的计算方式为:

其中, 表示ZMP的位置。将上述公式代入前面的运动方程中可以得到:

2.2 ZMP方程和桌子-小车模型

在前面的章节,我们把ZMP作为三维线性倒立摆的输入,用于计算质心的运动轨迹。从本节开始,为了控制ZMP的轨迹,我们需要把它作为控制系统的输出,因此将上个章节最后的那个公式重写为ZMP方程

上面这个方程在后文中将被多次提到,后面凡是使用ZMP方程的地方都是指这个方程。

桌子小车模型的示意图如下图所示:

e6c9fa2d65b77577120ce52453d46444.png


水平地面上的桌子表面有一个沿着桌面运动的小车,尽管桌脚的面积很小,桌子呈现头重脚轻的情况,容易倾倒。但我们可以控制小车在桌面上做加速运动,产生对应的加速度来获得桌子的瞬时平衡,此刻ZMP是在桌子支撑脚的范围内的。图中所示为沿着 方向运动的桌子小车模型,在三维环境中,我们还需要一个沿着 方向运动的桌子小车模型,情况是相似的,因此,这里我们以方向的桌子小车为例来进行分析。

由于我们要求绕ZMP点的力矩必须为零(否则会导致机器人翻倒),因此:

该公式表示小车产生的加速度等效到ZMP点的力矩作用要能抵消小车的质量收到重力作用后在ZMP点处产生的力矩作用,这样才能保证桌子是平衡的。并且,我们可以发现,这个公式与前面的ZMP方程是等价的。

3. 基于ZMP产生步行模式

我们的总体目标是要给定ZMP来求解质心的运动过程,前面的ZMP方程已经给出了ZMP点和质心运动之间的关系,求解这个微分方程可以使用快速傅里叶变换(FFT)在频域内解决,然后再使用FFT的逆变换得到质心的轨迹。这里我们将介绍另一种更加简单的方法。

首先,我们把质心水平加速度的微分定义为 :

把 当做ZMP方程的输入,我们可以把ZMP方程写作如下的系统状态方程

对于 方向来说,我们可以定义 来获取相似的结果。

利用上述公式我们把步态模式生成器构造为一个ZMP跟踪系统,如下图所示:

23b711f67ef1a1e17bb695e6aeae0d16.png

该系统可以生成COM的运动轨迹,同时ZMP可以跟踪预定义的参考位置。

除此之外,我们还需要考虑另一个问题,如下图所示:

c45d18f942b151028481efd20abfafa8.png


图中展示了在理想情况下,双足向前机器人迈出步长为的一步时ZMP和COM的运动轨迹。在第1.5秒的时候进行支撑腿的切换,切换时刻的前后ZMP的参考轨迹都保持不变,在切换时刻支撑腿由其中一条腿换做另一条腿进行支撑运动。在进行支撑腿切换的时刻,ZMP点有一个位置上的突变,COM的运动在此之前已经开始了,如图中Output箭头所指的位置。从前面的控制框图可以看出,我们必须要引入未来的信息来影响当前的状态。这是什么意思?也就是说我们要做提前的规划预测,把“眼光”放长远一点,不能仅仅依靠当前的信息反馈来做判断。这里就需要引入我们的算法了:预观控制算法。

我们先把前面定义的ZMP的系统状态方程离散化,设采样时间为 :

我们把上述方程称为离散化的系统方程,其中,

以及

给定ZMP的参考位置 ,为了使得系统的输出尽可能精确地跟踪目标ZMP位置,我们定义一个评价函数来作为损失函数,从而构造一个优化问题。评价函数为:

其中, 表示伺服误差,, 表示一个 的半正定的对称矩阵。 表示状态向量的增量, 表示输入的增量。在任意时刻,满足使得最小化的解就是我们要的最优解。

在每一个采样时间,如果可以预先知道ZMP的未来步的参考量,则使得评估指标最小化的最优控制器为:

其中,和 表示基于权重 以及离散化的系统方程的系统参数计算得到的增益。因此,预观控制过程由三部分组成:跟踪误差的积分动作、状态反馈、使用未来参考的预动作。

下图所示为采用预动作后的收益:

0fa5d31ef2986ad3581212b5486ce99c.png


我们可以看到,控制器并不需要太长未来时间的信息,因为预收益 在未来 秒以后已经变得非常小了。

下图是采用秒的预观时间周期时的步态模式生成结果,包含向前走三步的COM和ZMP轨迹:

6f4925a2647c5db3f379bef57cf917ca.png


其中,上面的子图为沿着轴的矢量平面内运动过程,下面的子图为沿着轴的侧平面内的运动过程。我们可以看到,COM的轨迹非常平滑,实际的ZMP轨迹也能完全跟踪参考的ZMP轨迹。整个步行过程可以分为多个步行周期,在单个步行周期中又可以分为单腿支撑相位和双腿支撑相位。在单腿支撑的步相中,ZMP的参考轨迹要始终落在支撑脚的区域内,在切换支撑腿以后要从旧的支撑脚区域转移到新的支撑脚区域当汇总。为了获得一个平滑的ZMP轨迹,我们使用了Cubic Spline进行轨迹插值。

下图展示的是采用更短预观时间(0.8秒)的COM轨迹预测和ZMP轨迹跟踪结果:

41deccaf3a418ec43b41b70899d85a82.png


从图中我们可以看到,ZMP的跟踪轨迹不如前面采用更长预观时间的算法结果,这里不能很好地跟踪ZMP的参考轨迹。尽管这样,整个系统还是稳定的,因为有状态反馈作为系统的输入。

以上为Kajit等人在2003年论文中提出的ZMP预观控制算法的基本内容,读者也可参考《仿人机器人》一书中的第4.4章节。

4.参考文献

基础版ZMP预观控制算法:Biped Walking Pattern Generation by using Preview control of Zero-Moment Point

改进版ZMP预观控制算法:General ZMP Preview Control for Bipedal Walking

《仿人机器人》,关注公众号【博士的沙漏】,后台回复【HR】获取下载链接。

5. 代码实现

代码使用Python语言编写,一共实现了3种ZMP预观控制算法,包括最基础款ZMP预观控制、考虑当前时刻ZMP误差的预观控制和考虑历史ZMP误差之和的预观控制,可根据给定的每一步落脚点生成质心和ZMP的运动轨迹。其中,基础款ZMP预观控制算法由于没有考虑ZMP的误差反馈,在实际使用的时候随着前进距离的增加会累积误差,可能会与所规划的ZMP参考点有差异,如下图所示:

e7c068a1fd199489b6b490768720d23c.png

而考虑了当前时刻ZMP误差的预观控制算法虽然有所改善,但改善微乎其微,如下图所示:

ad665c5135ac0fc0f482ed29ae3d8e4a.png

改进版的ZMP预观控制算法考虑了历史积累的ZMP误差因此其控制效果最好,能完全跟踪参考的ZMP轨迹:

089fc11087f29f5b867a5c5f4255a61e.png

该算法生成的COM和ZMP参考轨迹可用于双足机器人的步行控制过程:

代码开源在Github仓库,地址为:https://github.com/chauby/ZMP_preview_control.git

<think>嗯,用户想了解ZMP算法的相关信息,包括实现原理和应用场景。首先,我需要回忆一下ZMP是什么。ZMP是零力矩点(Zero Moment Point)的缩写,主要应用于双足机器人的步态规划和平衡控制。记得ZMP机器人的动态稳定性有关,当ZMP位于支撑多边形内时,机器人能够保持平衡。 接下来,我需要确认ZMP算法的基本原理。应该涉及力学分析,特别是地面反作用力的力矩在水平方向的分量为零的点。需要解释支撑多边形(Support Polygon)的概念,也就是机器人足部与地面接触形成的区域。如果ZMP在这个区域内,机器人稳定;否则可能会摔倒。 然后是实现方法。可能需要分步骤说明,比如动力学建模、支撑多边形计算ZMP轨迹规划、控制策略等。这里需要提到逆动力学和模型测控制(MPC),以及一些优化算法,比如QP(二次规划)。此外,结合参考中的Pinocchio库,可以提到使用这样的动力学库来辅助计算。 应用场景方面,双足机器人如ASIMO、Atlas是典型例子,还有仿人机器人、康复外骨骼、动态动画模拟等。需要具体说明每个应用场景中ZMP的作用。 用户可能还希望了解相关的优化方法或挑战,比如如何处理复杂地形、实时计算的问题,或者ZMP的局限性,比如假设地面刚性等。但用户的问题中没有提到这些,可能需要生成相关问题的时候涵盖。 现在需要检查是否有遗漏的部分,比如ZMP与其他稳定性准则的区别,比如与CoP(压力中心)的关系。不过用户的问题集中在实现和应用,可能不需要深入比较。 最后,生成相关问题时要考虑用户可能进一步想了解的内容,比如具体实现步骤、优化方法、与其他算法的对比,或者在不同场景中的具体应用案例。 确保回答结构清晰,分点说明,引用Pinocchio库作为工具支持,并正确应用LaTeX格式。例如,在解释ZMP计算时使用数学公式,如ZMP的坐标公式用$$...$$包裹,行内变量用$...$。 可能遇到的困难是如何简洁地解释动力学方程,需要用中文通俗地表达,同时保持准确性。需要确认引用的Pinocchio库是否确实支持ZMP相关的计算,根据参考内容,Pinocchio用于多刚体动力学,因此适合用于ZMP算法中的逆动力学计算部分。</think>### ZMP(零力矩点)算法解析 #### 一、基本概念 ZMP(Zero Moment Point)是双足机器人步态规划和平衡控制中的核心指标,定义为地面反作用力的水平力矩分量为零的点。当ZMP落在机器人足部的**支撑多边形**(Support Polygon)内时,系统处于动态平衡状态[^1]。 数学上,ZMP坐标$(x_{zmp}, y_{zmp})$可通过动力学方程计算: $$ x_{zmp} = \frac{\sum m_i (g z_i - \ddot{z}_i x_i) - \sum I_i \dot{\omega}_i}{\sum m_i (g - \ddot{z}_i)} $$ 其中$m_i$为质量,$I_i$为转动惯量,$\ddot{z}_i$为垂直加速度,$\dot{\omega}_i$为角加速度。 #### 二、实现原理 1. **动力学建模** 使用多刚体动力学描述机器人运动,通过**牛顿-欧拉方程**建立关节力矩与运动的关系。例如,Pinocchio库提供的逆动力学计算可高效求解关节力矩。 2. **支撑多边形计算** ```python # 计算足部接触点凸包 from scipy.spatial import ConvexHull contact_points = [[x1,y1], [x2,y2], ...] hull = ConvexHull(contact_points) ``` 3. **ZMP轨迹规划** 采用模型测控制(MPC),在有限时间窗口内优化ZMP轨迹,最小化能量消耗: $$ \min \int (x_{zmp}^d - x_{zmp})^2 dt $$ #### 三、应用场景 | 领域 | 具体应用 | 技术特点 | |------|----------|----------| | 双足机器人 | ASIMO行走控制 | 实时ZMP反馈调节关节力矩 | | 康复工程 | 外骨骼防跌倒 | 通过压力传感器监测ZMP偏移 | | 动画仿真 | 虚拟角色运动 | 计算ZMP轨迹实现自然步态 | #### 四、实现工具推荐 Pinocchio库提供完整的动力学求解器,可快速计算ZMP相关参数[^1]: ```cpp #include "pinocchio/algorithm/center-of-mass.hpp" pinocchio::centerOfMass(model, data, q); // 计算质心位置 ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沙漏AI机器人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值