
上一节4500元手搓一台会走路的人形机器人|第 13 章 跨步恢复被推倒时如何自救第四部分平衡控制算法第 14 章 抬脚与重心转移细节决定成败 从双脚站立到单脚支撑每一步都如履薄冰14.1 原地跨步的关节验证第13章讲了跨步恢复的整体框架。但在写代码让机器人迈步之前我犯了一个错误——直接写代码结果要么抬脚太低拖地要么抬太高失去平衡。折腾了好几天才发现问题不在代码在姿势。我应该先用关节测试工具验证每个关节在抬腿时应该到什么角度。关节测试工具可以逐个关节、逐个角度地发送指令实时观察机器人姿态。抬腿验证的流程先让机器人进入站立姿势然后手动调整抬腿腿的膝关节21→50度、髋关节前摆-5→15度、踝关节-11→0度最后用手推测试稳定度。花了大概半天但值——一旦确定了标准姿势代码只需复现不需要反复试错。经过反复测试确定的抬腿姿势如下关节站立姿势抬腿姿势变化量说明膝关节 (knee)21°50°29°弯曲抬腿提供主要抬腿高度髋关节前后 (hip_pitch)-5°15°20°前摆大腿控制迈步方向踝关节前后 (ankle_pitch)-11°0°11°保持脚掌水平防止戳地髋关节侧向 (hip_roll)8°8°0°保持不动维持左右稳定踝关节侧向 (ankle_roll)-8°-8°0°保持不动维持左右稳定膝关节从21°到50°让脚掌离地约3-4cm——足够越过地面不平整又不会太高。髋关节前摆20°大腿前送约10-15cm。侧向关节保持不动因为抬腿是前后方向的动作。其实不只是抬腿站立的参考姿势第12章讲的踝-11°、腰-9°等也是通过关节测试工具先验证的。这个「先验证再编码」的流程是我整个项目中最重要的工作习惯——把「猜」变成了「验」。抬腿姿势不是算出来的是试出来的。关节测试工具让你在写代码之前就知道每个关节应该到什么角度。这个「先验证再编码」的流程帮我省了无数调试时间。14.2 重心转移的实战第13章讲了重心转移的理论——用ZMP反馈控制把重心从双脚中心移到支撑脚上。这一节讲实战细节。14.2.1 从双脚到单脚的过程重心转移不是瞬间动作而是持续约0.5-1.0秒的渐进过程。具体步骤初始状态ZMP在双脚中心两只脚压力各约50%。开始转移髋关节侧向缓慢调整。要抬右脚时左髋微外展、右髋微内收把上半身重心往左移。持续监测每10ms读取一次ZMP如果偏离目标方向就微调髋关节角度。到达目标ZMP到达支撑脚掌中心支撑脚承受95%以上体重。稳定确认ZMP在目标位置停留至少200ms后才允许抬脚。14.2.2 ZMP追踪控制器我用代码实现了一个ZMP追踪PID控制器核心逻辑比较当前ZMP和目标ZMP用误差驱动髋关节侧向移动。# ZMP追踪控制器核心逻辑# 比较当前ZMP和目标ZMP用误差驱动髋关节侧向移动zmp_errortarget_zmp-current_zmp hip_roll_adjustKp_zmp*zmp_error \Kd_zmp*zmp_error_rate# 限制调整速度防止过快导致重心冲过头hip_roll_adjustmax(-max_speed,min(max_speed,hip_roll_adjust))ZMP追踪参数Kp_zmp 0.3每1cm误差调整髋关节0.3°Kd_zmp 0.05max_speed 0.3 rad/s。这些参数比站立平衡的PD参数慢因为ZMP追踪可以接受50-100ms级响应不需要10ms级。14.2.3 双重确认抬脚时机我同时使用两个信号判断是否可以抬脚ZMP在支撑脚内且被抬脚的压力降到初始值的10%以下并持续100ms。ZMP是计算值有延迟和噪声压力传感器是直接测量——「脚上没压力了」就是最直接的信号。两者必须同时满足双重确认确保万无一失。脚底板离地的时机不能只靠ZMP判断。ZMP是计算值有延迟压力传感器是直接测量更可靠。两者同时满足才允许抬脚。14.3 抬脚的机械实现确定了抬腿姿势完成了重心转移现在可以真正抬脚了。但「抬脚」不是「把三个关节角度设为目标值」这么简单——速度、加速度、协同顺序每个细节都影响成败。14.3.1 抬脚指令的分步启动抬脚时三个关节不是同时到达目标角度的而是有先后顺序第一步膝关节先弯曲。 从21°到50°约0.3秒把脚从地面提起。此时髋关节和踝关节保持不动。第二步膝关节弯到一半时髋关节开始前摆。 从-5°到15°约0.3秒。此时小腿继续弯曲大腿同时前送。第三步髋关节前摆到一半时踝关节开始调整。 从-11°到0°约0.2秒让脚掌保持水平。此时三个关节同时动作完成抬腿。如果三个关节同时启动重心会突然变化容易失衡。分步启动虽然总时间稍长但每个阶段只有1-2个关节在动重心变化更平滑。14.3.2 速度和加速度限制全速转动会导致惯性晃动、多关节合力推倒机器人、齿轮冲击。所以我对抬脚做了限制最大角速度 0.5 rad/s最大角加速度 2.0 rad/s²。膝关节从21°到50°29°变化最快约1秒从静止加速到最大速度需约0.25秒。这些限制让抬脚从「啪」一下变成「缓缓抬起」稳定性大大提高。14.3.3 落脚缓冲与稳定性恢复落脚缓冲分三级快速下落脚掌2cm膝0.3 rad/s→ 缓冲减速1-2cm降至0.1 rad/s→ 轻柔触地1cm降至0.05 rad/s。全过程约0.7-1.0秒是落脚后不弹跳的关键。这部分在第13章已有详细展开这里不再重复。脚落地后机器人还需要0.5-1.0秒的调整期。期间PD控制器以较高增益快速把ZMP拉回中心重心从单脚恢复到双脚均匀承重。当ZMP回到双脚中心且压力分布恢复到50%±10%时切换回正常站立PD参数完成整个恢复流程。抬脚不是关节的简单组合而是有顺序的协同。膝先弯、髋再摆、踝最后调。分步启动比重心同时变化更安全。14.4 避坑清单抬脚和重心转移的坑主要集中在细节上。每一个坑都伴随着至少一次摔倒。序号坑现象原因解决1未验证抬腿姿势就写代码抬腿时姿态怪异关节角度不合适先用关节测试工具验证2三关节同时启动抬腿瞬间机器人晃动重心突变膝先弯再髋后踝分步启动3抬脚速度太快抬腿过程中失衡惯性过大限速0.5 rad/s4仅靠ZMP判断抬脚时机ZMP显示OK但抬脚后倒ZMP计算有延迟加压力传感器双重确认5压力阈值太高抬脚时脚还有压力未完全卸载就抬脚压力小于10%才允许6落脚无分级缓冲落脚冲击大机器人弹跳单速下落三级缓冲快中慢7落脚后立刻切换参数参数切换导致抖动重心未恢复就切换落脚后等待0.5-1.0s调整期8抬腿时侧向关节动了左右方向失衡侧向关节参与前后动作侧向关节保持不动9踝关节未调整脚尖戳地脚掌未保持水平踝关节调至0°10迈步距离过大重心超出支撑面步幅超过关节活动范围正常迈步10-15cm抬脚和重心转移是双足机器人最核心的动作基元。走路、上下楼梯、跨障碍——所有这些高级动作都是抬脚和重心转移的组合。把这两个基础动作做好后面的一切都会容易很多。第14章 完第四部分完结 | 下一部分参数调优与数据驱动