资讯详情

双足机器人设计:从自由度构型到ZMP步态稳定实战

📅 2026/11/6 8:07:14 | 华诺云谱 👁 阅读
双足机器人设计:从自由度构型到ZMP步态稳定实战
简介这份 Word 文档是北京汉库科技 HGR-3HV-C 双足机器人步伐源代码手册的整理稿面向从事嵌入式机器人开发、步态控制研究的工程师与学生帮助其读懂厂商源代码、理解运动控制机制并据此调参优化。文档以步伐函数为主线逐段拆解初始站立、双腿下蹲、起立及侧身等动作的第 1、2 族变速子程序涉及关节角度、电机速度与重心变化的协同控制为定制行走模式、提升动态性能与能源效率提供依据。压缩包内共 1 个 doc 文件约 9.07MB页面含目录与逐页页码标注便于按章节定位查阅其中也涉及姿态检测、传感器融合、动力学模型与控制算法等配套组件。目前已有 478 人学习适合具备一定嵌入式基础、希望从源码层面理解双足机器人步态实现的读者研读。1. 双足机器人设计不是画腿一份设计文档该有的骨架很多人接到「双足机器人设计.doc」这个题目第一反应是打开三维软件画两条腿画完才发现关节装不下、电机选大了、整机站上去三秒就趴下。双足机器人设计的难点从来不在建模而在于把自由度构型、连杆尺寸、关节选型、步态时序、稳定性判据这五件事写进同一份文档并且让它们互相对得上。这份文档要能回答三个问题腿多长、关节多大、走路时质心往哪挪。它适合做机器人方向课程设计的学生、做具身智能原型的小团队以及把玩具级双足改到能连续走十步的开发者。下面按一份真实可落地的设计文档顺序往下拆参数都给到能直接抄的程度。2. 自由度与构型先定死12 自由度方案怎么落到图纸上构型一旦定错后面所有参数都是白算。这一章只解决一件事把「几条腿、每条腿几个关节、每个关节转哪个方向」写成一张谁看都一样的表。2.1 关节拓扑与自由度分配的取舍小型双足最常见的起点是单腿 6 自由度、整机 12 自由度髋关节 3 个pitch 前后摆、roll 侧摆、yaw 转向、膝关节 1 个pitch、踝关节 2 个pitch、roll。这个分配不是凑数髋 roll 负责把摆动腿甩到侧向落点踝 roll 负责把支撑脚的 ZMP 推向内侧两者一配合才有侧向稳定裕度。砍到 5 自由度踝只留 pitch的腿能省一个电机和一套减速器代价是侧向稳定完全靠髋 roll 加大步宽来兜步宽一加髋 roll 的力矩需求翻倍横滚方向的振荡也更难压。原地转向同样做不了因为缺少髋 yaw只能靠双脚交替蹭。反过来说加到 7 自由度踝加 yaw 或膝加 roll对 3~5 kg 的小机器几乎没有收益多出来的关节反而增加零位标定和线束布置的麻烦。构型单腿自由度优点代价适用场景平面双足4髋 pitch、膝 pitch、踝 pitch 髋 roll电机少、控制简单只能前后走侧向靠步宽硬撑教学演示、步态算法验证标准 12 自由度6前后侧向都能调可原地转向关节多标定和线束复杂大多数小型双足原型加腰 13 自由度6 腰 yaw转向时上身可反向补偿腰部刚度要求高多一级标定需要灵巧转向的场景对刚起步的方案我一般建议先锁 12 自由度把腰部留成刚性连接但预留安装孔等步态跑稳了再决定要不要加腰。2.2 从构型到连杆参数表一张能复现的尺寸表连杆尺寸不能凭感觉。以腿长 L髋关节轴线到脚底为基准归一化大腿长和小腿长通常取接近 1:1大腿略长 0~10%这样膝关节在站立相接近伸直但不完全锁死避免奇异位形导致逆解跳变。脚长按 0.3L 左右取太长会增加踝关节峰值力矩太短则支撑多边形面积不够ZMP 裕度被压到 1 cm 以内。下表是一台腿长 0.40 m、整机 3.5 kg 的小型双足的实际取值直接照抄后按比例缩放即可。参数符号取值与腿长 L 的关系影响大腿长L10.200 m0.50L与 L2 接近时膝关节力矩最小小腿长L20.200 m0.50L决定踝关节到膝的力臂踝关节高度h_a0.050 m0.125L越低越稳但脚掌空间受限脚长l_f0.130 m0.325L支撑多边形前后长度脚宽w_f0.070 m0.175L支撑多边形左右宽度髋宽两髋轴线间距d_h0.160 m0.40L决定步宽下限整机质量m3.5 kg—关节扭矩计算的输入站立质心高度h0.280 m0.70L决定倒立摆时间常数质心高度这一行最容易被忽略。线倒立摆的时间常数是 √(h/g)h 0.28 m 时约 0.169 s意思是质心一旦偏离 ZMP 参考点偏差按指数发散特征时间不到 0.2 s。这就是为什么双足的平衡环必须跑到 200 Hz 以上低于这个频率控制器还没反应过来机器已经倒了。2.3 关节选型扭矩、转速、减速比三件套怎么算关节选型分三步顺序不能反。第一步算静态保持扭矩。支撑相单腿承受整机重量膝关节的力臂取踝关节到膝关节轴线的最大水平距离。整机 3.5 kg 即 34.3 N 的重力力臂 0.08 m静态扭矩约 2.7 N·m。第二步乘峰值系数双足在落地冲击和快速摆动时扭矩会冲到静态值的 2.5~3 倍取 2.8得到 7.6 N·m向上取整到 8 N·m。第三步算转速步态周期 0.8 s、摆动相 0.32 s、摆腿角度行程约 60°1.05 rad平均角速度约 3.3 rad/s即 31 rpm峰值按 2 倍留取 60 rpm 输出端。减速比按 i 电机额定转速 / 关节需求峰值转速 反推。以额定 3000 rpm 的电机配 60 rpm 输出端i ≈ 50。这里有个取舍减速比越大扭矩越够但反驱能力越差。踝关节需要吸收落地冲击反驱能力不能太低我一般把踝的减速比压到 20~30剩下靠电机本身的峰值扭矩补。关节峰值扭矩输出峰值转速减速比备注髋 pitch8 N·m60 rpm50摆动腿 躯干质量髋 roll6 N·m50 rpm50侧向甩腿髋 yaw3 N·m40 rpm80转向时阻力大膝 pitch8 N·m60 rpm50支撑相主力踝 pitch5 N·m50 rpm30需保留反驱踝 roll3 N·m40 rpm30需保留反驱编码器分辨率按「关节角分辨率优于 0.05°」倒推。关节端 0.05° 对应输出端一圈 7200 分度如果编码器装在电机端乘减速比 50 后等效分辨率会被放大 50 倍14 位16384 线绝对编码器就够用但前提是减速器背隙要小背隙超过 0.5° 时编码器再准也没意义因为机械端已经丢了。3. 逆运动学与步态时序把「走路」拆成可算的轨迹构型和尺寸定完接下来要把「抬脚、迈步、落地」翻译成每一时刻的六个关节角。这一章给的是能直接跑通的最小实现。3.1 单腿逆运动学髋-膝-踝的解析解与代码矢状面内髋、膝、踝三个 pitch 关节构成一个两连杆机构踝 pitch 只影响脚掌姿态不参与腿长解算。给定踝相对髋的位置用余弦定理直接解不需要迭代。import math def leg_ik_sagittal(x, z, L1, L2): 矢状面两连杆逆解。 x: 踝相对髋的前向距离 (m)向前为正 z: 踝相对髋的垂直距离 (m)向下为正 L1: 大腿长, L2: 小腿长 返回 (hip_pitch, knee_pitch)单位 rad屈膝为负 d math.hypot(x, z) # 限幅目标点超出可达范围时收敛到最大伸展的 99.9% d min(d, (L1 L2) * 0.999) d max(d, abs(L1 - L2) * 1.001) # 余弦定理求膝角 cos_knee (L1 * L1 L2 * L2 - d * d) / (2 * L1 * L2) cos_knee max(-1.0, min(1.0, cos_knee)) # 防 acos 定义域越界 knee -math.acos(cos_knee) # 屈膝取负与关节方向约定一致 # 髋角 目标方向角 大腿与目标连线的夹角 alpha math.atan2(x, z) cos_beta (L1 * L1 d * d - L2 * L2) / (2 * L1 * d) cos_beta max(-1.0, min(1.0, cos_beta)) beta math.acos(cos_beta) hip alpha beta return hip, knee代码里有三处限幅每一处都对应一次实际翻车。d的上限防的是站立相膝关节被指令到完全伸直此时cos_knee恰好等于 -1再小一点就进入acos定义域外返回 NaN电机收到 NaN 会直接失控。d的下限防的是抬脚过高时踝关节贴到髋部腿长退化为 |L1−L2|。cos_knee和cos_beta的钳位是浮点误差的最后一道保险math.acos(1.0000000002)同样会抛异常。踝 pitch 角由脚掌姿态决定ankle -(hip knee) pitch_desired其中pitch_desired是希望脚掌相对地面的俯仰角支撑相取 0 保持脚掌贴地摆动相按落脚角度给一点前倾。这一行看起来简单但符号搞反是新手最常见的错误表现为机器一迈步脚掌就朝天。3.2 步态时序表一个周期里每条腿在干什么步态参数决定走起来是「稳」还是「僵」。下面这组参数在 3.5 kg 小机器上跑得比较顺可以直接作为初值。参数取值说明步态周期 T0.8 s越小越快但摆动相时间被压缩单腿支撑相占比0.60双支撑相合计 0.20双支撑相占比0.10每段小于 0.05 时容易在换脚瞬间失稳步长0.10 m约 0.25L超过 0.35L 后 ZMP 裕度急剧下降抬脚高度0.04 m够越过地面不平即可越高摆动时间越紧步宽0.14 m比髋宽略窄靠踝 roll 把 ZMP 推向内侧质心高度行走0.26 m比站立低 2 cm换取稳定裕度时序上一个周期分成四段左腿支撑 右腿摆动、双支撑、右腿支撑 左腿摆动、双支撑。双支撑段虽然只占 0.08 s却是整个步态里最容易出事的位置因为两条腿同时接地时支撑多边形从单脚变成两脚ZMP 可以在这片区域里自由移动一旦规划器没把质心按时推到新支撑脚上方换脚瞬间就会侧倾。3.3 足端轨迹摆线比样条更好调摆动腿的足端轨迹我一般用摆线不用三次样条。摆线的好处是起止点速度严格为零、加速度连续落地冲击小样条虽然可以任意指定中间点但边界条件一改就要重新解方程调参时很麻烦。摆线的水平与垂直分量水平x(t) x0 (x1 - x0) * (t/Ts - sin(2π t/Ts)/(2π))垂直z(t) z0 H * (1 - cos(2π t/Ts)) / 2其中 Ts 是摆动相时长H 是抬脚高度t 从 0 到 Ts。垂直分量在 t Ts/2 处达到最高点此时水平速度最大正好对应腿从后往前甩的中段。这个「速度最大」的时刻是踝关节反驱能力最吃紧的时刻如果踝减速比选得太大腿甩到中段会有明显顿挫。摆动相结束前的 20% 时间里我会把足端轨迹从摆线平滑切到一条朝向落点的直线速度按落地速度约 0.15 m/s给避免足端在触地瞬间还带着水平速度蹭地。这个细节不做脚掌橡胶垫会很快磨出斜面。3.4 从关节角到电机指令位置环加力矩前馈关节角算出来只是目标值真正下发到电机还要过一层。位置环用 PD但纯位置环在支撑相会有一个问题腿部承重时关节被压下去一点位置误差始终存在PD 会持续输出一个偏大的力矩表现为站立时机身轻微下沉后再弹起。解决办法是加重力补偿前馈。按当前关节角算出各连杆质心位置用雅可比矩阵把重力矩映射回关节空间作为前馈项直接叠加到 PD 输出上。位置环只负责修正模型误差增益可以调低超调明显减小。这套做法在仿真里看不出差别实机上站着不动时的机身晃动会小一半。控制频率上逆解和轨迹生成跑 200 Hz 就够但电流环和重力补偿要跑到 1 kHz两个频率分开放在不同任务里。把逆解塞进 1 kHz 循环是常见的资源浪费一次逆解连同三角函数大概几十微秒看似不多但挤占了电流环的时间片反而拖累响应。4. 稳定性判据ZMP、支撑多边形与线性倒立摆步态轨迹能走不代表走得稳。判断「稳不稳」需要一个可量化的指标双足领域最通用的就是零力矩点。4.1 线性倒立摆把整机压成一个质心整机十几个连杆直接做动力学分析方程会爆炸。工程上先做一个简化把所有质量等效成一个位于质心、长度等于质心高度的倒立摆质心以上部分视为刚体忽略腿的摆动惯量。这个近似在步频不高、腿质量占比小于 30% 时误差可以接受。线性倒立摆的运动方程是ẍ (g/h)(x - p)其中 x 是质心水平位置p 是 ZMP 位置h 是质心高度。这个方程是线性的意味着给定 ZMP 轨迹质心轨迹可以解析求出反过来给定质心轨迹也能反解出需要的 ZMP。步态规划就是在两者之间来回倒腾。4.2 ZMP 计算与稳定裕度实机上 ZMP 靠足底力传感器或者踝关节力矩反算。用六维力传感器时公式很直接def zmp_from_foot(F, T, origin_xy, fz_threshold20.0): 由足底六维力传感器计算 ZMP。 F: (Fx, Fy, Fz)合力单位 N T: (Tx, Ty, Tz)以传感器原点为参考的合力矩单位 N·m origin_xy: 传感器原点在世界系下的 (x, y)单位 m fz_threshold: 判定腾空的垂直力阈值单位 N 返回世界系下的 (x, y)腾空时返回 None Fx, Fy, Fz F Tx, Ty, Tz T if abs(Fz) fz_threshold: return None # 腾空相 ZMP 无定义 x origin_xy[0] - Ty / Fz # 符号约定绕 y 轴力矩对应前后 y origin_xy[1] Tx / Fz # 绕 x 轴力矩对应左右 return x, y符号约定必须跟传感器安装方向对齐装反了 ZMP 会在屏幕上正常跳动但方向和实际相反排查时极其费劲。建议第一次装好后用手在脚掌前部按压ZMP 应该往按压点方向移动不符合就调符号。ZMP 算出来要和支撑多边形比对。稳定裕度定义为 ZMP 到支撑多边形边界的最短距离工程上取 15~25 mm 比较合适。低于 10 mm 时传感器噪声和地面不平就能把 ZMP 推出多边形表现为机身突然抽一下高于 30 mm 时机器会显得「蹲着走」质心大幅左右摆能耗和关节磨损都上去了。稳定裕度行走表现适用阶段 10 mm频繁抽搐地面稍不平就倒不可用15~25 mm平稳允许小幅地面起伏推荐区间 30 mm左右大幅摆胯能耗高仅调试初期用4.3 踝策略与质心调整ZMP 偏离参考点时第一道防线是踝关节。支撑脚踝 pitch 和 roll 各转一个小角度把压力中心往需要的方向推。踝策略的带宽高、延迟小适合处理高频扰动但角度行程有限踝 roll 一般只能给 ±8°超出就要靠髋关节把质心挪回来。第二道防线是髋策略也就是调整质心位置。质心跟踪的参考轨迹由线性倒立摆反解得到实际执行时用 PD 控制增益不能太高否则质心追得太急ZMP 反而被甩到多边形外。髋策略的响应慢但幅度大负责处理持续性的偏差比如一只脚踩在小台阶上。第三道是迈步策略也就是「要倒了就多走一步」。这一步实现起来最复杂需要落脚点规划器根据当前质心速度预测下一步落点。小型双足如果不追求抗扰可以先不做把前两道调好能应付大部分平地场景。4.4 参数整定顺序别一上来就调步态整定顺序错了会陷入「调 A 崩 B」的死循环。我一般的顺序是先调单腿悬空的位置环增益让空载跟踪误差小于 0.5°超调小于 5%。再加整机站立的重力补偿让静止时机身晃动幅度小于 1 mm。然后调踝策略增益用手轻推机身看 ZMP 回到参考点的时间控制在 0.3 s 以内。接着调质心跟踪增益原地踏步时 ZMP 不越界。最后才开步态行走从步长 0.05 m、周期 1.2 s 开始逐步加快。每一步没达标就不要进下一步。跳步省下来的时间后面会在实机上一次一次还回来。5. 联调避坑双足机器人最容易翻车的五件事前面几章的参数在仿真里都对得上实机上照样会出问题。这一章记的是现场最常遇到的五条按「现象 → 原因 → 解决」写。5.1 一上电就高频抖动频率在 30~60 Hz现象机器站直后整条腿出现细密抖动手摸能明显感觉到但姿态没倒。原因位置环增益过高叠加减速器背隙形成极限环。电机端编码器看到的角度和关节实际角度差一个背隙量控制器不断修正机械端每次过零都撞一下背隙边界。另一个常见原因是电流环带宽不够位置环给的速度指令电流环跟不上。解决先把位置环 P 降到原来的一半看抖动是否消失如果只是变慢没消失就是背隙加增益的问题需要降低位置环增益并加入速度前馈。电流环带宽至少要跑到位置环的 10 倍以上1 kHz 电流环配 200 Hz 位置环是安全比例。5.2 走三步后向一侧偏越走越歪现象步态本身没报错但机器人整体轨迹持续向同一侧漂移。原因左右腿零位标定不对称。机械零位和编码器零位存在 1~2° 的偏差单腿看没问题整机走起来每条腿的着地点都会偏几毫米累积几步就明显。另一种可能是脚掌安装面不平行一侧脚底橡胶垫厚了 0.5 mm。解决把机器吊起来手动把两条腿摆到同一姿态用直尺量膝关节到基准面的距离读两边的编码器值差值写进零位偏置表。脚掌用平板平台加塞尺检查两侧高度差控制在 0.2 mm 以内。5.3 落地瞬间脚掌打滑机身横向甩现象每次摆动腿触地支撑脚会往内侧滑一下ZMP 曲线出现尖峰。原因落地瞬间足端还带有水平速度加上触地时刻的冲击让踝关节反向弹了一下。步长越大、抬脚越低这个现象越明显。解决在摆动相最后 20% 把足端水平速度降到 0.15 m/s 以下落地后给踝关节 20 ms 的位置保持锁定。另外检查脚底材料硬质橡胶在光滑地面上的摩擦系数可能只有 0.4换成软一些的材料能到 0.7打滑明显减少。5.4 仿真走得好实机走两步就趴现象同一套参数仿真跑一分钟不倒也实机撑不过三秒。原因最大的差异是关节延迟和柔性。仿真里关节指令是瞬时到位的实机上有 5~15 ms 的通信加驱动延迟还有减速器的扭转柔性。延迟在闭环里等同于相位滞后稳定裕度被吃掉一大截。其次是仿真里地面是理想刚性平面实机地面有微小起伏。解决在仿真模型里加一段纯延迟10 ms 起步和一阶关节柔性环节重新调增益同时把仿真里的地面加入 ±2 mm 的随机起伏。改完之后仿真里能稳定走实机成功率会高很多。这条我踩过不止一次现在默认仿真比实机乐观 30%。5.5 站立时缓慢下沉一分钟下降 5 mm 以上现象静止站立时机身高度单调下降不抖不震就是在沉。原因重力补偿只补偿了模型里的连杆质量没有覆盖线束、螺丝、传感器这些「没算进去的重量」。整机 3.5 kg漏算 200 g 就是 5% 的力矩缺口位置环靠积分项慢慢补表现就是缓慢下沉。解决把整机放在秤上称跟模型里的质量对比差值分摊到各连杆。也可以用实测关节电流反推实际重力矩在几个固定姿态下采点做一张补偿表比纯模型补偿准得多。6. 仿真到实机三段验证和一个必须养成的习惯参数调完不等于能用从上电到连续行走中间要过三道关每一道都设明确的通过判据不达标就不往下走。阶段做法通过判据常见拦截项单腿吊装整机吊起只跑摆动腿轨迹关节跟踪误差 1°无异常噪音零位偏、线束干涉原地踏步双支撑架护住跑完整步态但不前进ZMP 全程在支撑多边形内裕度 15 mm踝策略增益过大限幅行走步长 0.05 m、周期 1.2 s逐步提速连续 20 步不触发保护落脚点规划滞后三段验证里最值钱的是第二段原地踏步。很多问题在吊装阶段看不出来因为腿没承重一承重重力补偿的误差、踝 roll 的耦合、足底传感器的零点漂移全冒出来了。原地踏步跑够 5 分钟不触发保护再放开走成功率会高得多。最后说一个习惯黑匣子日志。每个控制周期把关节指令、关节反馈、IMU 姿态、足底力、ZMP、当前步态相位写进一块环形缓冲区容量按 30 秒设计触发保护或者跌倒时自动落盘。双足摔倒往往就在 200 ms 内事后凭记忆复现根本不可能没有日志就只能靠猜而猜测的代价是重新跑一遍所有参数。我现在的习惯是日志字段只增不减加一个新参数就加一列宁可文件大一点也不要某次翻车时发现缺了关键那一列。这套流程走下来从零到能连续走二十步一个人大概要两到三周其中一半时间花在标定和整定上写代码反而是最快的部分。急着一上来就跑步态的基本都会在第五步摔跟头。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑