首页 / 资讯中心 / 文章详情

16舵机双足机器人:从零件清单到步态调参的完整落地笔记

16舵机双足机器人:从零件清单到步态调参的完整落地笔记 ★ FEATURED ARTICLE
简介这是一份面向机器人爱好者与嵌入式学习者的16舵机双足机器人完整工程资料涵盖机械结构、电路设计与程序控制多个层面适合希望动手实践舵机驱动、步态算法与无线遥控的中高级开发者参考。压缩包共147个文件约3.72MB以PCB与原理图文件为主包含49个pcb、44个sch及配套的prjpcb、schlib、pcblib等设计源文件另有6个C语言源码、12个头文件及若干PDF说明文档完整呈现了从电路到固件的开发链路。资源围绕16路舵机的独立PWM控制展开涉及电源分配、滤波保护、多通道驱动设计并给出基于嵌入式微控制器的角度设定、速度控制与运动序列规划思路同时包含nrf24l01无线通信模块的收发配置与步态算法实现。目前已有489人学习下载读者可据此理解舵机工作原理、电路设计要点与双足行走的运动学计算获得一套可复用的机器人项目参考方案。1. 16舵机双足机器人从零件清单到步态调参的完整落地笔记16舵机双足机器人指的是用 16 个舵机搭出两条腿、每条腿 8 个自由度的双足行走平台。相比常见的 12 舵机方案每腿 6 自由度多出来的 4 个自由度通常分配给髋部侧摆和踝部侧摆换来的是更接近人形的步态和更强的抗侧向扰动能力。这套资源适合已经玩过舵机云台、想往动态行走方向走一步的开发者也适合拿它当机器人课程设计或毕设实物的同学。它不涉及复杂的强化学习训练核心是把机械结构、舵机控制、逆运动学和步态相位这四件事串起来。我拆完这套东西最大的感受是机械装得再漂亮步态参数没调对它照样原地抽搐。2. 机械结构与舵机选型16 个自由度怎么分配才不打架2.1 每条腿 8 自由度的物理含义先把自由度分配说清楚不然后面写逆运动学会对不上号。常见的 16 舵机分配是每条腿 8 个髋部 3 个前摆、侧摆、旋转、膝部 1 个、踝部 3 个前摆、侧摆、旋转、再加一个脚趾或辅助关节。但实际做的时候脚趾关节对行走帮助有限很多方案会把第 8 个舵机放在髋部侧摆的并联结构上用来增强侧向支撑。我一般建议新手按这个顺序分配关节位置舵机编号左腿舵机编号右腿主要作用髋前摆19决定抬腿高度髋侧摆210决定左右重心转移髋旋转311决定脚尖朝向膝弯曲412决定腿长和蹲起踝前摆513决定脚掌俯仰踝侧摆614决定脚掌内外翻踝旋转715辅助转向辅助/脚趾816可选增强抓地这个分配的好处是左右腿编号对称写代码时可以用一个循环处理两条腿offset 0和offset 8就区分开了。2.2 舵机选型扭矩比速度更重要双足机器人最容易翻车的地方就是舵机扭矩不够。静态站立时每条腿要承受整机重量动态行走时单腿支撑阶段的瞬时扭矩可能是静态的 2 到 3 倍。我见过太多人用 20kg·cm 的舵机搭出来一站上去膝盖就软了。选型时按这个公式估算单腿静态扭矩 ≈ 整机重量 × 重心到髋关节的水平距离 / 2 动态峰值扭矩 ≈ 静态扭矩 × 2.5假设整机 2kg重心到髋关节水平距离 5cm那静态扭矩约 0.5kg·cm看起来很小但这是理想情况。实际因为杠杆臂、关节摩擦、加速度选 15kg·cm 以上的金属齿舵机比较稳妥。常见做法是髋部和膝部用 20kg·cm 级别踝部用 15kg·cm 级别辅助关节可以降到 9g 舵机。提示舵机标称扭矩通常是堵转扭矩实际工作扭矩建议取标称值的 1/3 到 1/2留足余量。2.3 结构件的三个硬约束机械结构上有三个地方必须卡死否则后面调步态会怀疑人生。第一舵机轴与关节轴必须同轴。很多 3D 打印件为了省空间用连杆把舵机输出轴偏置出去结果一受力就产生额外弯矩舵机齿轮很快扫齿。正确做法是舵机输出轴直接驱动关节或者用同步带/齿轮做等速传动。第二大腿和小腿的长度比建议在 1:1 到 1:1.2 之间。太长的小腿会让重心偏高行走时左右晃动加剧太短则抬腿高度不够容易绊到地面。第三脚掌面积要足够。脚掌长度建议不小于小腿长度的 40%宽度不小于整机宽度的 60%。脚掌太小侧向稳定性极差走两步就倒。3. 控制框架搭建从 PCA9685 到逆运动学解算3.1 舵机驱动板与供电分离16 个舵机同时动作电流峰值能到 10A 以上。如果直接从主控板取电轻则复位重则烧板。标准做法是舵机电源和逻辑电源完全分开舵机用 2S 锂电或 6V 镍氢电池组经大电流降压模块供电主控板用独立的 5V USB 或另一块小电池。驱动板常用 PCA968516 路 PWM 刚好对应 16 个舵机。接线时注意舵机地线和主控地线必须共地否则 PWM 信号没有参考电平舵机会乱抖。# PCA9685 初始化与舵机角度映射 import board import busio from adafruit_pca9685 import PCA9685 from adafruit_motor import servo import time i2c busio.I2C(board.SCL, board.SDA) pca PCA9685(i2c) pca.frequency 50 # 舵机标准 50Hz # 16 个舵机对象通道 0-15 servos [] for ch in range(16): s servo.Servo(pca.channels[ch], min_pulse500, max_pulse2500) servos.append(s) def set_angle(ch, angle): 角度限幅防止舵机撞机械限位 angle max(0, min(180, angle)) servos[ch].angle angle # 上电先回中位避免突然大角度动作 for ch in range(16): set_angle(ch, 90) time.sleep(0.02)这段代码的关键在min_pulse和max_pulse。不同品牌舵机的脉宽范围不一样常见的有 500-2500us 和 600-2400us 两种。如果设错了会出现舵机到达 0 度或 180 度时还在吱吱响、堵转发热的情况。我一般会先单独测试一个舵机从 500 到 2500 慢慢扫找到它实际能到的两个极限再填进去。3.2 逆运动学解算把脚的位置翻译成关节角度双足行走的核心是逆运动学给定脚掌在空间中的目标位置反算出髋、膝、踝的角度。对于每条腿的矢状面前后方向可以简化成二连杆模型。import math def leg_ik(target_x, target_z, l1, l2): 矢状面二连杆逆运动学 target_x: 脚相对髋的前后距离向前为正 target_z: 脚相对髋的垂直距离向下为正 l1: 大腿长度 l2: 小腿长度 返回: (髋前摆角度, 膝弯曲角度, 踝前摆角度)单位度 # 目标距离 dist math.sqrt(target_x**2 target_z**2) # 可达性检查 if dist l1 l2: dist l1 l2 - 0.01 # 限幅到最大可达 if dist abs(l1 - l2): dist abs(l1 - l2) 0.01 # 余弦定理求膝角 cos_knee (l1**2 l2**2 - dist**2) / (2 * l1 * l2) cos_knee max(-1, min(1, cos_knee)) knee math.acos(cos_knee) # 膝关节内角 # 髋角 alpha math.atan2(target_x, target_z) cos_beta (l1**2 dist**2 - l2**2) / (2 * l1 * dist) cos_beta max(-1, min(1, cos_beta)) beta math.acos(cos_beta) hip alpha beta # 踝角保持脚掌水平 ankle math.pi - knee - hip return math.degrees(hip), math.degrees(knee), math.degrees(ankle)参数说明l1和l2是实测的大腿和小腿长度单位要和target_x、target_z一致。target_z向下为正所以站立时target_z约等于l1 l2的 90% 到 95%留一点弯曲量避免膝关节完全伸直导致解算奇异。这个解算每帧都要跑16 个舵机里真正参与逆运动学的是每条腿的髋前摆、膝弯曲、踝前摆这 3 个共 6 个。剩下的 10 个舵机负责侧摆、旋转和辅助通常用预设角度或简单正弦补偿。3.3 步态相位把行走拆成四个阶段双足行走的步态周期一般分成四个阶段左腿支撑右腿摆动、双腿支撑、右腿支撑左腿摆动、双腿支撑。每个阶段脚掌的目标轨迹不一样。我常用的是椭圆轨迹加抬脚高度补偿def foot_trajectory(phase, stride, lift, height): 生成单脚在一个步态周期内的轨迹 phase: 0-1 的相位 stride: 步幅前后方向 lift: 抬脚高度 height: 站立时脚相对髋的垂直距离 返回: (x, z) 脚相对髋的位置 if phase 0.5: # 支撑相脚从后往前移动贴地 t phase / 0.5 x -stride/2 stride * t z height else: # 摆动相脚抬起再落下 t (phase - 0.5) / 0.5 x stride/2 - stride * t z height - lift * math.sin(math.pi * t) return x, z支撑相时脚贴地相对髋部向后移动实际上是身体在往前推。摆动相时脚抬起避免拖地。lift一般取 2 到 4cm太小容易绊太大则重心晃动加剧。两条腿的相位差固定 0.5即左腿相位为p时右腿相位为p 0.5。这样自然形成交替支撑。4. 步态调参与常见问题排查4.1 参数整定顺序先站后走先慢后快调参必须按顺序来跳步会浪费大量时间。我的习惯是第一步调站立姿态。让两条腿对称弯曲脚掌完全着地重心投影在双脚支撑多边形中心。这一步只动髋前摆、膝弯曲、踝前摆把target_z从最大慢慢减小直到机器人稳定站立不晃。第二步调重心转移。让机器人左右交替转移重心但不迈步。观察髋侧摆舵机的角度范围确保重心能完全移到单脚上方。这一步侧摆角度通常需要 ±8 到 ±15 度。第三步调单腿摆动。固定一条腿支撑另一条腿按轨迹摆动先不落地看轨迹是否平滑、有没有撞到支撑腿。第四步合起来慢速行走。步频从 0.5Hz 开始步幅从 3cm 开始稳定后再逐步加大。4.2 常见问题排查现象一上电后舵机全部抖到极限位置。原因PWM 信号地线没共地或者min_pulse/max_pulse设错导致角度映射完全偏移。 解决先万用表确认主控和舵机电源共地再单独测试一个舵机手动给 90 度看是否回中。如果回中正常再检查min_pulse和max_pulse是否匹配舵机手册。现象二站立时膝盖舵机发热严重。原因膝关节完全伸直舵机持续堵转出力。 解决把站立时的target_z减小 5% 到 10%让膝盖保持微弯。微弯状态下舵机出力小且抗扰动能力更强。现象三行走时左右晃动越来越大最后摔倒。原因重心转移相位和迈步相位没对齐或者侧摆角度过大导致过冲。 解决检查两条腿的相位差是否为 0.5侧摆角度先减半确认能稳定走再慢慢加回去。常见做法是在侧摆信号上加一个低通滤波抑制高频晃动。现象四脚掌落地时啪嗒响舵机齿轮很快扫齿。原因摆动相结束时脚掌速度不为零硬着陆产生冲击。 解决在摆动相最后 20% 的相位里把z的下降速度放缓让脚掌接近地面时速度趋近于零。可以在轨迹函数里加一个平滑项。现象五走直线时越走越偏。原因左右腿的舵机中位不一致或者机械安装有微小偏差。 解决在代码里给每条腿加独立的零位偏移量通过实验测出偏移值。我一般会让机器人走 10 步量偏移距离然后按比例修正。注意调参过程中随时准备断电。双足机器人摔倒时舵机可能堵转长时间堵转会烧舵机或驱动板。5. 进阶技巧用 IMU 做闭环补偿与步态验证5.1 IMU 反馈抑制俯仰振荡纯开环步态在平整地面能走但稍微有点坡度或地面软硬不均就会前倾或后仰。加一个 MPU6050 或 BMI160 做俯仰角反馈能显著提升稳定性。思路很简单读取俯仰角如果身体前倾超过阈值就微调支撑腿的踝前摆角度把重心拉回来。def balance_compensate(pitch, target_pitch0, kp0.8, kd0.2): 俯仰角 PD 补偿输出踝关节修正量 pitch: 当前俯仰角度 target_pitch: 目标俯仰角通常为 0 kp, kd: PD 参数 global last_pitch error target_pitch - pitch d_error error - last_pitch last_pitch error correction kp * error kd * d_error # 限幅避免修正过猛 correction max(-10, min(10, correction)) return correction这个修正量加到支撑腿的踝前摆角度上。kp从 0.5 开始试kd从 0.1 开始太大都会引起振荡。IMU 安装位置尽量靠近整机重心减少振动耦合。5.2 用串口波形验证步态相位调步态时肉眼很难判断相位对不对。我习惯把关键变量通过串口打出来用上位机画波形。至少打这几个量左腿相位、右腿相位、左髋前摆角度、右髋前摆角度、俯仰角。验证标准是两条腿的髋前摆角度应该呈反相正弦相位差接近 180 度俯仰角应该在 ±3 度以内波动。如果俯仰角波动超过 5 度说明重心转移和迈步没对齐需要回去调侧摆和步频。5.3 步态参数速查表参数初始值稳定范围影响步频0.5Hz0.8-1.5Hz越高越快但越不稳步幅3cm5-10cm越大越快但重心晃动大抬脚高度2cm2-4cm太小绊脚太大晃侧摆角度±8度±8-15度太小重心移不过去站立膝弯5%5-10%太小堵转太大没力俯仰补偿 kp0.50.5-1.2太大振荡俯仰补偿 kd0.10.1-0.3抑制超调这张表是我调了多台机器后总结的起点值具体机器还要微调。我的习惯是每次只改一个参数改完走 10 步记录偏移和稳定性再改下一个。从那以后我每次调新步态都强制走一遍「站立-重心转移-单腿摆动-慢走」的流程不再跳步。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站