1. 从“四足”到“三足”Petoi Quaddle 的设计哲学与核心定位第一次看到 Petoi Quaddle 这个名字很多人会下意识以为它是 Petoi 家又一款四足机器人。毕竟 Petoi 这个品牌在创客圈里最出名的就是 Bittle 和 Nybble 这两只猫狗形态的四足平台。但 Quaddle 走了一条完全不同的路——它是一台三轮足式机器人用三条腿完成行走、转向、平衡和越障。这个形态在开源机器人圈子里相当少见也正是它最值得聊的地方。Quaddle 解决的核心问题其实很明确在保持足式机器人越障能力的同时把机械复杂度和成本压到最低。四足机器人每条腿都需要独立的驱动和协调算法12 个自由度意味着 12 个舵机、12 路控制信号以及一套相当复杂的步态规划。而 Quaddle 用三条腿、更少的舵机数量实现了“能走、能转、能爬小坡、能保持动态平衡”的基础能力。对于想入门足式机器人、又不想一上来就被四足步态劝退的玩家来说这是一个非常友好的切入点。它适合谁我把它归为三类人第一类是刚接触机器人编程的学生或爱好者想用一块主控板加几个舵机就搭出一台会走路的机器第二类是做 STEM 教学的老师需要一台结构简单、原理清晰、方便拆解讲解的教具第三类是想研究非四足步态的研究者或极客三足步态本身就是一个有趣的课题静态稳定三角支撑和动态行走之间的切换很有研究价值。无论你是哪一类Quaddle 的机械结构和控制逻辑都足够透明你能真正看懂它每一步是怎么迈出去的。我拿到这台机器的时候第一反应是“三条腿怎么站得住”。这个问题后面会详细拆但先给个结论三足机器人的稳定性来自重心投影始终落在支撑三角形内而 Quaddle 通过身体重心的主动偏移和步态时序设计让这个条件在行走过程中持续满足。听起来简单做起来全是细节。2. 机械结构拆解三条腿如何撑起一台会走路的机器2.1 腿部构型与自由度分配Quaddle 的每条腿采用了两自由度设计一个髋关节舵机负责腿的前后摆动一个膝关节舵机负责腿的抬起和落下。三条腿一共 6 个舵机加上身体姿态调整可能用到的一到两个舵机整机舵机数量控制在 8 个以内。这个数字相比四足机器人动辄 12 个舵机成本和装配难度都下降了一个档次。为什么是两自由度而不是三自由度这里有个很实际的取舍。三自由度腿髋偏航、髋俯仰、膝俯仰能让足端到达空间任意位置步态更灵活但控制维度多了一维逆运动学求解和步态规划复杂度显著上升。Quaddle 的目标不是做高动态运动而是稳定行走所以两自由度腿配合身体姿态调整已经够用。髋关节控制步幅膝关节控制抬腿高度身体通过重心偏移来辅助平衡这套组合在实际测试中能覆盖平地行走、小坡度爬升和缓慢转向。三条腿的布局是前二后一还是前一后二这会直接影响步态设计。从公开资料和常见实现来看Quaddle 采用的是前二后一的三角布局也就是前面两条腿、后面一条腿。这种布局的好处是前方支撑面宽行走时重心更容易控制在前方视觉上也更像一台“会走路的三脚架”。后面那条腿负责推进和支撑前面两条腿交替迈步形成一种类似三角步态的循环。2.2 身体框架与重心设计Quaddle 的身体框架通常由 3D 打印件或激光切割亚克力板构成主控板和电池固定在身体中央偏后的位置。这个位置不是随便放的——电池是整机最重的部件它的位置直接决定了重心高度和前后分布。如果把电池放在身体正中央重心偏高行走时容易左右摇晃放在偏后位置重心后移前面两条腿的负载会减轻但后腿压力增大。我在实际装配时试过三种电池位置正中央、偏后 2 厘米、偏后 4 厘米。实测下来偏后 2 到 3 厘米是最稳的。这个位置让重心投影在静态站立时落在三角支撑面的几何中心附近行走时前后偏移量最小。如果你自己搭可以用一个简单方法找重心把机器人放在一根细木棍上左右调整直到它能平衡不掉下来那个点就是重心投影位置然后确保这个点落在三条腿构成的三角形内部。注意重心位置会随着腿部姿态变化而改变。抬腿时那条腿的重量从支撑面移除重心会向支撑腿一侧偏移。所以静态重心调好只是第一步动态行走时还需要通过身体姿态舵机或步态时序来补偿。2.3 舵机选型与扭矩计算舵机是足式机器人的肌肉选型直接决定机器人能不能站起来、走得动。Quaddle 这类小型三足机器人常用的舵机型号是SG90 或 MG90S这类 9 克微型舵机。SG90 便宜、轻、够小但塑料齿轮容易扫齿MG90S 是金属齿轮版本扭矩稍大耐用性好很多。如果预算允许我强烈建议直接上 MG90S省得后期反复拆换。扭矩够不够可以粗略算一下。假设机器人整机重量 300 克三条腿分担每条腿静态支撑约 100 克。髋关节舵机需要克服的力矩等于腿长乘以腿部重量和地面反作用力产生的力矩。如果腿长 5 厘米单腿支撑 100 克力矩大约是 0.05 米 × 0.1 千克 × 9.8 ≈ 0.049 牛米换算成常用单位约 0.5 千克·厘米。SG90 在 4.8V 下堵转扭矩约 1.8 千克·厘米看起来余量很大但那是堵转扭矩实际工作扭矩通常只有堵转的三分之一到一半。所以SG90 在轻负载下够用但一旦机器人重量超过 350 克或者需要爬坡就会明显吃力。我自己的配置是髋关节用 MG90S膝关节用 SG90因为膝关节主要承担抬腿动作负载相对小。这个混搭方案在成本和性能之间取得了不错的平衡。如果你要做更重的版本可以考虑MG996R这类标准舵机但体积和重量会大幅增加需要重新设计身体框架。3. 控制逻辑与步态规划三足行走的数学与直觉3.1 静态三角步态的基本原理三足机器人行走的核心约束是任意时刻至少有三条腿中的两条着地且重心投影落在着地腿构成的支撑区域内。这听起来像是一句废话但它是所有步态设计的基础。Quaddle 的静态步态通常采用“抬一条腿、移动身体、放下腿、换另一条腿”的循环每一步只抬一条腿另外两条腿构成一条支撑线。具体来说一个完整的行走周期分为六个阶段前左腿抬起并前摆、前左腿落下、身体重心前移、前右腿抬起并前摆、前右腿落下、后腿调整。这个过程中重心始终在支撑三角形内移动。你可以把它想象成一个人用两根拐杖走路先把一根拐杖往前放身体重心移过去再移动另一根拐杖。Quaddle 的三条腿就是两根拐杖加一条真腿的组合。为什么不用动态步态动态步态允许机器人只有一条腿着地靠惯性维持平衡速度快但控制难度高。Quaddle 的定位是入门级平台静态步态更稳、更容易调试、对传感器依赖低所以是更合理的选择。等你把静态步态玩透了再尝试动态步态也不迟。3.2 逆运动学求解从足端位置反推舵机角度要让腿移动到指定位置需要用到逆运动学。Quaddle 的两自由度腿可以简化为一个平面二连杆机构髋关节到膝关节为第一段连杆膝关节到足端为第二段连杆。已知足端目标位置 (x, y)求髋关节角度 θ1 和膝关节角度 θ2。设第一段连杆长度为 L1第二段为 L2足端到髋关节的距离为 r则r sqrt(x^2 y^2) cos(θ2) (L1^2 L2^2 - r^2) / (2 * L1 * L2) θ2 acos(cos(θ2)) θ1 atan2(y, x) - atan2(L2 * sin(θ2), L1 L2 * cos(θ2))这段公式看起来有点吓人但实际写代码时就是几行三角函数。关键是理解 θ1 和 θ2 的物理意义θ1 决定腿往前伸多少θ2 决定腿弯多少。调试时你可以先固定 θ2只改 θ1观察腿的前后摆动再固定 θ1改 θ2观察腿的抬起落下。这样分步调试比一上来就调两个角度容易得多。实操心得逆运动学算出来的角度是理论值实际舵机安装时会有偏差。我通常会在代码里加一个offset数组每个舵机一个偏移量通过实验校准。校准方法是让机器人站立手动调整 offset 直到三条腿长度一致、身体水平。3.3 步态时序与舵机控制信号步态时序决定了每条腿在什么时刻抬起、什么时刻放下。Quaddle 的静态步态周期通常在 1 到 2 秒之间太快会失稳太慢看起来像慢动作。我用的是一个 1.5 秒的周期分为 6 个 250 毫秒的阶段。每个阶段里相关舵机从当前角度平滑过渡到目标角度过渡时间略小于阶段时间留出一点稳定时间。舵机控制信号是标准的 PWM 信号周期 20 毫秒脉宽 500 到 2500 微秒对应 0 到 180 度。主控板通过定时器产生多路 PWM分别接到每个舵机的信号线。这里有个坑舵机同时动作时电流会瞬间拉高如果电源供电不足主控板会复位。我的解决方案是舵机电源和主控电源分开供电共地但不共正极或者加一个大电容缓冲。# 伪代码示例控制一条腿的髋关节和膝关节 def move_leg(hip_angle, knee_angle, duration_ms): set_pwm(HIP_PIN, angle_to_pulse(hip_angle)) set_pwm(KNEE_PIN, angle_to_pulse(knee_angle)) sleep(duration_ms) def walk_cycle(): # 阶段1前左腿抬起 move_leg(hip_left, knee_left_lift, 250) # 阶段2前左腿前摆 move_leg(hip_left_forward, knee_left_lift, 250) # 阶段3前左腿落下 move_leg(hip_left_forward, knee_left_down, 250) # 阶段4-6前右腿重复类似动作 ...这段代码是简化版实际实现中还需要加入身体姿态调整和重心偏移。但核心逻辑就是这样按时间顺序给舵机发送目标角度让腿按预定轨迹运动。4. 主控与编程环境从 Arduino 到图形化编程4.1 主控板选型与扩展能力Quaddle 的主控板通常选用Arduino Nano 或 Arduino Uno这两款板子 PWM 引脚多、社区支持好、价格便宜。Nano 体积更小适合塞进机器人身体里Uno 调试方便适合前期开发。如果预算充足也可以上ESP32自带 WiFi 和蓝牙能实现手机遥控和无线调试但要注意 ESP32 的 PWM 频率和舵机兼容性需要额外配置。主控板需要引出的引脚包括6 路舵机 PWM、电源输入、可能的传感器接口超声波、红外、IMU。Arduino Nano 有 6 路硬件 PWM刚好够用但如果要加传感器可能需要用软件 PWM 或者换用 PCA9685 舵机驱动板。PCA9685 是 16 通道 PWM 驱动通过 I2C 控制只占两个引脚能同时驱动 16 个舵机是扩展性最好的方案。我自己的配置是 Arduino Nano PCA9685舵机全部接在 PCA9685 上Nano 只负责逻辑运算和 I2C 通信。这样电源管理更简单舵机电流不经过 Nano避免了复位问题。PCA9685 的供电是独立的 5V 2A 电源Nano 用 USB 供电两者共地。4.2 编程环境搭建与库选择编程环境用Arduino IDE就够了安装简单库管理方便。需要安装的库主要是Adafruit_PWMServoDriver如果用了 PCA9685和WireI2C 通信。如果不用 PCA9685直接用Servo库也可以但要注意Servo库在 Arduino 上最多支持 12 路舵机且会占用定时器资源。代码结构上我建议分成三个模块硬件抽象层封装舵机控制、传感器读取、步态层定义步态时序和逆运动学、应用层主循环、遥控指令解析。这样分层的好处是换硬件时只需要改硬件抽象层步态算法不用动调步态时只改步态层不影响其他部分。// 硬件抽象层示例 void setServoAngle(uint8_t channel, float angle) { uint16_t pulse map(angle, 0, 180, SERVOMIN, SERVOMAX); pwm.setPWM(channel, 0, pulse); } // 步态层示例 void walkForward(float stepLength) { float hip_angle calculateHipAngle(stepLength); float knee_angle calculateKneeAngle(stepLength); setServoAngle(LEFT_HIP, hip_angle); setServoAngle(LEFT_KNEE, knee_angle); delay(STEP_DURATION); }4.3 图形化编程与教学适配如果是用于教学Arduino IDE 的代码门槛可能偏高。这时候可以用Scratch 或 Blockly这类图形化编程工具通过串口或蓝牙发送指令给主控板。主控板固件里预置好步态函数图形化程序只需要发送“前进”“后退”“左转”“右转”这样的高层指令。学生拖拽积木块就能让机器人动起来同时还能理解“指令-执行”的基本逻辑。我试过用 Scratch 通过串口控制 Quaddle延迟大约 50 到 100 毫秒对于慢速步态来说完全可接受。具体做法是Arduino 固件里解析串口收到的字符F 前进、B 后退、L 左转、R 右转、S 停止。Scratch 里用“当按下空格键”触发发送对应字符。这套方案简单可靠学生很容易上手。注意串口通信时Arduino 的Serial.read()是非阻塞的但步态函数里的delay()会阻塞主循环导致指令响应不及时。解决办法是把步态函数改成状态机形式每次主循环只执行一小步不用delay()。这个改动稍微复杂一点但能显著提升响应速度。5. 装配调试与常见问题排查5.1 装配顺序与关键细节装配 Quaddle 的顺序很重要顺序错了可能要拆了重来。我的建议是先装腿、再装身体、最后接电线和主控。每条腿先单独组装好确认髋关节和膝关节转动顺畅、没有卡顿再装到身体上。装腿的时候注意左右对称前左腿和前右腿的舵机安装方向要镜像否则代码里角度正负会搞混。舵机安装前一定要校准中位。方法是给舵机发送 90 度信号等它转到中位后再安装舵盘和连杆。如果先装好再校准舵盘位置可能不对导致腿的初始姿态歪斜。校准中位后把腿摆到直立位置再固定连杆。这样上电后机器人就能保持直立不会一通电就摔倒。电线管理也是个细节。舵机线又细又多如果不整理行走时线会缠在一起甚至被腿夹住。我用的是扎带加热缩管把三组舵机线分别捆好沿着身体框架走线最后集中到主控板附近。留一点余量让腿能自由活动但不要留太多否则线会晃来晃去。5.2 常见问题速查表问题现象可能原因排查方法解决方案上电后机器人立即摔倒舵机中位未校准或腿初始角度不对检查代码中初始角度是否为 90 度重新校准舵机中位调整初始角度行走时左右摇晃严重重心偏高或重心投影偏离支撑三角形手动测试重心位置降低电池位置调整身体姿态某条腿不动或抖动舵机线接触不良或舵机损坏交换舵机信号线测试重新插紧线缆更换舵机主控板频繁复位舵机电流过大导致电压跌落用万用表测电源电压舵机独立供电加电容缓冲步态看起来不协调步态时序参数不合适逐步调整各阶段时间增加稳定阶段时间降低速度转向时容易翻倒转向时重心偏移过大观察转向时重心投影减小转向角度增加支撑腿调整5.3 调试心得与避坑经验调试 Quaddle 最耗时的部分不是写代码而是反复试错找参数。步态周期、抬腿高度、步幅、重心偏移量这些参数没有标准答案取决于你的机器人重量、腿长、舵机性能。我的经验是先调静态站立再调单腿动作最后调完整步态。静态站立稳了单腿动作顺了完整步态就是水到渠成的事。另一个坑是舵机一致性。便宜的舵机即使同型号实际角度也会有偏差。我买了 10 个 SG90实测中位角度从 87 度到 93 度都有。如果代码里统一用 90 度三条腿就会不一样长。解决办法是给每个舵机单独标定 offset在代码里补偿。标定方法很简单发送 90 度用量角器测实际角度差值就是 offset。还有一点不要一上来就追求速度。我见过很多人把步态周期调到 0.5 秒结果机器人走两步就翻。三足静态步态的物理极限就在那里重心移动需要时间抬腿落下需要时间。1.5 秒的周期看起来慢但稳定可靠。等你有经验了可以尝试 1 秒甚至 0.8 秒但前提是重心控制和支撑面设计都做到位。6. 扩展玩法与进阶方向6.1 传感器融合与自主行走基础版 Quaddle 只能执行预设步态加上传感器就能实现自主行为。最便宜的方案是超声波模块装在身体前方检测障碍物距离距离小于阈值就转向。超声波模块只要几块钱Arduino 库也成熟半天就能搞定。稍微进阶一点可以用红外测距响应更快但检测范围窄。再往上就是IMU惯性测量单元用 MPU6050 这类六轴传感器检测身体倾斜实时调整重心让机器人在斜坡上也能保持平衡。IMU 的用法稍微复杂一点。MPU6050 输出加速度和角速度需要通过互补滤波或卡尔曼滤波融合出姿态角。姿态角反馈给步态控制器当身体前倾时加快前腿迈步当身体侧倾时调整支撑腿角度。这套逻辑写起来不复杂但调参需要耐心。我建议先用串口打印姿态角手动倾斜机器人观察数值变化确认传感器工作正常后再接入控制循环。6.2 无线遥控与手机 App给 Quaddle 加无线遥控最直接的是蓝牙模块 HC-05 或 HC-06手机装个蓝牙串口 App发送字符指令。HC-05 支持主从模式可以配对手机HC-06 只能从模式但更便宜。接线也简单VCC、GND、TX、RX 四根线TX 接 Arduino 的 RXRX 接 Arduino 的 TX。注意电平匹配HC-05 是 3.3V 逻辑Arduino 是 5V直接接可能烧模块最好加电平转换或者用分压电阻。如果想做手机 App 控制可以用MIT App Inventor拖拽界面通过蓝牙发送指令。App Inventor 有现成的蓝牙组件半小时就能做出一个带方向按钮的控制界面。我做过一个四个方向按钮加一个停止按钮通过蓝牙发送 F、B、L、R、S。延迟大约 100 毫秒控制慢速步态完全够用。6.3 步态算法进阶从静态到动态静态步态玩熟了可以尝试动态步态。动态步态的核心是让机器人利用惯性维持平衡允许只有一条腿着地。三足机器人的动态步态比较少见但原理和双足机器人类似身体前倾后腿蹬地前腿快速前摆利用重力分量提供前进动力。这种步态速度快、动作流畅但控制难度高需要精确的时序和重心控制。另一个进阶方向是自适应步态。根据地面情况自动调整抬腿高度和步幅。比如在粗糙地面上抬高腿避免绊倒在光滑地面上减小步幅防止打滑。这需要传感器反馈和实时计算对主控性能有一定要求。ESP32 或 STM32 这类性能更强的板子更适合做这个。我个人觉得Quaddle 最大的价值不在于它现在能做什么而在于它足够简单让你能看懂每一步的原理然后自己动手改。你可以改步态、加传感器、换主控、重新设计身体结构。它是一块跳板不是终点。我自己的 Quaddle 已经改了三次结构、重写了两次步态代码每次都有新发现。这种“能拆能改能折腾”的特性才是开源硬件最吸引人的地方。