ARTICLE DETAIL

资讯详情

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

双足机器人步态控制实战:从MicroDuck装配到舵机调参全攻略

双足机器人步态控制实战:从MicroDuck装配到舵机调参全攻略 “MicroDuck机器鸭是我从零件堆里重新搭起来的那只巴掌大的小东西”。如果你拿到手的是散件大概率会经历和我一样的困惑明明照着图装好了接上电舵机也转可把它放到地板上就是不走或者歪歪扭扭跑不了直线。这篇文章就是把我从装配到真正走起来的完整过程写清楚包括步态原理、零件选型、接线方式、程序逻辑以及我在调参时踩过的坑。适合准备装MicroDuck、已经装好但走不起来的玩家或者单纯想搞一只小型双足机器鸭练手的创客。1. 先搞懂鸭步的本质再决定怎么装1.1 两条腿为什么比四条腿难搞大多数刚开始玩机器人的朋友会觉得四条腿比两条腿难做实际上正好相反。四足机器人哪怕只有很简单的直线步态也能靠另外几条腿维持平衡而两足机器人天生就是“不稳定系统”每走一步都要处理重心落在哪个支撑点上、另一条腿能不能及时接住重量。鸭子看起来可爱但它的行走方式特别不节约能量身体会左右摇晃每迈一步都要把重心从一只脚转移到另一只脚。MicroDuck作为一只微型机器鸭如果完全照搬真实鸭子的动态步态需要高精度舵机、惯性传感器和实时平衡算法这个复杂度对入门级项目来说完全不划算。所以MicroDuck选择了“宁可难看也要能走”的策略不追求每一步都稳稳抬腿而是用往复摆动加定向摩擦把行走变成一种“划行式”运动。两只脚交替向后扒地身体被推着往前走。视觉上身体会随着左右腿交替自然扭动反而意外地像鸭子。1.2 MicroDuck的机械布局与零件选型我手里的MicroDuck是一套3D打印散件包含机身、头部、两条腿、两个舵机安装座另外需要自己配舵机、主控板和电池。下面是完整零件清单。部件规格数量说明3D打印机身PLA材质1套壳体分为左右半身、底盘、头部舵机MG90S 9g金属齿轮2左右腿各一个金属齿更耐用主控板Arduino Nano兼容板1体积小引脚够用电池3.7V锂电池或186501搭配升压模块使用升压模块USB 5V/2A输出1把3.7V升到稳定的5V舵机摇臂与螺丝M2/M3规格若干套件一般自带丢了可以买标准舵机配件脚掌垫魔术贴钩面或方向性刷毛2关键材料后面详谈杜邦线公对公若干连接主板与舵机选MG90S而不是便宜的SG90是吃过亏后的选择。SG90是尼龙齿轮在舵机堵转或者腿被卡住时很容易扫齿扫一个齿整个舵机就报废了。MG90S的金属齿轮在同样价位下耐用得多虽然扭矩参数看起来差不多但实际扛冲击能力好不少。3D打印参数我也给你一个可复现的基线PLA耗材层高0.2mm外壳壁厚1.2mm填充30%-40%。不需要高填充因为MicroDuck本身很轻填充太高反而增加重量让舵机负担变大。打印完成后把所有活动关节位置的打印层纹用砂纸轻轻过一遍特别是舵机安装孔和腿部转轴孔这步能避免后面装配时舵机被卡。1.3 为什么选“划行式”步态而不是抬腿迈步普通舵机只能在一个角度范围内往复摆动不能连续旋转。如果你真的想让机器鸭像动物一样抬腿、悬空、前迈最少需要每条腿两个舵机一个负责前后摆一个负责抬腿总共四个舵机。四个舵机带来的重量、控制逻辑和电源需求会让MicroDuck从“简单好玩”变成“复杂难调”。MicroDuck用单舵机驱动单腿舵机来回摆动时腿末端在地面画一道弧线。如果脚掌底面是普通平面往前摆和往后摆产生的摩擦一样结果是鸭子原地做操身体纹丝不动。解决办法在脚掌材料让脚掌在一个方向上抓地力大反方向上滑动阻力小。这样腿向后扒地时脚掌死死抓住地面把身体推向前腿向前回摆时脚掌打滑轻轻滑回前方不产生反方向拉力。这就意味着MicroDuck真正能走起来机械结构只占一半另一半取决于你给脚掌贴了什么材料。我测试过很多组合最稳定的是魔术贴的钩面也就是偏硬、带小钩的那一面把它贴在脚掌底面。在短毛地毯上钩面朝后扒地时阻力非常大往前走时阻力小鸭子跑起来特别干脆。没有魔术贴的话用硬鬃毛刷条也可以但要保证毛是朝后倾斜的。2. 装配顺序与三个必须对齐的“零位”2.1 先装躯干骨架别急着上舵机很多新手把舵机往机身里一塞就开始装外壳结果线被压住、舵机孔对不准返工非常痛苦。我的建议是先把机身主体拼起来不要上螺丝只是确认左右半身能合上、头部卡扣能到位。MicroDuck的机身结构不复杂但打印件之间多少有公差先干拼一次能让你知道哪几个位置需要打磨。干拼之后再拆开先装舵机安装座。注意左右两个舵机的安装方向是完全镜像的左右腿才能对称运动。装舵机的时候把舵机线从机身预留的线孔穿出去再固定螺丝。这一点特别容易踩坑如果先把舵机放进去再穿线舵机线出线孔会被挡住硬拽很容易把线皮扯破。装好两个舵机座之后把左右半身合拢用套件配的螺丝固定。这个阶段不需要把头部装上去头部留在最后原因后面会说。2.2 舵机零位对齐最容易被忽略的一步这是整个装配过程里最关键的细节没有之一。舵机靠PWM信号控制角度但它自己不会记住零位在哪里需要你在程序里让它转到90度中位之后再把摇臂或者腿部机构装上去。如果你在舵机没有通电回中的情况下直接装腿两条腿的初始位置大概率一高一低、一前一后。后面程序写得再漂亮鸭子也跑不直。具体做法先写一个最简程序让舵机转到90度。#include Servo.h Servo myServo; void setup() { myServo.attach(9); myServo.write(90); } void loop() { }把这个程序先烧录进Arduino Nano接上9号引脚对应的舵机等它转到90度并稳定下来再在输出轴上装摇臂。装摇臂时让腿大概垂直于地面朝下左右两条腿在这个状态下保持对称。这里会有个微小偏差不过没关系后面步态程序里有center参数可以微调。重复一次把第二个舵机也接到10号引脚同样回中再装腿。两边都装好之后从正上方俯视两条腿应该处于镜像对称的位置。如果明显不对称松开摇臂螺丝重新对。2.3 腿部与脚掌安装微调“步幅”上限MicroDuck的腿部是一个带安装孔的打印件一端套在舵机摇臂上另一端固定脚掌。这个腿部打印件的形状决定了舵机摆到极限角度时脚在地面的位置。我建议第一次装的时候不要把摇臂角度装到极限先装成腿垂直朝下就好后面通过程序控制摆动幅度。脚掌是一个扁平的鸭蹼造型面积比普通小机器人的脚大不少这是故意设计的。脚掌面积大意味着鸭子在摆动过程中重心的投影更不容易落到支撑脚以外翻车概率大幅下降。脚掌底面清洁干净之后贴上魔术贴钩面钩面方向要让脚掌向后扒地时抓地、向前回摆时打滑。贴完魔术贴从侧面观察一下两脚高度差不能超过2毫米。如果差太多检查舵机摇臂安装位置是不是没对准不要在脚掌下面垫东西硬找平那会让步态变扭。2.4 头部和配重重心位置决定稳定上限头部最后装不单纯是为了方便理线更主要是因为它会影响重心。MicroDuck的头部在躯干最前方装好以后会把重心明显往前带。重心太靠前鸭子走起来会不断往前方扎甚至往前走一两步就开始低头拖地。正确做法是先把整机装到不含头部的状态放在桌面注意是改成短毛地毯上测试一下重心用手指捏住机身左右的对称中线位置看鸭子能不能水平。一般来说电池放在机身尾部就能平衡头部重量。3.7V锂电池体积小正好可以塞进尾部电池仓如果尾部空间不够在尾部加一小块配重泥或者一颗M3螺丝也能解决问题。头部装上以后再复查一次重心位置。如果前倾把配重往尾部加如果后仰说明电池太重检查是否用了过大的18650。MicroDuck这类小车我觉得用14500锂电池就足够了重量轻很多。3. 接线与上电先让腿听指挥3.1 电路连接的正确姿势MicroDuck的电路是我见过最简单的一种但供电部分特别容易翻车。两个MG90S舵机正常工作电流在200-400mA之间堵转瞬间可能冲到700mA甚至更高。两个舵机同时动作峰值电流轻松超过1A。如果让Arduino Nano那枚小小的5V稳压芯片直接给舵机供电稳压芯片会过热主板直接重启鸭子走两步就“死机”。我推荐的供电方式3.7V锂电池正负极接到升压模块的输入。升压模块输出调到5V用一根杜邦线把5V和GND分别接Arduino Nano的5V引脚和GND引脚。两个舵机的红线正极并联在一起接升压模块5V黑线并联接GND。左舵机信号线接D9右舵机信号线接D10。这里要解释一下为什么舵机可以直接接“Nano的5V引脚”而不是“VIN”。Nano上的AM1117稳压芯片输入输出电压有个压差如果你给VIN通5V稳压芯片内部会产生额外压降输出可能只有4V多。直接接5V引脚等于绕过稳压芯片前提是升压模块输出足够稳。买升压模块的时候不要买那种几块钱的纯升压小板要买带稳压和过流的USB升压模块输出电流至少标2A。3.2 用自检程序确认舵机转向两个舵机装好、线接完之后先别急着跑步态程序把每个舵机单独测一遍。我通常会用下面这段代码分别测试两个舵机在不同引脚上的反应#include Servo.h Servo testServo; void setup() { testServo.attach(9); } void loop() { testServo.write(70); delay(1000); testServo.write(110); delay(1000); }把这段代码烧进去观察左舵机从70度转到110度时左脚是向前摆还是向后摆。记下这个方向然后用同样方法测试右舵机。如果发现两个舵机方向相反不用改线后面程序里用角度符号控制就行。这一步的主要目的是确认舵机没有堵转、没有异响以及确认摇臂没有打到机身内壁。需要注意的是舵机自检时要把它放在桌面上悬空不要让腿接触地面。腿上贴的魔术贴钩面如果在地面蹭来蹭去会增大负载造成误判。3.3 电流声、抖动与复位供电不足的三个信号如果你上电以后发现舵机发出高频电流声、动作一顿一顿或者Arduino Nano上的LED灯偶尔闪一下又亮起来基本可以断定是供电不足。这个问题在MicroDuck这种双舵机小车上太常见了。我建议先把电池充满再测试。锂电池在低电量状态下内阻升高即使升压模块标称5V输出大电流时电压也会明显跌落。其次是检查所有杜邦线是否插紧特别是GND回路。舵机和大电流设备最怕虚接地地线接触不良会导致整个系统电压漂移表现为舵机抽风、主控反复重启。还有一种容易被忽略的情况升压模块和小电池之间用了又细又长的杜邦线线阻太大。我后来直接换成了短粗的硅胶线连接电池和升压模块问题立刻消失。对MicroDuck这种电流不算小的项目电源路径上的每一段线最好不要超过10厘米线径建议26AWG以上。4. 鸭步程序从相位差到摇摆姿态4.1 步态逻辑的核心左右腿相位差180度MicroDuck的步态我用一句话总结两条腿在做完全相反的运动一条腿向前回摆时另一条腿向后扒地。这就是标准的“半周期交替”步态也是双足机器人能往前走的最简单逻辑。舵机角度需要先定义清楚。我默认90度是腿垂直朝下的中位。angle增大时腿向前摆angle减小时腿向后摆。实际舵机方向可能和你装的不一致没关系你可以调整程序里的正负号。两只腿的运动关系是左腿角度90 a右腿角度90 - a其中a是一个在-25度和25度之间来回变化的数值。当a从-25增加到25时左腿从后摆到前右腿从前摆到后右腿在这个半拍里负责扒地推进当a从25减少到-25时左腿从前摆到后负责扒地推进右腿从后摆到前回到初始位置。这种写法天然保证了左右腿动作完全相反而且在任意时刻两条腿的角度都不同避免了“两腿同向卡住”的情况。4.2 完整可用的MicroDuck行走程序下面是我在MicroDuck上验证过的第一版能走的程序。它简单但足够让鸭子在地毯上直线前进。#include Servo.h Servo leftServo; Servo rightServo; const int leftCenter 90; const int rightCenter 90; const int swingAngle 25; // 摆动幅度单位度 const int moveDelay 15; // 角度变化间隔单位毫秒 const int angleStep 2; // 每次变化度数 void setup() { leftServo.attach(9); rightServo.attach(10); leftServo.write(leftCenter); rightServo.write(rightCenter); delay(1000); } void loop() { // 前半周期右腿向后扒地左腿向前回摆 for (int a -swingAngle; a swingAngle; a angleStep) { leftServo.write(leftCenter a); rightServo.write(rightCenter - a); delay(moveDelay); } // 后半周期左腿向后扒地右腿向前回摆 for (int a swingAngle; a -swingAngle; a - angleStep) { leftServo.write(leftCenter a); rightServo.write(rightCenter - a); delay(moveDelay); } }第一次跑这个程序鸭子可能纹丝不动也可能向前挪动一丁点就停。先不要急这不是程序逻辑问题而是物理参数需要调整。把moveDelay改小步频变快如果鸭子直接打滑说明脚掌摩擦力不够或者摆动幅度太大。最理想的节奏是每半周期大约300毫秒也就是说moveDelay15、angleStep2时一个完整周期大约750毫秒。这个速度下鸭子是一步一步稳稳往前蹭的姿态很接近鸭子那种左摇右晃的样子。跑顺手以后再慢慢提速。4.3 三个参数分别控制什么步态程序里最重要的三个参数swingAngle、moveDelay、angleStep它们控制的完全不是同一件事。swingAngle是步幅。建议起始值25度如果鸭子原地划水、前进距离很小就加到30度、35度。但不要超过40度因为舵机摆到极限位置时腿会碰机身舵机会突然堵转发出刺耳的声音然后电流飙升。一旦发现这个声音立即回中并减小角度。moveDelay是速度。它越小鸭子走得越快。但是步频太快时脚掌在地面的接触时间变短摩擦材料来不及建立足够的抓地力反而会打滑。我曾经把moveDelay从15改成8结果鸭子从“正常走”变成“原地蹦迪”后退效果比前进效果还明显。angleStep是角度变化粒度。用1到3度都可以数值越小舵机运动越平滑但程序循环更长实际步频会降低。microDuck这种9g舵机本身精度有限angleStep用2度就够了没有必要用1度。调试的时候一定要一次只改一个参数改完跑三步记录现象。不要同时调两个参数否则出了问题你根本不知道是哪一项导致的。5. 从地毯到桌面行走调试与各类翻车修正5.1 测试场地为什么必须从短毛地毯开始MicroDuck第一次下地测试不要放在木地板、瓷砖或者玻璃桌面上。普通硬质平面摩擦系数太低脚掌上的魔术贴钩面发挥不出定向摩擦的效果鸭子大概率会在原地“滑冰”。哪怕偶尔往前走了也会因为左右脚摩擦力不均匀而疯狂转向。我强烈建议用一块短毛地毯或者那种浴室防滑垫颜色深一点更好方便看清实际位移。短毛地毯的纤维能给魔术贴钩面提供足够的“抓握点”让方向性摩擦真正生效。我在普通桌面上试了大概十分钟毫无进展换到地毯之后鸭子第一下就蹿出去一大截。测试时把MicroDuck放在地毯上从后方观察确认两个脚踏地高度一致。然后通电程序会自动开始走。旁边最好准备一把尺子记录10秒内的位移和偏移角度。5.2 典型症状对照表不走、跑偏、卡壳调试过程中遇到的所有问题我把它们整理成了一张表方便你对照排查。症状根因处理方案原地划水几乎不走脚掌定向摩擦方向不对检查魔术贴钩面方向应该向后扒地抓地、向前回摆打滑能走但明显向右偏左腿推力大于右腿或两侧舵机中位偏差微调左腿摆动幅度或单独修改程序的左右center参数能走但突然卡住不动舵机达到物理限位后堵转减小swingAngle检查腿部摇臂是否碰到机身走几步后Arduino重启供电不足电压跌落换大电流升压模块检查GND线是否虚接舵机高频电流声舵机负载过大或电压偏低用手摸舵机是否发烫减小摆动角度换满电电池走一段距离后完全不走脚掌上的魔术贴被地毯纤维堵满了定期清理脚掌底面或更换新魔术贴头部触地走路像磕头重心太靠前尾部加配重或者把头部装饰件减轻左右扭动幅度特别大位移很少moveDelay太快每步时间太短调大moveDelay降低步频一条腿明显摆动幅度比另一条大舵机摇臂螺丝松动重新紧固摇臂螺丝5.3 一个典型调参案例从原地打转到直线前进第一次真正把MicroDuck调好花了我大概一个多小时。最开始我测试时脚掌贴的是普通的EVA软垫在短毛地毯上两边摩擦力完全对称鸭子每走三步就原地向右转90度。我以为是左右舵机中位不对称调了半天也没用。后来我用魔术贴钩面替换掉EVA垫方向确定好之后第一次跑鸭子向前走了大概5厘米就停了然后开始向左转。原因很好判断左右脚掌的魔术贴磨损程度不一样左腿抓地力强一些导致左侧推力偏大。我把左舵机的摆动幅度从25度降到23度跑起来就基本直线了。这给了我一个经验走偏问题优先检查脚掌材料的对称性而不是一上来就调舵机角度。脚掌材料用两片新的同批次魔术贴剪成同样大小贴的位置对齐能省下大量排查时间。6. 在“能走”之后还能往哪里加料6.1 给MicroDuck装上“眼睛”超声波避障两只腿能跑起来之后最自然的一个进阶改造是加超声波避障。接线很简单HC-SR04的Trig脚接D3Echo脚接D4VCC接5VGND接GND。程序逻辑也不复杂每走一小段距离就停下测一次前方障碍如果距离小于15厘米就让鸭子短暂后退并转弯再继续前进。转弯的实现方式很有意思让左右腿的步态相位差不再是180度而是变成同相位也就是两条腿同时向前、同时向后摆动这样鸭子就会原地扭动而不是前进。如果你只想要一个最简单的避障效果不需要额外写转弯序列可以直接用舵机摆到一边的动作代替转弯让一条腿保持不动另一条腿做大幅摆动MicroDuck就会笨拙地绕向一侧。6.2 无线遥控手机控制鸭子在客厅巡逻MicroDuck的引脚还剩很多加一个蓝牙串口模块非常轻松。HM-10这类低功耗蓝牙模块便宜、稳定接上VCC、GND、TX、RX就好。手机上用一个通用的串口蓝牙APP发一个字符控制前进、停止、左转、右转Arduino端用串口中断解析。我感觉这个改造最有意思的地方是转向控制。硬转不好实现我采用的方法是前进时缩短某一侧的摆动幅度鸭子就会缓慢地向那一侧偏移。你可以把速度差设定成比例就像坦克车的差速转向一样。实测下来手机蓝牙控制距离大约在8-10米左右在客厅里足够用了。6.3 结构优化方向重心再降一点腿再轻一点经过几轮调试我发现MicroDuck走得好不好最核心的还是重心。整机重心越低、越靠近身体几何中心步态就越稳定越不容易翻车。你可以考虑把电池从尾部移到身体内部最下方或者把3D打印的头部换成更轻的材料用0.1mm层高打印的薄壳头就行。腿部重量同样影响明显。原装打印腿如果太厚重舵机来回摆动时要额外消耗扭矩去克服腿部自身的惯性。轻量化办法很简单把腿部打印件的填充率从35%降到15%结构强度依然足够但每腿能轻上好几克。两条腿各轻几克舵机的负担立刻变小整只鸭子的续航也会长一些。MicroDuck这台机器鸭真正走起来以后最耗时间的其实是调参而不是装配。我在这个项目上最大的体会是参数要一小步一小步地调每次只改一项记录现象比对差异。脚掌材料的方向性、摆动幅度、步频、重心位置这四者互相牵连缺一个都走不直。最后分享一个实用技巧每次优化完一个参数就用马克笔在地毯上画一条起点线让鸭子跑10秒量一下位移和偏移角把数据记在小本子上。连续记录几组之后你会很清楚地看到哪些改动是有效的哪些是在瞎折腾。
返回列表