
这次我们来看 MicroDuck 机器鸭的速度训练实录。一只开源四足机器人经过步态参数调整和反复测速在百米跑测试里跑出了 2.07 m/s。换算一下100 米除以 2.07 m/s全程大约 48.3 秒。对这个体积的舵机四足机器人来说能稳定跑完 100 米并保持这个平均速度说明步态、供电和结构已经处在一种“能打”的状态。MicroDuck 是一个开源四足机器人项目本体用 3D 打印结构件拼装主控是 ESP32 开发板四条腿由 8 个小型舵机驱动。视觉和上层决策可以交给手机完成手机摄像头负责感知WiFi 负责跟 ESP32 通信手机端把运动指令下发到舵机层。相比动辄几千上万的商用机器狗它的成本低很多特别适合做四足步态、参数调优和强化学习 sim2real 的入门实验。这篇文章不打算只讲“鸭子很萌”而是把和速度相关的链路完整拆开硬件怎么准备、固件怎么烧、步态怎么从走到跑、2.07 m/s 这个数字是怎么测出来的、速度瓶颈在哪里、跑不快应该查哪里。适合两类读者一是手里已经有 MicroDuck、想把它调快的玩家二是准备入门四足机器人、想知道这套开源方案值不值得折腾的嵌入式开发者。1. MicroDuck 机器鸭核心能力速览先给结论再讲细节。这个项目不是靠概念取胜而是把四足机器人的硬件、固件、控制链路全部开源让普通人也能用低成本材料组装出一台能跑能看的机器鸭。能力项说明项目类型开源四足机器人3D 打印结构 ESP32 主控 手机端感知本体结构机器鸭外观四条腿各 2 个自由度合计 8 个舵机以当前项目版本为准主控方案ESP32 开发板负责舵机驱动、WiFi 通信和指令解析人机交互手机 App 连接WiFi 遥控可下发步态和速度指令感知能力借助手机摄像头和端侧模型实现视觉识别可扩展循迹、跟随、避障运动能力前进、后退、转向、多种步态切换可通过参数调优提升移动速度速度表现本次百米跑训练结果为 2.07 m/s约 48.3 秒完成 100 米开源范围结构图纸、固件、手机端工程和文档以项目仓库实际发布内容为准上手门槛需要基础组装、焊接和串口调试能力适合嵌入式与机器人入门典型场景步态算法验证、强化学习 sim2real、高校实验、极客玩具这里要说明一点表格是项目整体画像具体舵机型号、固件接口、App 功能会随版本变化。部署前先以项目仓库 README 和实际到手物料为准不要照搬网上的旧教程硬套。2. 适用场景与使用边界MicroDuck 适合谁最直接的答案是想做四足机器人但不想一上来就买商用方案的人。它能解决三个具体问题步态控制怎么入门8 个舵机的协同动作其实就是四足步态的缩小版调相位、调步频、调步高逻辑和大型四足完全一致。参数对速度影响多大通过改一组参数观察速度变化比只看公式理解深得多。强化学习怎么落到真机在小规模硬件上先把仿真到真机的流程跑通再扩展到更大机器人。不适合什么场景也很明确。它不适合重负载搬运不适合户外雨天泥地不适合长时间连续高速奔跑。小型舵机的扭矩和散热能力有限连续高速运行十几分钟后舵机温度和电池消耗都会明显上升。如果把它当成低成本的搬运平台或者全天候巡检机器人会很快遇到寿命问题。使用边界必须强调机器鸭如果接了手机摄像头摄像头只应在本机测试场景中使用不要对着无关人员拍摄涉及肖像和隐私的内容必须获得明确授权。另外锂电池充电和使用要规范防止过充、短路和挤压高速测试时要选无障碍的平地避免鸭子冲进桌沿、台阶或人群。3. 环境准备与前置条件3.1 硬件清单下面这份清单是通用参考具体型号以你手里的版本为准3D 打印结构件鸭身外壳、四条腿的上腿和下腿、关节连接件、舵机支架ESP32 开发板作为主控负责舵机 PWM 输出和 WiFi 通信小型舵机 8 个每条腿两个分别控制髋关节和膝关节舵机供电模块电池电压一般高于舵机额定电压需要稳压模块或 BEC锂电池容量和放电倍率要能支撑 8 个舵机同时工作手机一台安装配套控制 App充当遥控器和视觉大脑组装工具十字螺丝刀、镊子、杜邦线、万用表、热缩管特别注意舵机供电不能直接接在 ESP32 的 5V 引脚上8 个舵机同时动作时电流可能达到几安培必须单独供电并保证 ESP32 和舵机共地。3.2 软件工具链固件开发与烧录Arduino IDE 或 ESP-IDF按项目文档选择串口调试工具用来观察 ESP32 日志和 WiFi 连接状态手机控制 App安装项目配套 APK 或 iOS 应用Python 环境用于测速数据分析和批量参数扫描的可视化录像设备手机或相机拍摄测速过程用于逐帧分析如果从来没用过 Arduino IDE第一次先装好 ESP32 开发板支持包再烧一个点灯程序确认环境正常不要直接烧四足固件否则出了问题不好定位是环境问题还是代码问题。3.3 目录与数据管理机器鸭的速度调优会反复改参数、反复测速日志和测量结果建议一开始就分目录管理microduck/ ├── firmware/ # ESP32 固件工程 ├── hardware/ # 3D 打印结构件图纸 ├── app/ # 手机端控制工程 ├── config/ # 步态参数配置 ├── logs/ # 串口日志与测速记录 └── measurements/ # 测速视频、照片、结果表格建议每轮调参前把当前参数导出保存避免下一次测试覆盖掉已经验证过的好参数。这个习惯在后面的批量扫描里会非常有用。4. 固件烧录与整机启动4.1 固件编译与烧录先编译固件再通过 USB 串口烧录到 ESP32。以命令行方式为例真实使用中如果你用 Arduino IDE直接选择板型和串口、点击上传即可# 进入固件目录后先确认 ESP32 是否被系统识别 arduino-cli board list # 编译并烧录--fqbn 和 --port 需要替换为实际板型和串口 arduino-cli compile --fqbn esp32:esp32:esp32 ./firmware arduino-cli upload --fqbn esp32:esp32:esp32 --port /dev/ttyUSB0 ./firmware烧录成功后打开串口监视器波特率按固件源码里的设置填通常能看到 ESP32 打印启动信息。如果串口没有任何输出先检查驱动是否安装、板子是否进入下载模式不要急着怀疑固件。4.2 手机与主控建立通信MicroDuck 的典型控制链路是手机 App 通过 WiFi 连接 ESP32然后下发步态参数和运动指令。第一次连接时一般需要把 ESP32 配置成 Station 模式让它连上手机热点或路由器 WiFi。配置方式通常在固件文档里可能是通过串口输入 WiFi 名称和密码也可能是通过 App 扫码配置。连接成功的标志是串口日志里出现 IP 地址分配信息App 界面从“未连接”变成在线状态。如果连不上优先检查热点是否开了 2.4GHz 频段很多 ESP32 不支持 5GHz 热点。4.3 关节中点校准整机启动前最重要的一步每个舵机都必须有正确的中点位置否则鸭子站姿歪斜跑起来会明显跑偏速度也上不去。校准时把每个舵机单独调到 90 度位置然后安装舵机臂和腿让关节处于机械零位。这个过程要逐个完成不要一次性把 8 条腿全部装好再调。4.4 启动检查清单上电之前按下面清单过一遍能省下大量排查时间电池电压在舵机额定范围内舵机供电和 ESP32 逻辑供电共地8 个舵机的中点和转向已校准四条腿活动范围内没有卡死或干涉手机热点已开启或路由器 WiFi 可用桌面或地面平整、无障碍、有足够刹车空间启动后先做小幅度动作测试比如让鸭子原地站起再蹲下观察每个关节是否正常响应。这里重点观察有没有舵机发抖、咔咔响或者温度快速上升有异常立即断电。5. 步态调优从能走到跑出 2.07 m/s5.1 速度公式机器鸭的平均速度可以简单拆成两个因素平均速度 平均步长 × 平均步频想提速要么增大每一步向前跨的距离要么提高每秒迈步的次数。实际调优中发现步长和步频不是独立的步频提得太高舵机来不及完成摆动步长反而缩短速度可能下降甚至步态混乱。因此提速的过程本质上是找一个步长和步频的平衡点。反推方法也很实用用视频数出鸭子在 10 米内一共迈了多少步。下面用一组假设数据演示反推过程数字不是固定结论真实结果要看你的鸭子实测若 10 米距离内数到 60 步 平均步长 10 / 60 0.167 m 若这 10 米用时 4.83 秒 平均速度 10 / 4.83 2.07 m/s 平均步频 2.07 / 0.167 ≈ 12.4 Hz这个反推能帮你定位瓶颈如果步长远低于预期问题在关节摆动幅度或腿部机械结构如果步频上不去问题在舵机响应速度或供电电压。5.2 关键步态参数四足机器人的步态参数通常在配置文件或 App 参数页里。以通用配置为例下面是一份常见的步态参数结构字段名以你当前固件为准{ gait: trot, cycle_frequency_hz: 4.0, step_height_mm: 15, stride_length_mm: 40, body_pitch_deg: 3.0, phase_offset_deg: [0, 180, 180, 0] }参数含义gait步态类型常见有 walk、trot、bound跑得快通常用 trot 或 boundcycle_frequency_hz步态周期频率决定每秒多少个完整步态周期step_height_mm抬腿高度太高会浪费舵机能量太矮容易绊倒stride_length_mm目标步长实际步长受舵机速度限制body_pitch_deg身体俯仰角跑步时前倾可以让重心更靠前phase_offset_deg四条腿的相位差trot 下对角线两条腿同相调参时一次只改一个变量改完跑一小段测量速度。如果同时改三个参数速度变化了也说不清是谁的贡献。5.3 提速实操步骤建议按照下面的顺序从走路逐步过渡到跑步先把步态频率调低比如 2 Hz确认鸭子能稳定直行 10 米不跑偏。逐渐提高 cycle_frequency_hz每次增加 0.5 Hz记录每个频率下的平均速度。在某个频率点如果出现鸭子原地踏跳、身体乱晃或舵机发烫说明已经接近上限退回上一档。保持该频率微调 step_height_mm找到既不绊脚又不浪费摆动时间的最小抬腿高度。增大 stride_length_mm 或 body_pitch_deg观察是否进一步提速。在最优参数组合下连续跑 3 次 100 米取平均速度作为最终成绩。这次训练最终停在 2.07 m/s就是走了这套流程先稳定再提频最后用步高和俯仰角微调。2.07 m/s 不是只靠某一个参数拉出来的而是步长和步频配合后的综合结果。5.4 强化学习提速路线如果手工调参已经摸到了舵机的速度上限再想突破可以走强化学习路线。常见做法是在仿真环境里训练步态策略再迁移到真机也就是 sim2real。大致流程在 MuJoCo、Isaac Gym 或类似的仿真环境里构建机器鸭的运动学模型给奖励函数设计速度项、稳定性项和关节极限惩罚项训练一个神经网络策略输入是身体姿态和关节角度输出是 8 个关节的目标角度在仿真中验证超过 2.07 m/s 的速度策略后把策略部署到手机端或 ESP32真机测试时建议从低速度策略开始逐步切换到高速策略观察舵机负载这条路线的难度比手工调参高不少需要会搭建仿真环境和训练流程。但一旦跑通速度提升空间可能比手工调参更大。即便暂时不做 RL理解这条链路对后续做四足相关项目也很有价值。5.5 百米测速与数据记录2.07 m/s 要成立测速方法必须可靠。推荐用视频逐帧分析代替人工秒表固定起点和终点线用手机拍摄整个 100 米过程然后解析视频时间戳计算用时。示例代码如下# 由视频时间戳计算百米平均速度 import cv2 video_path race_100m.mp4 cap cv2.VideoCapture(video_path) start_ms None end_ms None while True: ret, frame cap.read() if not ret: break ts cap.get(cv2.CAP_PROP_POS_MSEC) # detect_start / detect_finish 需要自己实现 # 比如检测画面中机器鸭开始移动和越过终点标记 if detect_start(frame): start_ms ts if detect_finish(frame): end_ms ts break cap.release() if start_ms and end_ms: seconds (end_ms - start_ms) / 1000.0 speed 100.0 / seconds print(f用时 {seconds:.2f} s平均速度 {speed:.2f} m/s)测速时注意三点一是 100 米跑道要实地量准不要目测二是多次测试之间要等舵机冷却连续高速跑会导致成绩一次比一次差三是统计 2.07 m/s 时应该用多次有效成绩的平均值而不是单次极限值。单次成绩可能因为地面、风向、电池满电状态产生虚高。6. 调试接口与批量参数测试6.1 控制指令通路MicroDuck 的参数调试不是只能手动在 App 上点。完整控制链路是手机 App 通过 WiFi 与 ESP32 通信再转成舵机 PWM 信号。可以用“接口”的视角看待这条链路手机 App 是客户端ESP32 是服务端步态参数就是接口的请求体。如果你熟悉 HTTP 或 WebSocket完全可以把这套控制协议抽象成一组指令接口方便程序化调用。实际调试时可以打开串口监视器观察手机每下发一条指令后ESP32 是否收到、是否返回确认信息。如果指令没有到达舵机层问题在通信如果到达了但关节动作不对问题在校准或舵机转向。6.2 批量参数扫描手工调参适合找感觉批量扫描适合找最优值。思路是把参数组合写成一个列表依次下发并测量速度最后把结果存成 CSV。下面是一个批量扫描步频的示例框架import time import csv results [] freqs [3.0, 3.5, 4.0, 4.5, 5.0] # 步频扫描范围单位 Hz for f in freqs: send_command({cycle_frequency_hz: f}) # 向机器鸭下发参数 time.sleep(2) # 等待步态稳定 speed measure_speed_10m() # 测 10 米平均速度 results.append((f, speed)) print(ffreq{f} Hz, speed{speed:.2f} m/s) with open(logs/freq_sweep.csv, w, newline) as fp: writer csv.writer(fp) writer.writerow([freq_hz, speed_mps]) writer.writerows(results)批量扫描时机器鸭要放在同样的地面上跑起点终点一致电池电量尽量接近。每一步参数测试之间留出冷却时间否则结果会被舵机热衰减干扰。扫描完成后用 CSV 画一条“步频-速度”曲线最优区间一目了然。6.3 日志与回传想让批量测试更可靠最好让固件回传状态数据。常见日志字段如下字段含义timestamp时间戳用于对齐视频和运动数据target_freq当前下发的目标步频actual_speed实测平均速度battery_v电池电压判断供电是否掉压servo_temp舵机温度判断热衰减和过载风险current_a电流如果外接电流采样模块有了这套日志你就能把电压、温度、速度放在同一时间轴上看。比如速度在某次测试后开始下降如果电池电压明显下跌、舵机温度上升就不用怀疑参数而是供电或散热先到极限了。7. 性能观察与速度瓶颈分析7.1 舵机响应是速度的第一瓶颈机器鸭提速最直接的硬限制是舵机。以常见的 9g 小型舵机为例空载转速大约在 0.1 秒/60 度这个量级带载后会更慢真实参数以你手里舵机的手册为准。四足跑步动作里腿部需要在极短时间内完成摆动和支撑切换舵机响应不过来步频就上不去速度自然被封顶。判断舵机是否到极限听声音最直观舵机发出尖锐高频声、动作变软、到位后微微发抖都说明它正在超负荷工作。这时候再往上提步频只会增加发热不会增加速度。7.2 供电是第二个瓶颈舵机扭矩和速度都依赖供电电压。电池满电和快没电时同一组步态参数跑出来的速度可能差 10% 以上。提速测试基本都在电池接近满电的状态下做但如果连续多轮测试电压下降后速度会明显变慢。对策是使用放电倍率足够的锂电池并在舵机供电链路上加稳压模块。注意不要超过舵机额定电压超压虽然能暂时提速但会让舵机过热甚至烧毁得不偿失。7.3 结构重量与摩擦的影响3D 打印件的表面粗糙度、螺丝拧紧程度、关节轴之间的摩擦都会影响实际速度。打印件毛刺没打磨、螺丝拧得过紧、关节之间卡顿都会白白消耗舵机扭矩。想让鸭子跑得更快可以检查腿部零件有没有明显毛刺关节转动是否顺滑螺丝松紧适度既不能松动也不能压死轴承位鸭身上有没有多余的配重能拆掉的装饰件尽量拆掉地面材质统一光滑硬地面通常比地毯阻力小7.4 量化观察手段观察性能不能只靠“感觉变快了”。建议同时用三类数据交叉验证视频逐帧分析得到准确的用时和步数串口日志记录电池电压和指令下发时间外接电流表或功率计观察整机功耗曲线如果速度提升了但电流飙升说明效率反而下降这种提升不可持续如果速度和电流同步提升才是真正的性能改善。2.07 m/s 这个成绩背后应该是速度、电流、温度三者都处在可接受范围内的状态。8. 常见问题与排查方法机器鸭跑不快、跑不稳绝大部分不是玄学而是可以定位的具体问题。这里整理一份排查表问题现象可能原因排查方式解决方案上电后舵机不动或发抖供电不足或电压不稳用万用表测舵机供电电压换放电倍率更高的电池或增加稳压模块关节咔咔响或堵转装配过紧或舵机角度超机械限位手动转动关节检查活动范围重新装配减小关节角度余量手机连不上 ESP32WiFi 频段或配置错误查看串口日志和热点频段使用 2.4GHz 热点重新配置 WiFi站姿歪斜、直行跑偏舵机中点未校准或左右负载不均逐关节单独测试中点重新做 8 个舵机的中点校准步频一提高就乱步频超过舵机响应上限逐步降频观察临界点退回稳定步频或更换响应更快的舵机高速跑一段后明显变慢舵机热衰减或电池掉压测量舵机温度和电池电压停机冷却更换高倍率电池测速结果多次不一致计时误差或跑道距离不准用视频时间戳和实测距离复核固定起终点多次取平均固件烧录失败板型选择错误或驱动未装检查 board list 和串口驱动确认 ESP32 板型和 USB 驱动提到最多的一类问题是“为什么我的鸭子跑不到别人的速度”。如果结构和固件一致差距通常来自三点舵机实际型号和供电质量不同、中点校准精度不同、测速条件不同。先把这三项对齐再对比速度才有意义。9. 最佳实践与工程化建议把一套调参流程跑完下面这些经验值得沉淀下来第一参数必须配置化并保存。MicroDuck 的步态参数不要每次都在代码里改尽量放到配置文件或 EEPROM 里方便批量扫描和回滚。第二一次只改一个变量。调参最忌讳同时改步频、步高、俯仰角改乱了根本不知道是哪个参数起作用。批量扫描才能得到可信的单参数影响曲线。第三测速前先让鸭子热身。刚上电的舵机状态和连续跑几分钟后的状态不同先跑几个短距离热身再正式测 100 米成绩更稳定也更接近实际使用场景。第四三路数据对照。录视频、开串口日志、记录电池电压三份数据对应同一个测试编号。没有编号的数据等于废数据。第五安全边界要守死。高速测试只在地面平坦、无障碍物、附近无人的环境中进行。发现舵机温度异常、电池鼓包、电线异味立即断电检查不要因为想刷成绩而硬跑。第六合规使用感知能力。如果后续接入手机摄像头做视觉循迹或跟随只在本机授权场景中使用不拍摄他人不用于任何侵犯隐私或版权的用途。10. 总结与下一步MicroDuck 机器鸭最值得尝试的点是把四足机器人从“只能看”变成了“可以调、可以跑、可以量化对比”的实验平台。这次训练跑到 2.07 m/s 的成绩说明开源硬件加合理的调参流程完全可以在小型舵机四足上压榨出可观的速度。如果你刚拿到鸭子最先验证的应该是中点校准和基础步态这两个不做扎实后面所有提速都没有意义。最容易踩的坑则是供电不足和舵机过热80% 的“跑不快”其实是在这两个环节出了问题。后续扩展可以走三条线一是继续手工调参把步态参数打磨到当前舵机的极限二是上强化学习在仿真里训练高速策略再迁移到真机三是把手机视觉接进来让鸭子自己循迹跑 100 米把测速变成自动化任务。希望这篇能帮你把自己的 MicroDuck 调得更快更稳。调完记得记录参数和视频也欢迎回评论区交流你的测速数据。