1. 为什么我选积木结构而不是3D打印件1.1 从一次失败的打印件说起去年冬天我花了整整三个周末用FDM打印机打了四足机器狗的机身框架。结果呢第一次装配就发现髋关节的舵机安装孔位差了0.8毫米舵机塞不进去。重新切片、重新打印、又是六个小时。等终于把所有零件凑齐整机重量已经飙到680克四条腿的MG996R舵机在站立姿态下就开始发烫。那次经历让我彻底想明白一件事对于桌面级四足机器人结构件的可迭代性远比外观精度重要。3D打印件一旦尺寸定型改一个孔位就要重新走一遍建模、切片、打印、后处理的完整流程周期至少半天。而积木结构——不管是乐高式凸点积木还是铝型材拼装件——改一个位置只需要拔下来换个孔位三十秒搞定。所以这个项目我最终选择了标准积木件舵机支架的方案。核心结构件全部来自市面上常见的塑料积木套件配合几个金属舵机支架做受力节点。整机重量控制在420克左右比之前的打印件方案轻了将近四成。1.2 四自由度构型的取舍逻辑四自由度4-DOF意味着每条腿只有一个髋关节舵机驱动前后摆动没有膝关节。这个构型在学术界叫“单自由度腿”看起来很简单但它带来的好处非常实际舵机数量从8个降到4个成本直接砍半供电压力也小得多控制算法从逆运动学简化为三角步态Arduino Uno就能跑得动整机重心低静态稳定性好不容易翻车代价当然也有它不能像波士顿动力那样跳跃或者爬楼梯步态看起来也比较“笨拙”。但对于一个桌面电子宠物来说能走、能转向、能对语音指令做出反应已经足够有趣了。我实测下来4-DOF构型在平整桌面上的行走速度大约是每秒12厘米转弯半径约8厘米。这个数据对于桌面场景完全够用。1.3 积木搭建中的三个关键细节第一个细节是舵机的中位校准。积木件不像3D打印件有精确的定位槽舵机安装角度全靠手动对齐。我的做法是在装配之前先用Arduino输出1500微秒脉宽信号让所有舵机回到机械中位然后再把舵机臂安装到积木支架上。这样能保证四条腿的初始角度一致后续步态调试会省很多事。第二个细节是重心位置。电池和主控板尽量往机身中心靠不要偏前或偏后。我一开始把电池仓放在机身尾部结果机器狗走路时总是往后坐前腿几乎使不上力。后来把电池移到腹部正下方行走姿态立刻稳了很多。第三个细节是足端摩擦。积木件本身是光滑的ABS塑料在桌面上会打滑。我在每条腿的足端贴了一小块硅胶防滑垫就是那种贴在家具底部的透明小圆垫抓地力提升非常明显。注意积木件的孔位公差比金属件大装配时不要一次性拧紧所有螺丝。先全部松松地装上调整好姿态后再逐个锁紧否则很容易出现“装到最后发现某个孔对不上”的情况。2. 舵机选型与供电那些烧过的舵机教我的事2.1 MG996R和MG90S到底怎么选市面上最常见的两种舵机就是MG996R大扭矩金属齿和MG90S小体积金属齿。我一开始想省重量四条腿全用了MG90S结果机器狗站都站不起来——MG90S的堵转扭矩只有1.8kg·cm而4-DOF构型下每条腿需要承受整机四分之一的重量加上行走时的动态冲击实测至少需要2.5kg·cm以上的扭矩。后来换成MG996R扭矩11kg·cm绰绰有余。但MG996R也有它的问题体积大、重量重、静态电流高。四个MG996R加起来重量接近220克几乎占了整机一半的重量。最终的方案是混合配置两条前腿用MG996R前腿需要更大的抬升力两条后腿用MG90S后腿主要负责推进。这样整机重量降到了380克同时保证了足够的行走能力。舵机型号堵转扭矩重量静态电流适用位置MG996R11kg·cm55g约10mA前腿髋关节MG90S1.8kg·cm13.4g约5mA后腿髋关节SG901.2kg·cm9g约4mA不推荐用于本方案2.2 复位电流一个容易被忽略的隐形杀手舵机上电的瞬间会有一个复位电流这个电流远大于正常工作电流。我实测过MG996R的复位电流峰值能达到1.2A而正常工作电流只有200-300mA。四个舵机同时上电瞬间电流可能超过4A。如果你用Arduino Uno板载的5V稳压器给舵机供电必烧无疑。Uno的板载稳压器最大输出电流只有800mA有些版本标称1A但实际持续输出能力更差。我的供电方案是这样的舵机独立供电用一块LM2596可调降压模块从2节18650锂电池7.4V降到6V直接给舵机供电主控独立供电Arduino Uno通过USB供电或者从另一路降压模块取5V共地处理舵机电源的GND必须和Arduino的GND连在一起否则PWM信号没有参考电平这里有个实操技巧在舵机电源正负极之间并联一个1000μF的电解电容。这个电容能在舵机启动瞬间提供峰值电流补偿有效抑制电压跌落。我加了电容之后机器狗启动时的“抽搐”现象基本消失了。2.3 舵机PWM控制的底层逻辑很多教程只告诉你“用Servo库就能控制舵机”但不说清楚背后的原理。舵机的控制信号是周期20毫秒、脉宽0.5-2.5毫秒的方波。脉宽1.5毫秒对应中位通常是90度0.5毫秒对应0度2.5毫秒对应180度。Arduino的Servo库默认使用Timer1产生PWM信号这会导致引脚9和引脚10的PWM功能失效。如果你同时需要用这两个引脚做其他PWM输出比如控制蜂鸣器音量就会冲突。我的做法是四条腿的舵机分别接在引脚3、5、6、9上。其中引脚9和10虽然受Timer1影响但Servo库会自动处理不影响舵机控制。只是如果你要额外用analogWrite()控制其他PWM设备记得避开这两个引脚。#include Servo.h Servo legFL; // 前左腿 Servo legFR; // 前右腿 Servo legBL; // 后左腿 Servo legBR; // 后右腿 void setup() { legFL.attach(3); legFR.attach(5); legBL.attach(6); legBR.attach(9); // 所有舵机回到中位 legFL.write(90); legFR.write(90); legBL.write(90); legBR.write(90); delay(1000); // 等待舵机到位 }提示舵机首次上电时不要直接写角度值先写中位90度让舵机找到基准位置再执行后续动作。否则舵机会因为不知道当前位置而猛转容易扫齿。3. ASR-PRO语音模块的离线识别实战3.1 为什么不用在线语音识别在线语音识别方案比如接WiFi模块调用云端API听起来很美好但对于桌面电子宠物来说有几个致命问题延迟高、依赖网络、隐私顾虑。你说一句“坐下”等云端返回结果再执行动作中间可能有1-2秒的延迟体验非常割裂。ASR-PRO是国产的离线语音识别模块核心是一颗专用的语音识别芯片支持自定义关键词识别响应时间在200毫秒以内。我用的是ASR-PRO开发板自带麦克风和功放接口通过串口和Arduino通信。3.2 关键词设计与训练流程ASR-PRO的关键词需要通过官方工具进行训练生成固件。我设计了五个关键词关键词对应动作识别灵敏度前进向前行走中后退向后行走中左转原地左转中右转原地右转中坐下四条腿收拢高灵敏度设置有个经验关键词越短灵敏度要设得越低。“前进”只有两个字如果灵敏度设成“高”周围人说话很容易误触发。而“坐下”虽然也是两个字但发音特征更明显可以设成“高”。训练时要注意在最终使用的环境中录制关键词。我在安静的卧室里训练出来的固件拿到客厅有电视背景音的环境下识别率明显下降。后来重新在客厅录制识别率从70%提升到了92%。3.3 串口通信协议与Arduino解析ASR-PRO识别到关键词后会通过串口输出一个十六进制识别码。比如“前进”对应0x01“后退”对应0x02以此类推。Arduino只需要读取串口数据并匹配识别码即可。void loop() { if (Serial.available() 0) { byte cmd Serial.read(); switch (cmd) { case 0x01: walkForward(); break; case 0x02: walkBackward(); break; case 0x03: turnLeft(); break; case 0x04: turnRight(); break; case 0x05: sitDown(); break; default: break; } } }这里有个坑ASR-PRO的串口波特率默认是9600但有些批次的模块出厂固件是115200。如果你发现串口收到的全是乱码先检查波特率设置。我在这上面浪费了一个多小时最后用示波器抓波形才确认是波特率不匹配。另外ASR-PRO在识别成功后会输出一段连续的识别码大约持续100毫秒如果Arduino的loop()执行速度很快可能会重复读取同一个识别码。我的解决办法是在解析到有效指令后加一个200毫秒的延时等识别码输出完毕再继续监听。4. 三角步态的实现与调试4.1 三角步态的基本原理四足机器人的步态有很多种最常见的是三角步态Tripod Gait四条腿分成两组一组三条腿着地支撑另一组一条腿抬起摆动。两组交替形成稳定的行走模式。对于4-DOF构型每条腿只有一个髋关节所以步态实现非常简单支撑腿向后摆摆动腿向前摆。具体分组如下A组前左腿、后右腿B组前右腿、后左腿当A组着地时B组抬起并向前摆动然后A组向后摆动推进身体同时B组着地。如此循环。4.2 步态参数的计算与调优步态的核心参数有三个步幅、步频、抬腿高度。步幅决定了每次摆动腿向前摆动的角度范围。我实测下来步幅角度在25-35度之间比较合适。太小了走路慢太大了机器狗会失去重心。步频决定了行走速度。对于MG996R舵机单步周期建议不低于400毫秒。舵机的响应速度有限如果步频太快舵机还没到位就开始下一步机器狗会“拖腿”。抬腿高度由舵机的角度偏移量决定。4-DOF构型下抬腿高度很有限大约只有1-1.5厘米。这个高度在平整桌面上够用但如果有线缆或者小障碍物就会绊倒。// 三角步态核心函数 void walkForward() { // A组着地B组抬起前摆 legFL.write(90 stride); // 前左腿后摆 legBR.write(90 stride); // 后右腿后摆 legFR.write(90 - stride); // 前右腿前摆 legBL.write(90 - stride); // 后左腿前摆 delay(stepDelay); // B组着地A组抬起前摆 legFL.write(90 - stride); legBR.write(90 - stride); legFR.write(90 stride); legBL.write(90 stride); delay(stepDelay); }4.3 调试中遇到的三个典型问题问题一机器狗走偏。明明代码里四条腿的角度是对称的但机器狗就是往一边偏。原因通常是舵机中位不一致。每个舵机的机械中位都有微小差异需要在代码里做偏移补偿。我的做法是给每个舵机加一个offset变量单独校准。问题二行走时抖动。机器狗走路时全身都在抖像得了帕金森。这通常是供电不足导致的。舵机在快速换向时电流需求陡增如果电源响应跟不上电压跌落会导致舵机抖动。加电容、换更粗的电源线、降低步频三个方法可以逐一尝试。问题三转弯时翻车。原地转弯时一侧的腿需要反向摆动重心偏移很大。我的解决办法是转弯时降低步幅同时让内侧腿的抬腿高度稍微增加帮助重心过渡。实操心得调试步态时先把机器狗架空四条腿悬空观察每条腿的动作是否正常。确认无误后再放到桌面上测试。这样可以避免因为步态错误导致机器狗摔坏。5. 整机联调与电子宠物功能扩展5.1 上电时序与初始化流程整机联调时上电顺序很重要。正确的顺序是先给主控和语音模块上电USB供电等待ASR-PRO初始化完成约2秒板载LED会闪烁再给舵机电源上电Arduino执行初始化程序所有舵机回到中位如果顺序反了舵机先上电而主控还没启动舵机会因为收不到PWM信号而保持在上次断电时的位置可能导致机械结构卡死。5.2 加入超声波避障电子宠物如果只会按指令行走那和遥控玩具没什么区别。我加了一个HC-SR04超声波模块在机器狗头部当检测到前方15厘米内有障碍物时自动停止前进并后退两步。这个功能的实现很简单在walkForward()函数里加入超声波测距如果距离小于阈值就调用walkBackward()。但要注意超声波模块的触发频率不要太高每次测距间隔至少60毫秒否则回波信号会互相干扰。5.3 情绪反馈用蜂鸣器和LED表达状态为了让机器狗更像“宠物”我加了一个无源蜂鸣器和两颗WS2812 LED。不同的动作配合不同的音效和灯光前进短促的“嘀嘀”声LED绿色后退低沉的“嘟嘟”声LED红色坐下上升音阶LED蓝色呼吸效果低电量间歇蜂鸣LED橙色闪烁这些反馈虽然简单但实际体验下来有反馈和没反馈完全是两种感受。没有反馈时你感觉是在操作一台机器有了反馈之后确实有那么一点“养宠物”的感觉。5.4 续航实测与功耗优化我用两节18650锂电池3400mAh给舵机供电实测续航如下工作状态平均电流续航时间待机舵机保持位置约180mA约18小时连续行走约650mA约5小时语音交互行走约720mA约4.5小时续航表现比我预期的好。关键原因是4-DOF构型的舵机数量少而且MG90S的静态电流很低。如果你用8个MG996R做8-DOF构型续航可能只有1.5小时左右。功耗优化方面最有效的措施是在待机时让舵机断电。用一个MOS管控制舵机电源的通断当机器狗超过30秒没有收到指令时自动切断舵机电源。需要动作时再上电虽然会有短暂的复位延迟但续航能提升一倍以上。6. 踩过的坑与最终方案复盘6.1 积木件松动导致的“软腿”问题积木件最大的问题是长期使用后孔位会松动。机器狗走了几天之后髋关节的积木连接处出现了明显的间隙导致走路时腿会“晃”。这个问题在3D打印件上不会出现因为打印件是一体成型的。我的解决办法是在关键受力节点换成金属舵机支架。虽然增加了约30克重量但结构刚性提升了一个档次。具体来说髋关节的舵机安装位和腿部的连接位都换成了铝合金支架其他非受力部位继续用积木件。6.2 ASR-PRO的误触发与降噪处理ASR-PRO在安静环境下识别率很高但在有背景噪音的环境下容易误触发。我试过几个方法加装麦克风防风罩用海绵套住麦克风能过滤掉一部分高频噪音但对人声干扰无效降低灵敏度把灵敏度从“高”调到“中”误触发率下降但识别距离也从3米降到了1.5米增加确认机制识别到关键词后让机器狗先做一个“点头”动作表示听到了再执行指令。这样即使误触发你也能及时发现最终我采用的是灵敏度“中”确认机制的组合。识别距离1.5米对于桌面场景完全够用确认机制也避免了误动作。6.3 最终物料清单与成本物料数量单价约小计MG996R舵机225元50元MG90S舵机212元24元Arduino Uno130元30元ASR-PRO模块145元45元LM2596降压模块25元10元18650电池电池盒215元30元积木件金属支架若干约40元40元超声波模块蜂鸣器LED若干约15元15元杜邦线电容其他若干约15元15元合计约259元这个成本对于一台能走、能听指令、有情绪反馈的桌面机器狗来说性价比相当高了。如果你手头已经有Arduino和积木件实际支出可能不到150元。6.4 后续可以继续折腾的方向这个项目做完之后我又陆续加了几个小功能。一个是手机蓝牙遥控用HC-05模块替代语音控制适合在嘈杂环境下使用。另一个是自动巡线在桌面上贴一条黑色胶带用红外循迹模块让机器狗沿着线走。还有一个方向我还没时间做但觉得很有意思用ESP32替换Arduino Uno利用ESP32的WiFi功能做一个简单的网页控制界面手机浏览器打开就能控制机器狗。ESP32的PWM精度也比Uno高舵机控制会更平滑。最后分享一个我在调试过程中总结的小技巧给每个舵机单独编号并记录中位偏移值。我在每个舵机的线上贴了标签FL、FR、BL、BR然后在代码里为每个舵机定义了独立的offset变量。这样即使更换舵机只需要重新校准一个偏移值不用改整个步态代码。这个习惯在后续维护和升级时省了我很多时间。
阅读完成 · 觉得有帮助?