简介:这是一套面向嵌入式开发者、机器人爱好者与高校机电/自动化专业学习者的腿部动力外骨骼完整工程资源,聚焦于从机械结构设计到运动控制实现的全链路实践。资源涵盖STM32主控硬件设计(含原理图)、可直接用于3D打印的SolidWorks零件模型(176个sldprt)与装配体(30个sldasm)、结构加工图(21个dxf)、电机驱动与传感器融合的C语言控制源码(151个c + 15个cpp),以及FreeRTOS多任务调度框架和PID控制逻辑实现。压缩包共1014个文件,大小72.34MB,类型覆盖嵌入式固件(elf、hex、map)、PCB设计(kicad_pcb)、工程配置(cproject、launch)及文档说明(pdf、html),目录组织清晰,便于模块化学习与二次开发。目前已有407人下载学习,适合开展课程设计、毕业设计或小型外骨骼原型验证,能直接获取可编译运行的STM32控制工程、可切片打印的结构模型及配套电路参考方案。
1. 项目概述:从图纸到实物的个人外骨骼探索
几年前,我在一个机器人展会上第一次看到动力外骨骼的演示,那种将机械力量与人体运动无缝结合的震撼感,至今记忆犹新。当时我就想,这种看似高精尖的科技,是否也能通过开源硬件和3D打印技术,让像我这样的硬件爱好者和创客也能亲手实现?这个念头一直萦绕在我心头,直到我决定动手,才有了今天这个“腿部动力外骨骼”项目。它不是一个商业产品,而是一个纯粹的个人探索,旨在验证用低成本、易获取的组件(如STM32F103C8T6“蓝板”、MG996R舵机、3D打印件)实现基础助力功能的可行性。如果你也对机器人、嵌入式控制或机电一体化感兴趣,希望通过一个综合性项目来串联起3D建模、单片机编程、传感器融合和机械结构设计,那么这个项目会是一个绝佳的练手机会。它解决的不仅仅是“如何让机器腿动起来”的问题,更是如何将抽象的代码、冰冷的模型和物理世界中的力学、人体工学结合起来,最终实现一个能与人协同工作的智能辅助装置。
2. 项目整体设计与核心思路拆解
2.1 为什么选择“开源硬件+3D打印”的路径?
在项目启动之初,路径选择至关重要。市面上有成熟的工业级或医疗级外骨骼,但它们通常价格昂贵、技术封闭。我的目标不是复刻它们,而是搭建一个可理解、可修改、可学习的平台。因此,“开源硬件+3D打印”成为了不二之选。
- 成本可控:核心控制器采用常见的STM32F103系列(如“蓝板”或“黑金板”),价格仅数十元。执行机构使用大扭矩的舵机(如MG996R),单个成本几十元。结构件全部通过3D打印(PLA或PETG材料)实现,极大地降低了机械加工的门槛和费用。
- 迭代快速:3D建模(我使用Fusion 360)的最大优势是易于修改。当你发现某个关节结构强度不足或运动范围不合理时,可以迅速在软件中调整,重新切片打印,可能在几个小时内就能完成一次设计迭代。这是传统机加工无法比拟的。
- 技术栈亲民:STM32拥有庞大的社区和丰富的资料(标准外设库、HAL库),Arduino生态也有大量相关库。3D打印技术也已非常普及。这意味着项目的大部分技术难点,都能在开源社区找到参考和解决方案。
这个选择背后的核心思路是:将复杂系统模块化。我们将整个外骨骼拆解为机械结构、驱动单元、控制核心、传感反馈和能源供给五个模块,分别攻克,再集成调试。
2.2 核心功能定义与方案选型考量
对于个人项目,明确一个有限但可实现的核心目标比追求大而全更重要。我将核心功能定义为:实现膝关节在矢状面(前后摆动)的单自由度主动助力。
为什么是膝关节?为什么是单自由度?人体下肢运动极其复杂,涉及髋、膝、踝多个关节在多平面的联动。作为入门项目,全面复现是不现实的。膝关节在行走、上下楼等动作中承担了主要的屈伸做功,是助力的关键。锁定矢状面的屈伸运动,可以大大简化机械结构、控制算法和传感器需求,让我们先集中精力解决“有无问题”。
驱动方案选择:舵机 vs 无刷电机
- 舵机(MG996R):这是一个集成了电机、减速箱和位置反馈(电位器)的“一体化伺服模块”。其优点是接口简单(PWM信号控制)、自带闭环位置控制、即插即用。对于精度和动态响应要求不极高的场景,它是快速原型验证的利器。本项目选择它,正是看中了其易用性。
- 无刷电机+驱动器+编码器:这套方案能提供更高的功率密度、更快的响应速度和更顺滑的控制(通过FOC算法)。但缺点是系统复杂(需要电机驱动板、编写FOC算法)、成本高、调试难度大。这更适合进阶阶段,当舵机的扭矩和性能成为瓶颈时再考虑升级。
控制核心选择:STM32F103C8T6在STM32F10x系列中,C8T6型号资源适中(72MHz Cortex-M3,64KB Flash,20KB RAM),引脚数量足够,且拥有丰富的定时器(用于产生多路PWM控制舵机)和通信接口(如USART、I2C用于连接传感器)。其标准外设库(Standard Peripheral Library)成熟稳定,资料丰富,是学习STM32和进行中等复杂度项目开发的经典选择。
3. 机械结构设计与3D建模要点
3.1 基于人体工学的结构设计原则
外骨骼要与人协同工作,第一要义是“适配”而非“对抗”。我的设计遵循以下几个原则:
- 非承载式结构:外骨骼的主要作用是提供辅助力矩,而不是完全承担人体重量。因此,结构设计要轻量化,并通过绑带将力分散传递到大腿和小腿的肌肉群上,避免压强过大导致不适。在3D模型中,你会看到贴合腿部曲线的衬垫接口和宽幅绑带固定位。
- 关节轴线对齐:这是最关键也最容易出错的一点。外骨骼膝关节的旋转轴线,必须与人体膝关节的生理旋转轴线尽可能重合。如果轴线偏差过大,在运动时会产生额外的剪切力,不仅影响助力效果,还可能造成损伤。在建模时,我通过查阅解剖学资料和自行测量,确定了大概的轴线位置,并在大腿和小腿连杆上设计了可微调的安装槽,用于实际穿戴时的精细对中。
- 轻量化与强度平衡:使用3D打印,可以通过结构设计(如镂空、加强筋)来实现轻量化。我选择的打印材料是PETG,它比PLA韧性更好,更耐冲击和疲劳。对于关键受力部件(如关节连接处、舵机安装座),打印填充率设置为40%-50%,并合理设计加强筋的方向(沿受力方向)。
3.2 3D模型图纸详解与装配关系
提供的3D模型文件(通常是STEP或STL格式)包含了所有可打印的零件。主要部件包括:
- 大腿支架:用于固定在大腿中段,上端有绑带孔,下端与膝关节驱动单元连接。
- 小腿支架:固定在小腿中段,上端与膝关节驱动单元连接。
- 膝关节驱动单元外壳:这是一个核心部件,内部用于安装MG996R舵机。设计时重点考虑了:
- 舵机固定:采用卡扣+螺丝的双重固定方式,防止舵机在输出扭矩时发生晃动或旋转。
- 散热:外壳侧面设计有栅格,帮助舵机散热。长时间大扭矩工作,舵机发热是不可避免的。
- 输出轴连接:舵机的输出舵盘需要通过一个自定义的连接件,与大腿/小腿连杆进行固连。这个连接件的设计要保证无虚位、能传递大扭矩。我采用了D形孔配合紧定螺丝的方式。
- 连杆与连接件:用于传递舵机扭矩到肢体。所有旋转关节处都使用了深沟球轴承(如608ZZ)来减少摩擦,保证运动顺滑。在模型上,轴承的安装位都预留了标准的压配公差。
- 绑带固定扣:用于快速穿脱的插扣底座。
装配顺序建议:
- 先将轴承压入大腿连杆和小腿连杆的关节孔位。
- 将舵机安装进驱动单元外壳并固定。
- 把舵盘连接件紧固在舵机输出轴上。
- 通过关节轴(一根长螺丝或光轴)将大腿连杆、驱动单元(连接件)、小腿连杆依次串起来,并用螺母锁紧。注意添加垫片以减少轴向晃动。
- 最后将大腿/小腿支架分别固定到对应的连杆上。
注意:3D打印的零件可能存在微小的收缩或变形,导致轴承压配过紧或轴孔配合不良。建议准备一套小什锦锉和砂纸,用于装配前的修整。对于关键配合尺寸,可以在建模时故意预留0.2-0.3mm的调整余量。
4. 控制系统硬件搭建与电路解析
4.1 STM32最小系统与外围电路
控制核心是一块STM32F103C8T6最小系统板。除了核心板,我们需要搭建必要的外围电路:
电源管理:这是整个系统的“心脏”,也是最容易出问题的地方。
- 舵机电源:MG996R在堵转时电流可高达2A以上。绝对不能直接用开发板的5V引脚给多个舵机供电!必须使用独立的大电流5V稳压模块(如基于MP1584或LM2596的降压模块),输入接大容量锂电池(如3S锂聚合物电池,11.1V),输出接一个电容阵(例如多个并联的1000uF电解电容)以应对舵机启动时的瞬时电流冲击。
- STM32电源:可以从上述5V稳压模块的输出,再经过一个低压差线性稳压器(LDO,如AMS1117-3.3)得到3.3V,为STM32和传感器供电。这样可以实现数字部分的电源干净、稳定。
- 地线连接:确保舵机电源地、STM32电源地、传感器电源地最终都良好地连接在一起(共地),避免参考电位不同导致信号紊乱。
信号连接:
- 舵机控制线:舵机的信号线(通常是橙色或白色)连接到STM32的任意通用定时器(如TIM2, TIM3, TIM4)的通道引脚,配置为PWM输出模式。STM32的PWM频率通常设置为50Hz(周期20ms),通过调节占空比(0.5ms-2.5ms的脉冲宽度)来控制舵机角度(0-180度)。
- 传感器接口:为了感知使用者的运动意图,我引入了两种传感器:
- 肌电传感器(EMG):这是一种进阶选择,用于检测大腿肌肉的表面电信号。它通常输出模拟量,连接到STM32的ADC引脚。信号非常微弱且噪声大,需要前端放大和滤波电路,调试难度较高。
- 惯性测量单元(IMU):如MPU6050(集成三轴陀螺仪+三轴加速度计)。这是更可靠和易用的选择。通过I2C接口与STM32连接,可以实时获取大腿和小腿段在空间中的角度、角速度。通过计算两者夹角,就能间接得到膝关节角度。这是本项目推荐的主要传感方案。
4.2 传感器选型与数据融合策略
如前所述,MPU6050是性价比极高的入门IMU。但在使用中,有以下几个关键点:
- 安装位置:需要两个MPU6050,分别牢固地安装在大腿和小腿支架上,并尽量使它们的传感器坐标系与肢体方向对齐。
- 数据校准:上电后,必须进行静态校准,以消除零偏(Offset)。将外骨骼平放静止数秒,读取此时加速度计和陀螺仪的输出,作为零偏值保存,后续读数减去此零偏。
- 姿态解算:原始数据(加速度、角速度)不能直接用作角度。需要通过算法进行融合。最常用的是互补滤波或卡尔曼滤波。
- 互补滤波:原理简单,计算量小,非常适合STM32F103。其核心思想是:利用加速度计在长期静态下的数据来校正陀螺仪积分产生的漂移,利用陀螺仪在短期动态下的数据来抑制加速度计因运动产生的噪声。代码实现起来大约十几行,效果对于外骨骼应用已经足够。
- 卡尔曼滤波:更优,但参数调优更复杂。对于初学者,建议从互补滤波开始。
通过融合两个IMU的数据,我们可以稳定地计算出膝关节的实时角度θ_knee。这个角度是后续一切控制算法的基础。
5. 控制算法源码深度解析
控制源码的核心逻辑,是建立一个从“感知人腿运动意图”到“驱动外骨骼输出相应助力”的闭环。整个程序框架围绕状态机展开。
5.1 程序主框架与状态机设计
程序不会一直全力输出,而是根据传感器的信息判断当前处于哪种运动模式。一个典型的状态机包括:
- 初始化状态:系统上电,进行IMU校准,舵机回零。
- 站立/空闲状态:检测到膝关节角度变化很小且角速度很低。此时,控制算法输出一个较小的保持力矩(或零力矩),让外骨骼“随动”,不干扰使用者正常站立。
- 摆动相状态:当检测到膝关节开始有较大的角速度(例如准备迈步),算法进入此状态。此时的控制目标是助力屈曲或伸展,根据运动方向,输出一个与角速度正相关的辅助扭矩。
- 支撑相状态:当检测到脚部触地(可通过在脚底加装压力传感器或分析IMU冲击信号判断),算法进入此状态。此时若检测到膝关节有屈曲趋势(如下蹲、下楼梯),则输出一个抵抗屈曲的辅助扭矩,帮助支撑身体。
在main.c中,你会看到一个主循环,它不断执行以下步骤:
int main(void) { // 硬件初始化 System_Init(); // 时钟、GPIO、定时器(PWM)、ADC、I2C等 IMU_Calibration(); // IMU校准 Servo_GoToNeutral(); // 舵机回中位 while(1) { // 1. 传感器数据采集 IMU_UpdateData(&thigh_imu, &shank_imu); // 读取两个IMU数据 // (可选) Read_EMG_Signal(); // 读取肌电信号 // 2. 数据融合与状态判断 knee_angle = Calculate_Knee_Angle(thigh_imu, shank_imu); // 计算膝关节角度 knee_velocity = Calculate_Knee_Velocity(); // 计算膝关节角速度 current_state = Determine_Gait_State(knee_angle, knee_velocity, ...); // 判断当前步态状态 // 3. 基于状态的控制算法计算 target_torque = Control_Algorithm(current_state, knee_angle, knee_velocity); // 4. 扭矩映射为舵机指令并输出 servo_angle = Torque_To_Angle(target_torque); // 将目标扭矩转换为舵机角度 Servo_SetAngle(servo_angle); // 输出PWM,驱动舵机 // 5. 延时或等待定时中断,控制循环频率(如100Hz) Delay_ms(10); } }5.2 核心控制算法:基于阻抗模型的助力策略
直接控制位置(让舵机严格跟踪某个角度曲线)会非常生硬,一旦人腿运动与外骨骼指令稍有不同步,就会产生对抗。因此,更高级的策略是阻抗控制。
你可以把阻抗控制想象成在人和外骨骼之间连接了一个虚拟的“弹簧-阻尼器”系统。
- 弹簧:产生与角度偏差成比例的力。比如,当人腿想弯曲,但外骨骼没动,就会产生一个阻止弯曲的力(如果弹簧刚度设为正)。
- 阻尼器:产生与运动速度成比例的力,总是阻碍运动。用于平滑运动,抑制抖动。
在我们的控制算法中,我们设定一个虚拟的平衡位置。这个平衡位置可以跟随人腿的运动而缓慢调整(比如是当前角度的低通滤波值)。当人腿主动运动,偏离这个平衡位置时,外骨骼就会根据偏离的程度(位移)和偏离的速度,按照“弹簧-阻尼”模型计算出一个应该输出的力。
关键公式(简化版):目标扭矩 = Kp * (当前角度 - 平衡角度) + Kd * (当前角速度)
Kp是虚拟弹簧的刚度系数。Kp为正时,外骨骼抵抗偏离,提供支撑力;Kp为负时,外骨骼助力偏离,提供驱动力。我们可以根据不同的步态状态(支撑相、摆动相)来切换Kp的正负和大小。Kd是虚拟阻尼系数,始终为正,用于吸收运动能量,让动作更顺滑。平衡角度是一个缓慢更新的值,可以等于当前角度的滤波值,这样在静止时,外骨骼不会主动施力。
在源码的control_algorithm.c文件中,你会找到类似Impedance_Control()的函数,里面实现了上述逻辑。调试的核心就是调整Kp和Kd这两个参数。这是一个需要耐心和反复测试的过程。
5.3 舵机控制与角度-扭矩映射
MG996R是位置控制舵机,我们只能通过PWM指定它的目标角度。但我们的控制算法输出的是目标扭矩。因此,需要一个映射环节。
一个简单有效的方法是:将目标扭矩直接转换为一个角度的增量(或减量)。
// 伪代码示例 int16_t Torque_To_Angle(int16_t target_torque) { // 将扭矩值按比例转换为角度增量。增益系数A需要实验确定。 int16_t angle_delta = target_torque * A / 1000; // 将角度增量叠加到当前舵机角度上,并限制在物理范围内(如0-180度) static int16_t current_servo_angle = 90; // 假设中位是90度 current_servo_angle += angle_delta; current_servo_angle = constrain(current_servo_angle, 0, 180); // 限幅函数 return current_servo_angle; }这样,当算法计算出一个正向扭矩(助力屈曲),舵机就会朝屈曲方向移动一个小角度;反之亦然。由于控制循环很快(如100Hz),这种微小的、连续的增量运动,最终会合成一个平滑的助力效果。
6. 系统集成、调试与实测心得
6.1 分步集成与上电测试流程
集成绝不能一蹴而就。务必遵循以下安全步骤:
- 机械空载测试:不安装舵机,手动活动所有关节,检查运动范围是否顺畅,有无干涉。安装舵机后,断开舵机与连杆的连接,仅上电测试舵机能否根据代码指令正常转动。
- 电路单独测试:先只给STM32核心板上电,通过串口打印信息,确认程序运行正常,传感器数据读取正确。然后再连接舵机电源。
- 轻负载测试:将外骨骼放在桌面上,连接好机械部分,但不要穿戴。运行程序,用手轻轻推动小腿部分,感受舵机的响应。此时应能感觉到一定的“弹性”阻力(来自阻抗控制)。
- 穿戴静态测试:穿戴外骨骼,但保持坐姿或站立不动。程序应处于“空闲状态”,外骨骼不应有主动的、令人不适的力。轻微晃动腿部,感受其跟随性。
- 低速动态测试:尝试非常缓慢地做屈膝、伸膝动作。观察外骨骼是助力、阻力还是随动。通过无线串口(如HC-05蓝牙模块)或SD卡实时记录角度、扭矩指令等数据,用于后续分析。
6.2 参数调试:从“僵硬”到“顺滑”的关键
调试就是和Kp、Kd这两个参数“搏斗”的过程。
现象:外骨骼抖动、振荡。
- 原因:
Kp太大,导致系统过于“敏感”,像一根硬弹簧,稍微偏离就猛烈回拉,产生过冲和振荡。 - 解决:大幅降低
Kp。先尝试将Kd设为0,只调Kp,找到一个刚好能感觉到有轻微阻力,但不会引发振荡的值。
- 原因:
现象:运动迟滞、感觉“粘稠”。
- 原因:
Kd太大,虚拟阻尼过强,吸收了太多运动能量。 - 解决:降低
Kd。在固定Kp后,慢慢增加Kd,直到快速运动时的抖动消失,但又不觉得费力。
- 原因:
现象:助力感不明显。
- 原因:
Kp太小,或者Kp的正负号设置错误(在需要助力的摆动相,Kp应为负值)。 - 解决:检查状态判断逻辑是否正确切换到“摆动相”。在摆动相,尝试逐步增加负向
Kp的绝对值。
- 原因:
调试口诀:先调Kp找响应,再调Kd抑振动;正负切换分状态,从小增大慢慢试。
6.3 安全机制与故障处理
安全永远是第一位的,尤其是将机械装置穿戴在身上时。
- 软件限位:在
Servo_SetAngle()函数中,必须对输入的角度值进行严格的上下限约束(如0-170度),防止计算错误导致舵机转到机械极限位置,造成卡死或损坏。 - 看门狗:启用STM32的独立看门狗(IWDG)。在主循环中定期“喂狗”。如果程序跑飞导致卡死,看门狗会在设定时间内复位系统,让舵机停止在当前位置,而不是失控乱转。
- 急停开关:在手腕或另一只手上连接一个物理急停开关(常闭型),串联在舵机电源回路中。一旦感觉不对,立即拍下开关,切断舵机电源。
- 电流监测:在舵机电源线上串联一个采样电阻,通过STM32的ADC监测实时电流。如果电流持续超过阈值(如2.5A),可能发生堵转,程序应主动停止PWM输出并报警。
7. 常见问题排查与进阶优化方向
7.1 典型问题速查表
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 舵机不转动或抖动 | 1. 电源功率不足 2. PWM信号问题 3. 机械卡死 | 1. 用万用表测量舵机供电电压(带载时),应不低于5V。检查电池电量,更换更大电流的稳压模块。 2. 用示波器或逻辑分析仪检查STM32输出的PWM波形,频率是否为50Hz,脉宽是否在0.5-2.5ms间变化。 3. 断开舵机与负载的连接,空载测试是否转动。检查机械结构有无干涉。 |
| IMU角度漂移严重 | 1. 未校准或校准不准确 2. 传感器安装不牢固 3. 滤波算法参数不当 | 1. 确保执行了静态校准流程,且校准时平台绝对水平静止。 2. 紧固IMU的安装,避免其在运动中抖动。 3. 调整互补滤波的比例系数,增加加速度计数据的权重(对于低频运动)。 |
| 外骨骼运动与人体不同步,有对抗感 | 1. 状态判断逻辑错误 2. 阻抗控制参数(Kp,Kd)不佳 3. 关节轴线未对齐 | 1. 打印输出当前状态变量,检查状态切换逻辑是否与真实动作吻合。 2. 回到第6.2节,重新调试参数。可能是 Kp过大或Kd过小。3. 重新调整绑带和支架,确保外骨骼关节轴心与人腿关节轴心尽可能重合。 |
| 系统运行一段时间后复位 | 1. 电源纹波或跌落 2. 程序堆栈溢出 3. 看门狗未正确喂狗 | 1. 在STM32的3.3V电源引脚并接一个100uF的电解电容。 2. 检查是否有大型局部数组,或递归调用。优化代码。 3. 检查看门狗初始化时间和喂狗间隔。 |
7.2 从原型到进阶的优化思路
当基础功能实现后,你可以从以下几个方向进行深化:
- 传感升级:
- 足底压力传感器:在鞋垫内安装薄膜压力传感器(FSR),可以更精确地判断步态周期中的“脚跟触地”、“全脚掌支撑”、“脚尖离地”等事件,使状态机判断更精准。
- 编码器替代电位器:MG996R内置的是电位器,精度和寿命有限。可以尝试改装,在输出轴加装磁编码器(如AS5600),获得更高精度和更耐用的位置反馈。
- 驱动升级:将舵机更换为无刷直流电机(BLDC)加行星减速箱,并采用FOC驱动。这将带来更大的扭矩、更高的效率和更顺滑的力控体验。但这意味着你需要学习FOC算法(如SimpleFOC开源库)和更复杂的机械设计。
- 算法升级:
- 自适应控制:让
Kp、Kd参数能够根据使用者的步速、负载重量自动调整,实现更个性化的助力。 - 基于模型的控制:建立人体下肢的简化动力学模型,结合IMU数据估算关节力矩,实现更“智能”的助力。
- 自适应控制:让
- 结构优化:使用碳纤维管等轻质材料替代部分3D打印件,进一步减轻重量。优化绑带系统和衬垫,提升穿戴舒适度。
这个项目就像一把钥匙,打开了一扇通往机器人学和人机交互领域的大门。它涉及的知识点横跨机械、电子、软件和生物力学。我最深的体会是,理论仿真再完美,也抵不过一次实际的穿戴测试。那些数据手册上没有的细微摩擦、绑带的松紧带来的力传递差异、传感器微小的安装偏差对算法的影响,都是在一次次调试、失败、再调试中积累起来的“手感”。不要期望第一次就能成功,每一个出现的问题,无论是舵机啸叫还是角度漂移,都是你深入理解系统底层原理的机会。从让舵机简单地动起来,到它能温柔地推你一把,这个过程充满挑战,也充满乐趣。
本文还有配套的精品资源,点击获取