1. 项目缘起:从“玩具”到“伙伴”的执念
几年前,我在一个创客展上看到一台步履蹒跚的双足机器人,它用几个舵机驱动着3D打印的骨架,走起路来摇摇晃晃,像极了刚学会走路的孩子。那一刻,我被深深吸引了。不是因为它有多先进,恰恰相反,正是这种用简单工具(Arduino、舵机、3D打印件)去挑战复杂问题(双足行走)的“笨拙”与“纯粹”,让我看到了创造的魅力。市面上有太多成熟的机器人套件,开箱即用,功能强大,但它们更像是别人的作品。而“手搓”一台双足机器人,意味着从零开始理解它的每一个关节、每一次重心转移、每一行控制逻辑。这个过程,是学习机器人学、机械结构、电子控制和编程最直接、也最深刻的方式。它不追求商业级的稳定,而是追求从无到有的完整闭环体验。今天,我就想和你分享这段“手搓”之旅,从零开始,用Arduino作为大脑,舵机作为肌肉,3D打印件作为骨骼,一步步搭建一个能自己站起来的双足伙伴。无论你是对机器人充满好奇的学生,还是想找个硬核项目练手的电子爱好者,这篇记录都能给你一份可复现的“地图”。
2. 核心骨架:3D打印结构的设计与优化陷阱
双足机器人的骨架,是决定其运动性能和稳定性的物理基础。直接购买金属或碳纤维骨架固然省事,但成本高昂且缺乏定制性。3D打印,尤其是FDM(熔融沉积)技术,以其低成本、高自由度的特点,成为了个人制作机器人骨架的首选。但这里面的坑,远比想象中多。
2.1 材料选择:PLA的“脆”与PETG的“韧”
新手最容易犯的错误是直接使用最常见的PLA材料。PLA打印简单,层间粘合好,成品美观。但对于需要承受反复应力和冲击的机器人关节来说,PLA的脆性是个致命伤。我曾用PLA打印了一个髋关节连接件,在机器人第一次尝试抬腿时,它就在舵机输出轴的应力集中处裂开了。
注意:绝对不要用PLA打印核心承力结构件,如大腿、小腿、髋部连接件。
经过多次测试,PETG材料是更平衡的选择。它比PLA更坚韧、更有弹性,抗冲击和抗疲劳性能好得多,同时打印难度又低于ABS(不易翘边,对打印环境要求低)。虽然表面光泽度略差,但对于功能件来说完全够用。打印参数上,建议将层高设置为0.2mm,壁厚至少3层,填充密度提高到30%-40%,以增加结构强度。对于特别关键的受力部位,如舵机舵盘与连杆的连接处,可以设计加强筋或局部增加厚度。
2.2 结构设计:仿生学与工程学的妥协
双足机器人的腿部结构,本质上是一个多连杆机构。最经典的简化模型是“髋关节-膝关节-踝关节”的三连杆结构。我们的设计也需要围绕这个核心展开。
关节间距与比例:这是决定步态自然与否的关键。一个实用的经验公式是:大腿长度 ≈ 小腿长度。总腿长(从髋关节轴心到脚底)约占机器人总身高的50%-60%。例如,如果你希望机器人总高在30cm左右,那么单腿长度可以设计在15-18cm。这个比例更接近人类,有利于重心调节。
舵机安装方式:舵机是机器人的“肌肉”,其安装方式直接影响力矩输出和结构刚度。切忌将舵机悬空安装,仅靠其自身的固定耳受力。正确做法是设计一个完整的“舵机舱”,将舵机完全包裹进去,让外壳承受大部分扭力。对于髋关节这种需要输出大扭矩的部位,甚至可以设计两个互相垂直的舵机舱,形成稳定的L形结构,共同分担负载。
连接件与舵盘:舵机附带的塑料舵盘强度堪忧,特别是当连杆较长形成力臂时,极易滑齿或断裂。我的解决方案是:自行设计并打印铝合金舵盘(如果条件允许)或使用加厚的尼龙舵盘。同时,连接舵盘和结构件的连杆,最好使用球头连杆或鱼眼轴承,它们能提供一定的自由度,避免因安装误差导致的憋劲现象,保护舵机齿轮。我在第一次组装时使用了普通的M2螺丝加螺母的刚性连接,结果导致两个舵机在初始化时就嗡嗡作响,发热严重,这就是典型的安装应力过大的表现。
脚掌设计:脚掌是机器人与地面唯一的接触点,其设计至关重要。一个平坦的脚掌在单脚支撑期极易导致机器人前后摇晃(就像踩在滚木上)。有效的改进是:
- 增加弧形底面:将脚底设计成微小的弧形(类似摇椅底部),这能提供一个微小的前后摆动范围,让重心转移更平滑。
- 增加防滑:在脚底粘贴橡胶片或EVA泡棉,能极大增加静摩擦力,防止打滑。我试过用鼠标垫裁剪,效果非常好。
- 考虑踝关节:如果空间和预算允许,为脚掌增加一个俯仰方向的舵机作为踝关节,能极大地提升平衡能力,但这会显著增加控制和结构的复杂度。对于初版,一个被动的、带弧形的脚掌是更务实的选择。
3. 动力与神经:舵机选型与Arduino控制逻辑
骨架是躯体,舵机是肌肉,而Arduino则是大脑和神经。这三者的配合,决定了机器人是能翩翩起舞还是原地散架。
3.1 舵机选型:扭矩、速度与总线之辩
市面上舵机主要分三类:普通PWM舵机、模拟舵机和数字总线舵机(如一些Hiwonder、创乐博品牌使用的串行总线舵机)。
- 普通PWM舵机(如SG90、MG90S):最便宜、最常见。通过20ms周期的PWM信号脉宽(通常500-2500μs)来控制角度。优点是简单、兼容性极广。缺点是精度一般,没有位置反馈,容易出现抖动,且需要每个舵机单独连接信号线,线束非常混乱。
- 数字总线舵机:通过一条总线(如TTL串口)串联控制所有舵机。优点极其明显:线束整洁(只需3-4根线连接所有舵机),可读取角度、温度、负载等反馈信息,控制精度高、响应快。缺点是价格昂贵,且需要特定的通信协议和库支持。
对于“手搓”项目,我的建议是:如果预算极其有限,可以从MG90S这类金属齿轮的PWM舵机开始,但务必做好线束管理的心理准备。如果希望有更好的体验和扩展性,投资一套数字总线舵机是值得的,它能让你更专注于算法,而不是在理线上抓狂。我中途从PWM舵机换到了总线舵机,整个项目的整洁度和可调试性提升了不止一个档次。
扭矩计算:这是选型的核心。你需要估算在最坏情况下(如机器人单腿支撑,身体倾斜时),关节需要输出的扭矩。一个简化估算方法是:所需扭矩 ≈ 机器人总重量 × 重力力臂。例如,机器人重1kg,髋关节到重心的水平距离(力臂)在运动时最大可能达到5cm(0.05m),那么所需扭矩至少为1kg * 9.8N/kg * 0.05m ≈ 0.49 N·m,即约5 kg·cm。实际选择时,至少要留有2-3倍的安全余量。因此,对于髋关节和膝关节,选择扭矩在15-25 kg·cm的舵机是合理的。踝关节如果使用,也需要类似扭矩。
3.2 Arduino控制核心:从 Uno 到 ESP32 的演进
Arduino Uno是入门经典,但它只有6个PWM引脚,对于需要至少6个舵机(每条腿3个)的双足机器人来说,刚好够用但毫无冗余,且无法应对更复杂的传感器扩展。更严重的是,它的处理能力在运行复杂的步态算法时可能会捉襟见肘。
更好的选择是 ESP32。原因如下:
- 引脚丰富:ESP32开发板通常有16个以上的PWM通道,轻松驱动多个舵机。
- 性能强大:双核处理器,主频高达240MHz,远胜于Uno的16MHz,可以流畅运行PID控制等算法。
- 无线功能:内置Wi-Fi和蓝牙,这意味着你可以轻松地通过手机APP或电脑上位机无线调试机器人的姿态和步态,无需拖着USB线,调试体验是天壤之别。
- 生态系统:在Arduino IDE中安装ESP32开发板支持后,其编程方式与Arduino高度相似,学习成本低。
因此,我强烈建议直接使用ESP32(如ESP32-DevKitC)作为主控。在Arduino IDE中,通过“开发板管理器”安装“ESP32 by Espressif Systems”即可开始编程。
3.3 编程框架与步态生成:从硬编码到逆运动学
最初的编程往往是“硬编码”角度序列。例如,让机器人走一步,就手动设定一组舵机角度:hip_angle=30, knee_angle=-15, ankle_angle=5,延时,再设定下一组。这种方法直观,但极其笨拙,无法调整步长、步高,且动作生硬。
更高级的方法是使用逆运动学。我们定义机器人的“末端执行器”——也就是脚底中心点——在空间中的坐标 (x, y, z)。然后通过数学公式(对于平面两连杆机构,可以用余弦定理)反推出髋关节和膝关节应该转动的角度。这样,我们只需要规划脚底的行走轨迹(一个椭圆或摆线),就能自动计算出所有关节的角度,步长、步高都可以通过参数轻松调节。
下面是一个简化的二维(侧面视图)逆运动学函数示例,用于计算给定脚底坐标时,大腿和小腿舵机的角度:
// 定义腿部长 const float L1 = 80.0; // 大腿长度 (mm) const float L2 = 80.0; // 小腿长度 (mm) void calculateLegIK(float x, float y, float &theta1, float &theta2) { // 计算到目标点的距离 float d = sqrt(x*x + y*y); // 检查是否可达 if (d > (L1 + L2) || d < fabs(L1 - L2)) { Serial.println("目标点不可达!"); return; } // 计算膝关节角度 (余弦定理) theta2 = acos((x*x + y*y - L1*L1 - L2*L2) / (2*L1*L2)); // 计算髋关节角度 theta1 = atan2(y, x) - atan2(L2 * sin(theta2), L1 + L2 * cos(theta2)); // 将弧度转换为角度(舵机库通常使用角度) theta1 = theta1 * 180.0 / PI; theta2 = theta2 * 180.0 / PI; }有了这个函数,规划步态就变成了规划脚底画一个椭圆。例如,在支撑相,脚底相对髋关节几乎不动;在摆动相,脚底沿一个椭圆轨迹从后向前移动。通过改变椭圆的大小和高度,就能改变步长和抬脚高度。
3.4 电源系统的血泪教训:动态负载下的电压跌落
这是新手,包括我,踩过的最大的坑。你以为用一个普通的5V 2A手机充电宝就够了?当多个舵机同时启动或堵转时,瞬间电流可以轻松超过5A,导致电源电压瞬间被拉低。Arduino/ESP32在电压低于一定阈值时会复位,机器人瞬间“瘫痪”。更糟糕的是,电压不稳会导致舵机控制信号紊乱,产生不可预测的抖动。
解决方案必须专业:
- 独立供电:舵机动力电源必须与主控板逻辑电源分离。使用一个大容量、高放电倍率的2S或3S锂聚合物电池(7.4V或11.1V)专门给舵机供电。注意,大部分舵机工作电压范围是4.8V-7.4V,使用3S电池时需要搭配降压模块(如BEC)将电压稳定在6V或7.4V。
- 电源滤波:在舵机电源入口处并联一个大容量低ESR的电解电容(如1000μF 16V),可以吸收瞬间电流冲击,平滑电压。实测效果立竿见影。
- 布线:电源线要足够粗(建议18AWG或更粗),并且尽量短,以减少线路阻抗带来的压降。
我的配置是:一个3S 2200mAh 25C的航模电池,接一个UBEC(稳压降压模块)输出稳定的6V电压给所有舵机。UBEC的输出端并联一个1000μF的电容。Arduino/ESP32则通过另一个独立的5V稳压模块(或电池经UBEC输出的另一路5V)供电。从此,再也没出现过复位问题。
4. 组装、调试与步态调参:从“站起来”到“走起来”
将所有零件组装起来,只是万里长征第一步。让机器人稳定地站立和行走,才是真正的挑战。
4.1 机械校准与零位设定
在通电编程前,必须进行机械校准。确保所有舵机的“零位”与机械结构的“物理零位”对齐。
- 暂时不安装连杆,给所有舵机上电。
- 在代码中将所有舵机角度设置为90度(假设90度为中间位置)。
- 观察舵机输出轴是否处于你期望的“中间”位置。如果不是,需要物理调整舵盘安装角度,或者在你的代码中为每个舵机设置一个“偏移量”(Offset)。例如,如果舵机在90度指令下实际指向了85度方向,那么它的偏移量就是+5度,以后所有发给这个舵机的角度指令都要加上5度:
write(desired_angle + offset)。
4.2 静态站立平衡调试
安装好所有连杆,让机器人尝试静态站立。这里的关键是调整重心投影点。
- 在代码中设置一个“站立姿态”,所有关节角度使机器人笔直站立。
- 将机器人放在平整、不太滑的桌面或地面上。
- 观察它是否前倾或后仰。如果前倾,说明重心太靠前,需要在代码中轻微增大踝关节的背屈角度(脚掌前端抬起),或者物理上在机器人背部配重。反之亦然。
- 这个过程需要反复微调。目标是找到一个稍微“后坐”一点的姿态,即重心投影落在脚掌中心偏后的位置,这样在启动行走时更容易向前迈步。
4.3 步态调试:分解动作与PID引入
不要一开始就尝试连续行走。将一步分解为多个阶段,逐个调试:
- 重心左移:保持双脚着地,仅移动上身重心到左腿上方。观察是否稳定。
- 右腿摆动:在重心左移的基础上,慢慢抬起右腿,向前摆动。这里需要引入第一个PID控制:用一个陀螺仪(如MPU6050)检测机身俯仰角,当抬腿导致机身前倾时,通过PID算法动态调整支撑腿(左腿)的踝关节或髋关节角度,将机身“推”回直立状态。这实现了最简单的“踝策略”平衡。
- 右腿放下:将摆动腿放下,回到双足支撑。
- 重心右移:重复过程。
关于PID调参:在平衡控制中,我们主要使用PD控制。P(比例)决定了对角度偏差的反应强度,D(微分)决定了对倾倒速度的抑制能力。I(积分)在平衡机器人中容易累积误差导致震荡,通常可以设为0或很小的值。调试时,先将P和D都设为0,慢慢增大P值,直到机器人能对倾斜做出明显但不过激的纠正。然后加入D值,用来抑制机器人在纠正过程中产生的晃动。这个过程必须在**有安全保护(如用手扶着,或在机器人上方悬挂安全带)**的情况下进行。
4.4 线束管理与外壳设计
一台到处是飞线的机器人是调试的噩梦。使用蛇皮网、缠绕管或线槽将舵机线缆整理好。对于总线舵机,线束管理会简单很多。此外,为Arduino/ESP32和电池设计一个简单的外壳或安装板,不仅能保护核心元件,还能方便地调整配重位置,优化重心。这个外壳同样可以用3D打印完成。
5. 进阶之路:传感器融合与更智能的平衡
当你的机器人能跌跌撞撞走起来后,就可以考虑给它增加“感官”,让它更智能。
- 惯性测量单元:MPU6050(陀螺仪+加速度计)是标配。通过传感器融合算法(如互补滤波或卡尔曼滤波),可以获得相对准确的机身俯仰角和横滚角。这是实现动态平衡的基础。
- 力敏电阻或压力传感器:贴在脚底,可以感知脚掌与地面的接触情况,判断是否完全着地,或者是否即将倾倒。
- 超声波或红外测距:安装在胸前,可以实现简单的避障功能。
- 上位机调试:利用ESP32的Wi-Fi功能,将机器人的传感器数据(角度、角速度)实时发送到电脑上的串口绘图工具(如Serial Plotter)或自定义的上位机软件。图形化地看到数据曲线,对于PID调参和步态优化有巨大帮助。
手搓一台双足机器人,是一个典型的“系统工程”。它要求你同时涉足机械、电子、编程甚至算法。过程中你会遇到无数次的失败:结构断裂、舵机烧毁、程序跑飞、机器人原地“尬舞”。但每一次解决问题的过程,都是对知识最深化的理解。当看到那个由你亲手设计、打印、焊接、编程的“小家伙”,终于颤颤巍巍地迈出第一步时,那种成就感是无与伦比的。它不仅仅是一个机器人,更是你学习与创造能力的实体化证明。这份教程是一个起点,而不是终点。你可以尝试更复杂的步态算法(如ZMP预览控制),更仿生的结构(加入弹簧模拟肌腱),甚至加上摄像头让它自主导航。