拓冰建站拓冰建站
首页 / 资讯中心 / 正文

STM32六足机器人毕业设计:从逆运动学到步态规划的完整实现

简介面向毕业设计场景的完整六足机器人项目包适合大学生、嵌入式学习者及竞赛备赛者内容涵盖基于STM32的硬件设计、嵌入式控制、答辩演示与论文撰写全流程方便快速上手机器人项目或参考完整设计范式。压缩包内共859个文件包含大量C语言源程序与头文件、编译生成的中间文件、Hex固件、Keil工程文件、原理图PCB、APP安装包以及答辩PPT与论文文档等可分别用于查看代码逻辑、烧录调试、查看电路设计及准备汇报材料包体约80MB。目前已吸引298人学习参考。整个资源不只提供最终代码还包含机械与控制算法细节、开发过程备份及PCBA加工文件便于深入理解六足机器人运动控制与STM32外设应用对完成课设或项目二次开发有较强参考价值。1. 毕业设计选型为什么六足机器人是STM32最完整的练手载体六足机器人几乎是本科阶段能接触到的“机构复杂度”与“软件深度”最平衡的平台。常见轮式小车只需要两个电机正反转四足机器人对关节扭矩和动态平衡要求又过高而六足机器人拥有18个自由度正好覆盖“多路PWM输出 运动学解算 状态机步态切换 传感器闭环”这些嵌入式核心技能点。STM32在这类场景下几乎是事实标准定时器资源足够同时驱动18路舵机信号Cortex-M4内核跑浮点运动学解算没有压力而且从Keil MDK到STM32CubeMX的开发链路非常成熟调试工具选择也多。这篇博文不讨论某个现成答辩项目包的安装方法而是把一套能直接用于毕设答辩的完整方案讲清楚从腿部运动学推导、舵机控制底层、步态规划到整机联合调试。你需要至少一块STM32F103RCT6或F407VET6开发板、18个MG996R舵机、3D打印或亚克力机架其余全部用代码解决。2. 腿部运动学建模与姿态解算六足机器人能站住的前提2.1 单腿三自由度模型与坐标系建立六足机器人的每条腿通常由基节coxa、股节femur、胫节tibia三节组成对应三个舵机。常见的腿部配置是“基节水平旋转 股节前后抬升 胫节上下伸缩”三个旋转轴互相垂直。在开始写代码前一定要先把单腿的几何模型画出来否则后面逆运动学公式根本没法验证。我推荐的坐标系定义是以机器人身体中心为原点X轴指向机器人前进方向Y轴指向左侧Z轴竖直向上。每条腿的髋关节位置在机体坐标系中是固定的称为hip_offset。腿部落地点的坐标是相对于机体坐标系的逆运动学的任务就是给定足端目标坐标(x, y, z)求出三个关节角(alpha, beta, gamma)。这里有一个常见误区很多人把坐标系随手一放结果一条腿的转动方向和其他腿相反导致所有偏移量都要手工取负调试起来极其痛苦。建议所有腿使用同一套正方向定义在计算完关节角后根据腿编号统一做符号映射。2.2 逆运动学求解几何法比DH矩阵更适合单片机DH参数法适合写论文里的数学推导部分但落实到STM32裸机代码几何法更直观、计算量更小。设髋关节在水平面上的投影到足端的水平距离为L则基节角alpha atan2(y, x)其中x和y是足端相对髋关节的坐标。股节和胫节角度的计算基于二维平面三角形。股节长度记为femur_len胫节长度记为tibia_len足端在股节转动平面内的投影距离为L sqrt(L^2 - z^2)。根据余弦定理胫节角为gamma acos((femur_len^2 tibia_len^2 - L^2) / (2 * femur_len * tibia_len))股节角为beta atan2(z, L) acos((femur_len^2 L^2 - tibia_len^2) / (2 * femur_len * L))// leg_ik.c #include leg_ik.h #include math.h // 逆运动学计算 // 输入足端在机体坐标系中的目标位置 (x, y, z) // 输出三个关节角弧度分别对应基节、股节、胫节舵机 void leg_ik_calc(float x, float y, float z, float *alpha, float *beta, float *gamma) { float L sqrtf(x * x y * y); // 髋关节到足端的水平距离 float L2 L * L z * z; // 髋关节到足端的空间直线距离平方 // 注意这里的x, y已经减去了hip_offset即相对髋关节的坐标 *alpha atan2f(y, x); // 基节角水平面内绕Z轴旋转 float cos_gamma (FEMUR_LEN * FEMUR_LEN TIBIA_LEN * TIBIA_LEN - L2) / (2.0f * FEMUR_LEN * TIBIA_LEN); // 反余弦值域是0~pi对应肘外翻姿态如果舵机安装方向相反需要取负 *gamma acosf(cos_gamma); float cos_beta (FEMUR_LEN * FEMUR_LEN L2 - TIBIA_LEN * TIBIA_LEN) / (2.0f * FEMUR_LEN * sqrtf(L2)); *beta atan2f(z, sqrtf(L2)) - acosf(cos_beta); }核心逻辑在leg_ik_calc函数中先算出髋关节到足端的水平投影距离再用余弦定理求出胫节角最后通过几何叠加求出股节角。几个参数需要特别留意FEMUR_LEN和TIBIA_LEN必须和你的机械结构实际尺寸一致差一毫米都会让腿部末端轨迹歪掉acosf的入参必须夹紧在[-1, 1]否则会返回NaN导致舵机突然甩到极限位置。2.3 姿态补偿身体倾斜时保持足端稳定的修正算法静态站立时如果地面不平或者动态行走时身体发生俯仰横滚单纯给腿部下发固定坐标会导致机器人摔倒。常见做法是引入一个body_roll和body_pitch角度把目标足端坐标先做一次旋转变换再输入逆运动学。// 姿态补偿将足端目标点从机体理想坐标系变换到实际倾斜坐标系 void body_compensate(float *x, float *y, float *z, float roll, float pitch) { float cosr cosf(roll), sinr sinf(roll); float cosp cosf(pitch), sinp sinf(pitch); // 先绕X轴旋转横滚再绕Y轴旋转俯仰 float y1 *y * cosr - *z * sinr; float z1 *y * sinr *z * cosr; float x2 *x * cosp z1 * sinp; float z2 -(*x) * sinp z1 * cosp; *x x2; *y y1; *z z2; }这段代码把机体坐标系的足端目标点变换到实际姿态下的坐标。焊接MPU6050时需要注意安装方向DMP输出的欧拉角正方向和你的机器人坐标系不一定对齐通常需要在初始化时做一次静态标定记录零偏值。3. STM32底层驱动18路PWM舵机控制与硬件资源规划3.1 舵机选型与供电设计走线比代码更容易让机器人趴窝六足机器人最常见的舵机是MG996R堵转电流能到2A以上18个舵机同时动作时峰值电流非常恐怖。稳压模块必须有足够余量否则电压跌落会让单片机和舵机互相干扰表现就是机器人动几下就重启。我给毕设项目推荐“2S锂电池 5V/10A降压模块为舵机供电 板载LDO为STM32供电”的方案模拟地和数字地单点连接舵机电源线尽量用粗硅胶线。舵机PWM控制信号需要18路但STM32F103只有4个通用定时器每个定时器只有4个通道刚好是16路。剩余两路可以复用高级定时器TIM1的通道或者干脆用软件模拟PWM。常见的分配方案是TIM2、TIM3、TIM4各自负责一条侧链的6个通道TIM1负责剩余通道。3.2 定时器输出比较配置PWM频率50Hz对应0.5ms~2.5ms脉宽舵机控制信号的周期固定为20ms即50Hz频率脉宽范围通常为500us到2500us对应0到180度。在STM32上推荐把定时器时钟分频到1MHz这样计数器的每个单位就是1us直接往比较寄存器里写脉宽值即可。// pwm_servo.c // 以TIM2为例CH1~CH4对应四条腿的基节舵机 void servo_pwm_init(TIM_HandleTypeDef *htim) { TIM_OC_InitTypeDef sConfigOC {0}; sConfigOC.OCMode TIM_OCMODE_PWM1; // PWM模式1CNT CCR时输出有效电平 sConfigOC.Pulse 1500; // 初始脉宽1500us舵机中位 sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(htim, sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_ConfigChannel(htim, sConfigOC, TIM_CHANNEL_2); HAL_TIM_PWM_ConfigChannel(htim, sConfigOC, TIM_CHANNEL_3); HAL_TIM_PWM_ConfigChannel(htim, sConfigOC, TIM_CHANNEL_4); HAL_TIM_PWM_Start(htim, TIM_CHANNEL_1); HAL_TIM_PWM_Start(htim, TIM_CHANNEL_2); HAL_TIM_PWM_Start(htim, TIM_CHANNEL_3); HAL_TIM_PWM_Start(htim, TIM_CHANNEL_4); } // 设置舵机角度角度范围-90~90度映射到500~2500us脉宽 void servo_set_angle(TIM_HandleTypeDef *htim, uint32_t channel, float angle_deg) { uint16_t pulse (uint16_t)(1500 angle_deg * 1000.0f / 90.0f); __HAL_TIM_SET_COMPARE(htim, channel, pulse); }这段代码的关键参数是Pulse 1500对应舵机中位角。angle_deg到脉宽的线性映射公式1500 angle_deg * 11.11决定了舵机的实际动作范围如果你的舵机是180度型号但机械限位只有120度就必须缩小映射系数防止舵机堵转烧毁。另外__HAL_TIM_SET_COMPARE是宏操作执行速度极快适合在中断里逐腿刷新。3.3 舵机平滑运动突变脉宽会让机身抖动甚至损坏舵机齿轮直接给舵机下发目标角度舵机会以最大速度猛甩过去机身猛烈抖动。解决方法是维护一个“当前角度”数组每次控制循环只让实际角度向目标角度逼近一个小步长。步长上限取决于控制频率和舵机速度上限一般控制在每周期2度到5度。void servo_smooth_update(float target_angles[18], float current_angles[18], uint8_t leg_index) { float step 3.0f; // 每20ms最多转3度对应约150度/秒的角速度 for (int i 0; i 3; i) { float diff target_angles[leg_index * 3 i] - current_angles[leg_index * 3 i]; if (diff step) diff step; if (diff -step) diff -step; current_angles[leg_index * 3 i] diff; } }这里每20ms执行一次更新配合50Hz的PWM刷新频率运动效果已经相当平滑。要注意的是step值不是越大越好步长过大会失去平滑意义过小则响应迟钝机器人跟不上步态切换节奏。4. 步态规划与控制循环三角步态、波动步态和状态机实现4.1 三角步态原理六足为什么是“三脚架”交替落地六足机器人的经典步态是三角步态6条腿分成两组每组各3条交替抬腿迈步。这3条腿必须形成稳定的支撑三角形——通常取“右前、左中、右后”和“左前、右中、左后”。静止站立时6腿着地行走时一组抬起向前摆动另一组保持触地支撑身体前进。这里要理解一个核心差异支撑腿和摆动腿的运动方式完全不同。支撑腿的足端相对地面不动身体向前移动所以在机体坐标系中支撑腿的足端坐标要向后移动摆动腿则从当前落点抬起到空中向前摆动后落下。4.2 控制循环实现关节角增量插值算法驱动整机运动步态切换本质上是一个周期性任务。常见的实现是在定时器中断里维护一个步态相位变量phase取值0到1表示当前步态周期的进度。根据phase判断每条腿的状态计算足端目标位置再用逆运动学求出关节角喂给舵机平滑函数。// gait.c #define GAIT_PERIOD_MS 500 // 步态周期500ms可调 #define START_LEGS_GROUP {0, 3, 4} // 第一组腿编号其余自动取反 void gait_phase_update(uint32_t tick_ms, gait_ctx_t *gait) { gait-phase (float)(tick_ms % GAIT_PERIOD_MS) / GAIT_PERIOD_MS; } void gait_calculate_foot_positions(gait_ctx_t *gait, foot_pos_t *feet) { float swing_phase 0.0f; // 支撑相和摆动相各占一半周期 for (int i 0; i 6; i) { int is_swing is_leg_in_group_a(i) ? (gait-phase 0.5f) : (gait-phase 0.5f); if (is_swing) { // 摆动腿抬起高度随相位做正弦变化平滑起落 swing_phase gait-phase 0.5f ? gait-phase * 2.0f : (gait-phase - 0.5f) * 2.0f; float lift sinf(swing_phase * PI); // 0→1→0 的抬腿高度曲线 feet[i].z BODY_HEIGHT SWING_LIFT * lift; feet[i].x feet[i].home_x STEP_LENGTH * swing_phase; } else { // 支撑腿相对身体向后移动 swing_phase gait-phase 0.5f ? gait-phase * 2.0f : (gait-phase - 0.5f) * 2.0f; feet[i].z BODY_HEIGHT; feet[i].x feet[i].home_x - STEP_LENGTH * (1.0f - swing_phase); } } }这段代码的核心是is_swing的相位划分逻辑第一组腿在相位前半个周期摆动后半个周期支撑第二组腿正好相反。sinf(swing_phase * PI)生成一条平滑的抬腿曲线让脚底离地高度从零缓慢升起再缓慢落地避免砸地。STEP_LENGTH直接决定行进速度但过大会导致腿部机构超出逆运动学可解范围。4.3 转向与侧移足端轨迹叠加旋转偏移量原地转弯的实现方式是在所有支撑腿的足端坐标上叠加一个切向偏移摆动腿则沿圆弧轨迹摆动。假设目标转向角速度为omega则每条腿的足端目标点在机体坐标系中绕Z轴旋转一个小角度theta omega * delta_t旋转矩阵作用于原落点。转向时三角步态的相位划分可以保持不变只需在gait_calculate_foot_positions函数内部把生成的目标点绕机体中心旋转一个角度增量。这里要注意左右两侧腿的旋转方向相反否则机器人会原地画圈而不是绕中心旋转。5. 联合调试验证让毕业设计在答辩现场稳定运行的确定性方法答辩演示时最怕的就是舵机过热抖动、机身缓慢漂移、或者偶发的不复位。这些问题在开发板上调试时很难复现但在演示现场一定会出现。我建议把联调分成三个独立阶段先单腿调试、再整机静态站立、最后才跑步态。单腿调试时用一个脚本控制单腿关节角按正弦规律运动观察是否与预期轨迹一致整机静态站立时要检查6条腿的舵机中位是否对齐如果没有对齐机器人会站不直而站不直会让步态算法输出的坐标全部偏移最终表现为行走偏向一侧。还有一个非常影响演示效果的是开机复位流程。给机器人上电瞬间所有舵机都会收到当前输出比较寄存器里的值如果初始化代码把脉宽设为1500舵机瞬间打到中位冲击力可能让机器人跳一下。更安全的做法是上电后先将PWM输出引脚设为高阻态延时500ms后再启动定时器输出。关于答辩准备建议在论文里把逆运动学公式推导、步态相位表、机械结构强度校核这三部分做厚评委最常追问的焦点是“为什么选择三角步态而不是波动步态”“逆解结果如何验证”“舵机扭矩选型依据”。验证方法很简单在控制代码中增加一个串口调试命令输入足端坐标打印计算出的关节角再用角度尺手动测量舵机实际角度进行比对误差控制在2度以内即为合格。这样答辩现场即使出现异常也能立刻说出排查思路比任何空泛的“研究意义”都更能撑住场面。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门