ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

双足机器人ZMP/CoP检测链路全复盘:从物理区别到稳定判据

双足机器人ZMP/CoP检测链路全复盘:从物理区别到稳定判据 最近在调一台自研的双足步行机器人把ZMP和CoP的检测链路从硬件到代码完整重写了一遍。起因很典型机器人站姿静止时一切正常一旦迈步控制器就开始犹豫紧接着不是侧倒就是前扑。查到最后问题出在稳定性判据上——我用压力中心CoP直接充当零力矩点ZMP做反馈而在动态行走中这两者根本不是一回事。这篇文章就是这次重写过程中的完整复盘ZMP与CoP的物理区别、检测硬件如何选型、原始数据怎么变成可用的CoP坐标、稳定性判据怎么写以及我在实机上踩过的几个比较隐蔽的坑。双足机器人是目前各类移动平台里最接近人类运动形态的方案但也是控制难度最高的那一档。难点不在能走而在不摔——每一步本质上都是一次有意识的前倾靠落腿动作再把重心接住。ZMP和CoP就是这套接住自己逻辑里最核心的两个观测量。无论你是做步态规划、平衡控制还是做传感器融合最终都要落到这两个量上。这篇文章适合正在做或准备做双足机器人平衡控制的工程师和学生不需要多深的数学背景但希望你对基本的刚体力学和编程有概念。1. 为什么双足行走离不开ZMP与CoP这对概念1.1 行走的本质是受控的跌倒很多人第一次接触双足行走时会下意识地觉得走路就是两条腿交替往前迈。实际上把支撑脚的接触力画出来分析一遍就会发现行走过程里机器人绝大部分时间处于单腿支撑状态质心CoM在重力作用下不断向前和向侧向加速下落。所谓稳定行走不是让质心不动而是让质心的运动轨迹落在可控范围内并利用下一步的落脚点把它接住。这就引出了两个问题第一怎么描述脚底与地面之间的接触状态第二怎么判断当前状态稳不稳、离失稳还有多远ZMP和CoP就是回答这两个问题的核心工具。ZMP给出的是地面反作用力可以等效为合力与零力矩作用点的位置CoP给出的是实际压力分布的中心位置。两者在理想平面接触下重合但一旦脚掌出现微小翻转就会立刻分道扬镳。1.2 ZMP的定义为什么叫零力矩零力矩点这个概念最早由Vukobratović在1969年前后正式提出后来成为人形机器人步态规划的事实标准。它的定义很优雅在支撑平面内存在一个点使得地面反作用力包括分布压力和摩擦力对该点的合力矩的水平分量为零。换句话说在这个点处地面反作用力可以等效为一个纯力没有让脚掌翻转的掀翻力矩。这里的零力矩指的是水平方向的分量也就是让脚绕x轴或y轴翻转的趋势为零。竖直方向的力矩偏航力矩是允许存在的它由脚底摩擦提供。只要ZMP落在支撑面内部脚掌接触就不会发生转动机器人就处于接触稳定的状态。一旦ZMP逼近甚至超出支撑面边界脚掌就会绕边缘翘起进入不可控的旋转状态也就是我们常说的翻车前兆。1.3 支撑多边形所有判据的几何地基ZMP和CoP的判断都离不开支撑多边形Support Polygon这个几何概念。它是脚掌与地面所有接触点组成的最小凸包单腿支撑时就是单脚脚底的凸包双腿支撑时则是两只脚接触区域的并集凸包形状类似一个连接两脚的L形或工字形。我的经验是第一步先把支撑多边形的计算做得非常牢固否则后面所有稳定性判断都是空中楼阁。尤其需要注意的是支撑多边形要实时更新——摆动脚从离地到重新落地的过程中支撑多边形会从单脚区域突然扩展到双脚区域这个突变时刻的坐标变换和边界更新最容易出错。2. ZMP与CoP并非一回事物理定义差一厘米结果差一个跟头2.1 理想条件下的重合和现实中的分离CoP压力中心的定义更贴近实际测量把脚底分布的接触压力合成得到一个等效作用点就是压力中心。它描述的是为了平衡脚下压力的不平衡分布需要集中施力的那个点。在脚掌完全平贴地面、没有发生任何旋转时ZMP和CoP在数值上是重合的。这也是很多教程直接混用两个概念的原因——静态站姿下它们本来就是同一个点。但一旦脚掌发生绕边缘的翻转趋势情况就完全变了CoP会因为接触面积减小而向翻转边缘移动并且始终停留在接触区域内部而ZMP可以越过支撑面边界跑到接触区域之外。这个差异意味着当你看到CoP还在支撑面内时真实的稳定性可能已经在崩溃边缘了。2.2 混用两个概念会让控制器做出什么错误决策举一个实际场景机器人在行走中遇到一个小台阶或者地砖缝隙前脚掌略微抬起此时接触区域只剩后半脚掌。如果控制器继续用CoP反馈判断稳定性它会发现CoP还稳稳地落在支撑面内给出状态良好的结论。但实际上ZMP已经越过前边缘脚掌正在绕前缘旋转接下来会是整个身体的前俯。我在早期调试时就因为这个问题付出了代价机器人每次走大步或转向时都会在特定相位摔倒日志里CoP明明全部落在支撑多边形内部。后来把ZMP的理论计算值和CoP测量值同时画出来才发现二者在支撑脚切换到前脚掌离地区间时出现明显分离。这让我意识到工程上用CoP近似ZMP是有前提的前提就是脚掌必须保持完全平贴接触。2.3 工程上的务实选择近似可以但必须留出边界余量既然传感器直接测量到的是CoP是不是意味着ZMP检测做不了当然不是。在平整地面、脚掌不发生翻转的正常行走工况下CoP与ZMP的偏离非常小完全可以直接用CoP作为ZMP的观测值。关键是控制器要清楚这个近似的前提并且用足够的稳定裕度去覆盖两者可能产生的偏差。以我做的小型双足机器人单脚脚掌大约14cm×8cm为例支撑多边形的稳定边界内缩20mm作为软阈值ZMP/CoP一旦靠近软阈值就触发姿态修正再内缩到10mm作为硬边界越线就执行急停或落脚调整。这个20mm就是我根据实测中CoP与ZMP最大分离量加安全系数定出来的。强烈建议你也在自己的平台上先做一组翻转实验量一量正常行走时CoP和理论ZMP的实际偏差范围再决定阈值留多大。3. CoP检测的硬件方案传感器选型、安装位置与机械细节3.1 三种主流测量路径的对比目前工程上能落地的CoP检测方案主要有三类各有适用场景。方案原理优点缺点适用场景脚踝六维力/力矩传感器在脚踝处测量地面反作用力的三个分力和三个力矩精度高、能直接算CoP、动态带宽好成本高、机械结构要求高实验室人形机器人主流方案脚底FSR压力阵列多个薄膜压力传感器分布在脚掌加权求压力中心便宜、易改造、重量轻精度和重复性差、温漂大、动态响应慢教学平台、小型发球机器人地面测力台/压力跑道机器人走在嵌有六维力台的跑道上精度最高、不增加机载负载只能离线测、无法用于实时控制步态数据采集与算法验证我自己的平台用的是脚踝六维力传感器方案这也是目前人形机器人社区里最主流的做法。FSR方案我在早期的教学板上也试过对于低速走平路够用但一旦步频提高到每步0.5秒以内FSR的响应滞后和重复性不足就开始影响控制效果了。3.2 脚踝六维力传感器的安装与机械考虑六维力传感器的安装位置一般在脚踝关节与脚掌之间也就是小腿末端和脚掌连接的这一段。安装时最重要的机械考虑是刚度传感器法兰与上下结构之间必须是刚性连接任何弹性垫片、软性缓冲都会引入测量误差。安装细节上有几个容易忽略的点第一紧固螺栓要用规定的预紧力矩打紧并且建议抹螺纹胶防松因为机器人行走时的振动非常大螺栓松动会直接导致读数漂移第二传感器上下两个法兰面的平行度要保证在0.1mm以内否则传感器会承受额外的预载弯矩影响零点第三电源线和信号线要从传感器侧面引出避免从受力路径中间穿过。3.3 FSR阵列方案压心计算的原理如果你用的是FSR传感器阵列CoP的计算其实就是一个加权平均CoP_x Σ(xi × Fi) / ΣFiCoP_y Σ(yi × Fi) / ΣFi其中(xi, yi)是第i个传感器的安装坐标Fi是第i个传感器的压力读数。这个公式的前提是所有传感器位于同一平面上并且压力分布可以被离散点近似。FSR阵列的布置需要注意两点一是传感器的覆盖面积要尽量覆盖整个脚底尤其脚掌前后边缘不能留太大空档否则CoP算出来会明显偏内二是每个传感器都要单独做力值标定因为FSR的一致性通常比较差。3.4 硬件层面的信噪比线缆、屏蔽与接地CoP检测的精度瓶颈往往不在传感器本身而在信号链路的信噪比。六维力传感器的应变片输出信号很小容易受到电机驱动器的电磁干扰。我在调试初期就被这个问题折腾了好久机器人一走路传感器读数就出现规律性的毛刺频率正好和关节PWM的开关频率接近。解决办法有三板斧一是信号线全部使用双绞屏蔽线屏蔽层单端接地二是传感器线缆从机器人腿部外侧走线尽量远离电机动力线如果必须交叉交叉角度保持垂直三是机箱内做好接地星型拓扑避免地环路。做完这三件事我实测的噪声峰值从原来的满量程2%降到了0.3%以内。4. 从原始信号到稳定判据标定、滤波、坐标变换一条龙4.1 零点标定比想象中更重要的第一步六维力传感器在安装完成后几乎不可能做到绝对的零载荷零点。机械预紧、线缆拉力、重力在结构上的残余应力都会让原始读数带一个固定偏置。所以每次上电后都要做零点标定。我的标定流程是这样的机器人上电后先让双脚完全悬空比如用吊挂系统把机器人吊起来脚底离地采集2000个样本取平均作为Fi0和Mi0。然后在正常站立状态下用一个已知重量的砝码挂在脚踝安装法兰上或者直接让机器人站在地面上用已知体重做校验检查测得的地面反力是否等于机器人重量力矩是否符合预期。零点标定的核心是保证零载荷时读数归零、已知载荷时读数准确两个条件必须同时验证。4.2 滤波策略低通为主陷波为辅力传感器原始信号的噪声主要来自两部分一是电气噪声频率高且随机二是机械谐振表现为几十到几百赫兹的窄带振荡。电气噪声用巴特沃斯低通滤波器就能压掉大部分截止频率我一般取30~50Hz。这个频段可以保留步态中主要的地面反力变化成分同时又不会混入太多高频抖动。但低通滤波对机械谐振的效果有限而且截止频率越低相位滞后越大控制环会越容易发散。更合适的做法是在低通之后串联一个陷波滤波器频率对准机械谐振点。找谐振点的方法很直接让机器人原地站立用手在脚踝处给一个冲击激励用示波器或FFT看力信号的主振荡频率通常在80~200Hz之间。在控制器里写一个自适应陷波或者固定频率陷波把这一窄带去干净信号质量会有一个质的提升。4.3 坐标变换从传感器坐标系到世界坐标系六维力传感器测到的力和力矩是相对于传感器自身坐标系的。要计算CoP并交给步态规划器使用必须先把力和力矩变换到世界坐标系通常是重力方向为z轴的地面坐标系。力向量的变换比较简单只做旋转F_world R × F_sensor力矩的变换要额外加上力臂的修正τ_world R × τ_sensor r × F_world其中r是传感器坐标系原点在世界坐标系中的位置向量。这一步容易被忽略但影响很大——如果传感器安装在脚踝上方8cm处直接拿传感器力矩算CoP而不补偿平移项算出来的CoP会整体偏移偏移量大概等于力臂乘以力的水平分量除以垂直力在动态行走中可以达到1~2cm。旋转矩阵R来自机器人的IMU姿态估计也可以用关节正运动学去推算踝关节的朝向。我个人建议以IMU为主、正运动学为辅做融合这样在脚掌轻微打滑时也能保持坐标变换的相对准确。4.4 从力/力矩算出CoP的公式与程序实现在完成坐标变换后CoP的计算就是纯粹的代数运算。以最常见的传感器坐标系约定为例z轴向上x轴朝前x_cop -τ_y / F_zy_cop τ_x / F_z符号约定必须仔细核对不同传感器厂商的定义不一样最好先用一个已知压心位置的实验验证一遍比如在脚掌前端某个已知坐标处压一块重物看算出来的CoP是否落在那个坐标附近。这个验证实验必须要做否则符号反了控制器会把误差放大两倍。还有一个非常关键的工程细节当F_z接近0时比如摆动脚离地除法会得到极大值或无穷大CoP瞬间跳变。必须做门限保护我一般在F_z 0.3×机器人总重量时直接冻结CoP的输出保持上一次有效值。下面是我在实机上用的一段简化C代码逻辑是输入传感器原始力和力矩输出经过门限保护后的CoP坐标struct Vec3 { double x, y, z; }; bool computeCoP(const Vec3 F, const Vec3 tau, double threshold, Vec3 cop_out) { if (F.z threshold) { return false; // 足底接近离地不输出有效CoP } cop_out.x -tau.y / F.z; cop_out.y tau.x / F.z; cop_out.z 0.0; // 支撑平面上 return true; }5. 稳定性判定与闭环控制支撑多边形、安全裕度与实测策略5.1 把支撑多边形变成代码里的凸包支撑多边形的程序实现看起来不算难但细节决定成败。最简单的方式是直接把脚掌四个顶点的坐标存成数组单腿支撑时用这只脚的四个顶点双腿支撑时把两只脚的八个顶点取并集然后计算凸包。凸包算法用Graham扫描或者Andrew单调链都行。但要注意支撑多边形必须与当前的支撑状态同步。我用状态机管理四个阶段双腿支撑、左脚单腿支撑、双腿支撑切换、右脚单腿支撑。状态切换的时刻要和脚底触地检测用六维力传感器的F_z突变检测关联而不是单纯依赖步态规划的时间表。因为实际行走中脚提前落地或延迟落地很常见时间表不更新的话支撑多边形就是错的稳定性判断自然全错。5.2 稳定裕度不是越靠中心越安全很多初学者以为CoP越靠近支撑面中心越稳这个直觉在静平衡下成立但在动态行走中是错的。为了维持前进速度质心需要持续前移ZMP/CoP必须适度偏向支撑面前缘才能产生使质心加速的力矩。如果拼命把ZMP往中心拉机器人反而会刹车走起来一顿一顿的甚至因为频繁调整而失稳。正确做法是用稳定裕度做判断而不是单纯看CoP离中心多远。稳定裕度的定义是CoP到支撑多边形边界的最短距离。在实际代码里我会逐边计算CoP到每条边的距离取最小值作为裕度值。裕度为正且大于软阈值认为状态安全介于软阈值和硬阈值之间触发姿态修正小于硬阈值立即执行紧急决策。5.3 用线性倒立摆模型联系ZMP与质心运动真正控制步态的时候只拿来判断稳不稳是不够的还要回答怎么迈下一步才能稳。这里绕不开线性倒立摆模型LIPM。在线性倒立摆假设下ZMP和质心加速度之间有非常简洁的关系x_zmp x_com - (z_com / g) × x_com_ddot其中x_com是质心水平位置z_com是质心高度x_com_ddot是水平加速度。这个公式说明当质心加速前移时ZMP会自然落在质心后方而要让机器人停下就得让ZMP跑到质心前方。我在实际调试中把这个关系当成了理论标尺把IMU估计出的质心状态代入公式算出理论ZMP再和传感器测出的实测CoP对比两者偏差超过阈值就说明有异常扰动。5.4 ZMP/CoP反馈闭环踝关节策略与髋关节补偿有了实时的CoP测量值闭环控制的实现路径就清晰了。最常见的是分层控制结构外环根据CoP误差调节质心位置参考内环用踝关节力矩或髋关节位置去执行。踝关节策略适合小幅扰动通过踝关节力矩调整脚底压力分布把CoP拉回目标位置。髋关节策略适合较大扰动通过摆动髋关节改变质心位置间接影响CoP。我实现的时候CoP误差先过一个PID控制器输出一部分给踝关节的力矩前馈一部分给髋关节的位置补偿两路按权重分配。实测下来这种混合策略对小型扰动地面凸起、推搡的恢复时间从原来的1.2秒缩短到0.6秒左右。在动态行走中还可以引入预览控制Preview Control的改进版思路不只是让CoP跟住参考轨迹而是让质心状态在几步之内回到规划轨迹上这种方法对大扰动处理效果不错。但预览控制对模型精度要求高模型误差大时会越调越乱建议先从小步幅、低速度调起。6. 实测中的五个典型坑与排错全过程6.1 传感器读数抖动控制器的犹豫症第一个坑是最常见的机器人原地站立稳定一走路就全身抖动幅度不大但持续不断。我用示波器录制了脚踝六维力传感器的原始信号发现存在明显的窄带周期分量频率大约120Hz。排查过程是先检查电气噪声源断掉所有关节电机驱动纯采集力信号抖动依然存在再用FFT分析发现120Hz尖峰和机械结构模态吻合。用手按住脚踝结构时尖峰明显衰减确认是机械谐振。处理办法是加了一个120Hz陷波滤波器同时把低通截止频率从50Hz降到35Hz。改完以后抖动立刻消失行走姿态明显顺滑。事后复盘如果一开始就做冲击激励测谐振频率这个坑可以节省一整天的调试时间。6.2 摆动脚离地瞬间的CoP跳变毛刺第二个坑出现在摆动脚离地的那一刻。步态日志显示摆动腿刚离地时CoP输出会突然跳到脚掌范围之外好几厘米然后迅速消失。这个毛刺对控制器的危害很大因为它会让稳定性判定出现瞬时的假失稳触发不必要的修正动作。根因就是我前面提到的F_z接近零时除法爆炸。摆动脚一旦离地这侧的力传感器F_z迅速减小CoP分母趋近于零计算值瞬间变成很大的数。解决方案就是门限保护当F_z小于机器人单腿承重的30%时直接判定该足离地CoP输出切换为另一只脚的测量值并在切换时做一次一阶滤波的平滑过渡避免突变。6.3 开机半小时后读数逐渐漂移第三个坑是温漂。机器人在实验室里刚开机时走得很稳跑了二十来分钟以后静态站立时CoP缓慢往外移动最后偏到接近边界。这个漂移量不大但足以影响稳定裕度的判断。原因是应变片桥路对温度变化敏感而长时间行走后脚踝附近的电机和减速器发热热量传导到传感器法兰上。解决办法有两层一是硬件上给传感器贴隔热垫减少热传导二是软件上设计周期自检——在机器人处于明确的零载荷状态时比如悬挂状态下定期更新零点或者记录温度传感器读数对零点做温度补偿。我最后采用的是悬挂状态自动清零逻辑每隔30秒检测一次是否处于悬空状态是则重新刷新零点。6.4 地面状态突变导致CoP与ZMP严重分离第四个坑更隐蔽。机器人在硬木地板和地毯边缘行走时支撑脚有时会陷入地毯绒面产生微小的姿态变化。此时脚掌并非完全平贴地面CoP测量值落在脚掌接触区域但真实ZMP可能已经越界。这种现象在踩到小石子、凹凸不平的地砖时尤其明显。排查方法落地下来有两个要点一是把IMU的俯仰角观测加入稳定性判断当支撑脚底板角度超过某个阈值我设为3°就不再信任CoP作为ZMP近似转为降低步速、加大稳定裕度阈值二是给落地检测加稳定时间——脚刚触地时先不急着切换到该足支撑状态等传感器读数稳定200ms后再切换。这个改动对复杂地面上的鲁棒性提升非常明显。6.5 走线牵拉导致测量偏置反复排查无果最后一个坑比较低级但值得记录有一次机器人走路总是往一侧偏CoP离线值恒定偏移8mm左右无论怎么清零、怎么重标定都搞不定。后来把传感器线缆用手托起悬空偏移立刻消失。原因就是线缆从脚踝传感器旁边走过从电机驱动器到脚掌之间的那一段线缆在行走中被拉扯产生了一股额外的固定力作用在传感器上。解决办法是重新规划线缆走向让线缆不经过传感器弹性体受力区域并在结构上加了一个小的理线夹把线缆固定在传感器以外的大腿上给了足够的松弛长度。后来我养成了一个习惯每次改动机械结构或线缆布局之后都做一次有线缆状态和无线缆状态的离线对比测试专门排查这类由外部附加力导致的偏置问题。踩过这些坑之后我最大的体会是ZMP和CoP的检测不是找一个昂贵的传感器装上就完事它是一个从机械刚度、线缆布局、信号调理、零点标定到坐标变换、门限保护、状态机关联的完整链路任何一环掉链子最终都会换算成机器人莫名其妙的一摔。如果你正在做类似平台建议按我前面的顺序一步步来先把CoP测准了再把支撑多边形算对最后才谈得上用来做闭环控制。另外也建议在控制器里加上完整的日志记录把CoP轨迹、支撑多边形边界、稳定裕度三个量同步存下来事后回放问题会直观得多。
返回列表