4、ZMP稳定性理论:ZMP定义与物理意义、ZMP支撑多边形、ZMP判据与稳定性裕度
各位同学,咱们今天聊点硬核的——ZMP稳定性理论。
说实话,我刚入行那会儿,觉得双足机器人走路嘛,不就是两个腿倒来倒去?结果第一次调参,机器人走了三步就摔了个四仰八叉。后来我才明白,这背后有个核心概念叫ZMP。不懂它,你连机器人为什么摔倒都搞不清楚。
4.1 ZMP的定义与物理意义
ZMP,全称是Zero Moment Point,零力矩点。名字听着玄乎,其实说白了就是:地面反作用力的合力作用点。
你想想看,人站在地上,脚底和地面之间是有压力的。这个压力的分布不是均匀的,而是有一个等效的集中作用点。这个点,就是ZMP。
我个人的理解方式是这样的:
- 物理意义1:ZMP是地面反作用力在水平面上的等效作用点
- 物理意义2:在ZMP处,水平方向的力矩为零(所以才叫零力矩点)
- 物理意义3:ZMP的位置直接反映了机器人是否处于平衡状态
核心要点:ZMP ≠ 质心投影点(CoM投影)。很多人搞混这两个概念。质心投影是机器人自身重心的垂直投影,而ZMP是地面反作用力的作用点。只有当机器人静止站立时,两者才重合。
我在项目中遇到过一位同事,死活调不好步态,后来发现他把ZMP和CoM投影当成一回事了。嗯,这个坑我踩过,你们别踩。
4.2 ZMP支撑多边形
支撑多边形,就是机器人脚底与地面接触的区域所构成的多边形。
单脚支撑时,就是那只脚的脚掌形状。双脚支撑时,就是两只脚脚掌加上它们之间的连线围成的区域。
为什么要讲这个?因为ZMP必须落在这个多边形内部,机器人才能稳定。
我的经验:支撑多边形不是一成不变的。机器人迈步时,支撑脚从全脚掌变成脚尖着地,多边形会缩小。这时候ZMP很容易跑出去,导致摔倒。所以调参时,要特别关注单脚支撑相末段的ZMP轨迹。
支撑多边形的计算其实不复杂:
// 伪代码:计算支撑多边形
function computeSupportPolygon(footContacts):
polygon = []
for each foot in footContacts:
if foot.isInContact:
polygon.add(foot.corners)
// 对多边形顶点进行凸包排序
return convexHull(polygon)
4.3 ZMP判据与稳定性裕度
ZMP判据,简单说就是一句话:ZMP必须在支撑多边形内部。
但光知道这个还不够。你得知道它离边界有多远,这就是稳定性裕度。
| 裕度类型 | 定义 | 我的建议值 |
|---|---|---|
| 最小距离裕度 | ZMP到多边形各边的最短距离 | ≥ 2cm(小机器人) |
| 面积裕度 | ZMP到多边形边界围成的面积 | ≥ 多边形面积的20% |
| 角度裕度 | ZMP偏离中心线的角度 | ≤ 15° |
我曾经调一个机器人,ZMP明明在多边形内,但就是走不稳。后来发现,裕度太小了,只有0.5cm。一阵风吹过来,ZMP就飘出去了。从那以后,我给自己定了个规矩:裕度至少留2cm。
避坑指南:我曾经在调参时只关注了前后方向的裕度,忽略了左右方向。结果机器人直走没问题,一转弯就倒。后来才意识到,转弯时ZMP的横向偏移会突然增大。所以,前后左右四个方向的裕度都要检查。
4.4 知识体系总览
下面这张图,是我自己总结的ZMP稳定性理论的知识结构。你们可以把它当作调参时的检查清单:
4.5 实际调参中的ZMP应用
理论讲完了,咱们说说实际怎么用。
我调参的步骤一般是这样的:
- 先看ZMP轨迹:用示波器或者日志把ZMP的实时位置画出来
- 叠加支撑多边形:在同一个坐标系里画出当前时刻的支撑多边形
- 检查裕度:看ZMP离各条边的距离,哪个方向最小就调哪个方向的步态参数
- 反复迭代:调一次参数,走几步,看ZMP轨迹,再调
一个小技巧:我习惯在代码里加一个ZMP可视化模块,实时显示ZMP位置和支撑多边形。这样调参的时候,一眼就能看出问题出在哪。比看日志效率高多了。
嗯,ZMP这部分内容就这些。记住一句话:ZMP在支撑多边形内,机器人就稳;跑出去了,必摔无疑。调参的时候,多盯着ZMP看,比什么都管用。
可可精品资料库