基于STM32的六足机器人毕业设计实现:三角步态与舵机控制

发布时间:2026/9/16 15:43:29
基于STM32的六足机器人毕业设计实现:三角步态与舵机控制
简介这套毕业设计资料包围绕“基于STM32的六足机器人”展开适用于高校电子、嵌入式及自动化相关专业学生完成毕设或课程设计。资源整合了嵌入式编程、机械结构设计、控制系统理论与答辩汇报等完整环节既能作为实战项目参考也可为论文撰写和PPT制作提供模板。包内共859个文件主要包含STM32固件工程源码c/h/o等、硬件设计文档PCB/SCH、编译链接文件、论文与答辩PPTdoc/pdf/pptx以及Hex固件和APK上位机等压缩包大小约为80.18MB。目前已有298人学习下载资源目录经过归类便于按源码、硬件、论文等模块快速定位。通过这套资料读者可以系统理解六足机器人的运动学与控制策略学习PID、状态机等算法落地方式并掌握从STM32外设驱动到整机联调的完整开发流程非常适合作为毕业设计选题和技术进阶的参考。1. 从零开始搭建基于STM32的六足机器人毕设资源包六足机器人和双足机器人最大的区别在“静态平衡”和“动态平衡”的取舍双足要依赖IMU和重心预判维持姿态而六足只需要保证三条腿着地就能站住。这款基于STM32的六足机器人毕业设计资源包走的是三角步态tripod gait这条最经典的路线避开了倒立摆平衡算法又把运动学、舵机控制和无线通信完整串成一条链路。包里除完整Keil工程源代码和安卓遥控APP的APK安装包之外还附带了答辩PPT和论文文档适合电子信息、自动化、机械电子方向的本科毕设直接参考也适合想快速入门多足机器人的工程师做二次开发。整体来看这套源码对应的不是玩具级遥控车而是一个能把“步态规划—串口协议—移动端控制”闭环跑完的成型工程下载后按本文思路逐模块过一遍比对着论文空读效率高得多。2. 基于STM32的六足机器人硬件架构与舵机PWM控制2.1 六足机器人整机构型与硬件资源分配六足机器人通常复用昆虫的腿部构型机身两侧各三条腿每条腿从根部到足端分三节分别对应髋关节、膝关节和踝关节三个自由度。全机18个舵机对本科毕设来说偏重很多工程实现只保留髋关节和膝关节两个主动自由度踝关节靠舵机扭力自然下垂12路PWM就能完成基本三角步态。本文按STM32F103C8T6展开说明引脚够用、开发板资料多烧录器用ST-Link V2即可不用上F407这种高性能片子。硬件资源分配上至少需要两路UART一路接ESP8266做无线遥控另一路接板载串口打印调试日志。PWM输出走定时器通道不要用软件延时去模拟舵机信号否则主循环一被无线中断打断舵机就会抽动。下面是我常用的一套引脚分配功能外设/引脚说明左腿髋关节 PWMTIM2_CH1~CH3驱动左侧3个髋关节舵机右腿髋关节 PWMTIM3_CH1~CH3驱动右侧3个髋关节舵机膝关节 PWMTIM4_CH1~CH3额外3路膝关节舵机ESP8266 串口USART2_TX/PA2、RX/PA3WiFi模块通信调试串口USART1_TX/PA9、RX/PA10打印日志程序烧录SWDIO/PA13、SWCLK/PA14ST-Link 下载如果要做满18路舵机推荐用I2C接口挂PCA9685舵机驱动板一个模块输出16路加一路I2C扩展即可覆盖全机。这种做法的好处是定时器只负责I2C总线通信舵机供电和信号走线更清晰。舵机额定电压大多是6VSTM32板载3.3V必须做两级电源6V/3A以上的稳压模块给舵机群独立供电再经过AMS1117-3.3给MCU和ESP8266供电两级电源之间共地但主回路分开。2.2 舵机角度到PWM脉宽的换算与代码实现舵机控制的基础参数是20ms周期、0.5ms到2.5ms的高电平脉宽对应0到180度。使用STM32 HAL库的定时器PWM模式输出关键是把计数频率算准STM32F103主频72MHz预分频器设为72计数频率就是1MHz自动重装寄存器设为20000溢出周期正好20ms。此时1个计数单位等于1微秒舵机角度可以直接按脉宽微秒数写入比较寄存器。// servo_pwm.c #include stm32f1xx_hal.h TIM_HandleTypeDef htim2; #define SERVO_MIN_PULSE_US 500 // 0度对应的脉宽 #define SERVO_MAX_PULSE_US 2500 // 180度对应的脉宽 #define PWM_PERIOD_US 20000 // 20ms周期50Hz void Servo_SetAngle(TIM_HandleTypeDef *htim, uint32_t channel, float angle) { uint32_t us; // 高电平时间单位微秒 if (angle 0.0f) angle 0.0f; if (angle 180.0f) angle 180.0f; // 角度在0~180之间线性映射到脉宽 us SERVO_MIN_PULSE_US (uint32_t)((SERVO_MAX_PULSE_US - SERVO_MIN_PULSE_US) * angle / 180.0f); __HAL_TIM_SET_COMPARE(htim, channel, us); } void MX_TIM2_Init(void) { TIM_OC_InitTypeDef sConfigOC {0}; __HAL_RCC_TIM2_CLK_ENABLE(); htim2.Instance TIM2; htim2.Init.Prescaler 72 - 1; // 72MHz / 72 1MHz htim2.Init.CounterMode TIM_COUNTERMODE_UP; htim2.Init.Period PWM_PERIOD_US - 1; // 20000 - 1 htim2.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(htim2); sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 1000; // 初始脉宽1ms sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; HAL_TIM_PWM_ConfigChannel(htim2, sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_ConfigChannel(htim2, sConfigOC, TIM_CHANNEL_2); HAL_TIM_PWM_ConfigChannel(htim2, sConfigOC, TIM_CHANNEL_3); HAL_TIM_PWM_ConfigChannel(htim2, sConfigOC, TIM_CHANNEL_4); HAL_TIM_PWM_Start(htim2, TIM_CHANNEL_1); }这段代码里Prescaler 72 - 1把72MHz分频到1MHz计数频率Period 19999让计数器从0计到19999后溢出一个周期刚好20ms。__HAL_TIM_SET_COMPARE写入比较值当计数器小于比较值时输出高电平所以写入多少微秒高电平就持续多少微秒。主循环里维护一组全局角度数组每次更新只调用Servo_SetAngle不需要反复重新配置定时器。如果舵机在某个中间角度明显抖动先检查两件事一是这个舵机所在通道的比较寄存器是否被其他代码覆盖二是舵机供电线是否和信号线形成了地环路供电线要尽量短且粗。2.3 机械零位校准与姿态归零第一次上电不要急着写大步态先做一次姿态归零把所有舵机设到90度测量每条腿三节之间的实际角度差把偏差记录到零位修正表。市面上常见舵机标称中立点在90度但焊接支架时左右腿的机械零位经常差2到5度不修正的话机器人走路会明显偏航。// leg_offset.h typedef struct { int8_t hip_offset; // 髋关节机械零位偏移量单位度 int8_t knee_offset; // 膝关节零位偏移量单位度 } LegOffset; // 六条腿的零位偏差按实际测量填入 const LegOffset leg_offset[6] { { -2, 3 }, { 0, 1 }, { 2, -1 }, { 1, -2 }, { -1, 0 }, { 3, 2 } }; float Leg_ApplyOffset(uint8_t leg_id, float hip_angle, float knee_angle) { // 运动学算出的理论角度叠加机械偏差后输出给舵机 return hip_angle leg_offset[leg_id].hip_offset; }这个修正表的作用很直接运动学给出的是理论关节角实际舵机执行时要在理论值上叠加偏差。装配舵机臂之前先手动转动舵机输出轴确认空行程装配后再次上电前用手拨动每条腿能自由活动才允许送电。舵机在零位被顶死的状态下上电轻则发烫抖动重则烧坏驱动管这个环节是六足机器人调试中返工率最高的地方值得在毕设论文里单独开一小节记录。3. 基于三角步态的六足机器人运动学与STM32代码实现3.1 腿部坐标系与二连杆逆运动学求解六足机器人的运动学不需要像机械臂那样做完整DH建模每条腿在机体侧面单独解算就可以。设髋关节坐标为原点股节长度为L2胫节长度为L3足端相对髋关节的位置为(x, y, z)其中x为前后方向y为左右方向z为垂直高度。先算髋关节到足端的空间距离D再投影到腿部平面就变成标准的二连杆问题余弦定理可直接解出膝关节角度和髋关节俯仰角度。// leg_ik.c #include math.h #define L2 60.0f // 股节长度单位mm #define L3 75.0f // 胫节长度单位mm // 输入足端相对髋关节坐标(x, y, z) // 输出hip_angle为髋关节俯仰角knee_angle为膝关节角单位度 // 返回值0求解成功-1超出工作空间 int Leg_IK(float x, float y, float z, float *hip_angle, float *knee_angle) { float D sqrtf(x*x y*y z*z); // 髋关节到足端的直线距离 float d2 sqrtf(x*x y*y); // 水平投影距离 // 距离超出股节与胫节的和或者小于差无解 if (D L2 L3) return -1; if (D fabsf(L2 - L3)) return -1; // 髋关节偏摆角由水平方向决定 *hip_angle atan2f(y, x) * 180.0f / M_PI; // 余弦定理求胫节角 float cos_k (L2*L2 L3*L3 - D*D) / (2.0f * L2 * L3); float cos_h (L2*L2 D*D - L3*L3) / (2.0f * L2 * D); *knee_angle 180.0f - acosf(cos_k) * 180.0f / M_PI; *hip_angle (atan2f(z, d2) - acosf(cos_h)) * 180.0f / M_PI; return 0; }这个函数的调用逻辑是上层步态模块给出足端目标位置解算出关节角后叠加零位修正表最后写入PWM。注意逆运动学通常有两个分支解一个膝关节向外弯曲一个向内弯曲六足机器人取向外弯曲的分支因为腿部内侧要保留空间给其他腿摆动避免走路时膝关节互相干涉。写毕业论文时把这张腿部坐标系的几何关系图画清楚比堆公式更容易拿分。3.2 三角步态的相位调度三角步态把六条腿分成两组一组三条腿同时抬起向前摆动另一组三条腿着地支撑机体前进半个周期后两组交换。步态相位的分配关系如下表腿编号相位 0 ~ 半个周期相位 半个周期 ~ 1周期L1摆动相支撑相L2支撑相摆动相L3摆动相支撑相R1支撑相摆动相R2摆动相支撑相R3支撑相摆动相每组交替进入摆动相是实现三角步态的最小调度单元。步态周期一般取400到800ms周期越短走得越快但机体会越颠簸。本科毕设取600ms左右比较均衡。相位由定时器中断里的计数节拍推进主循环负责把当前相位映射到各腿的摆动/支撑状态。3.3 STM32上的步态调度代码步态相位推进放到定时中断目标位置计算放主循环两个模块通过共享变量交换数据。下面的实现用相位值0到1来表示一个完整周期的进度组0在相位小于0.5时摆动组1在相位大于等于0.5时摆动。// gait.c #include gait.h #define GAIT_PERIOD_TICKS 30 // 一个步态周期拆成30个节拍 #define SWING_RATIO 0.5f // 摆动相与支撑相各占50% #define STEP_LENGTH 30.0f // 单步水平位移单位mm #define LIFT_HEIGHT 18.0f // 足端抬升高度单位mm static float gait_phase 0.0f; // 当前相位范围0.0 ~ 1.0 // 六条腿的分组0组和1组交替摆动 const uint8_t leg_group[6] {0, 1, 0, 1, 0, 1}; // 每个tick调用一次推进相位并设置各腿目标位置 void Gait_Update(void) { gait_phase 1.0f / GAIT_PERIOD_TICKS; if (gait_phase 1.0f) gait_phase - 1.0f; for (uint8_t i 0; i 6; i) { uint8_t in_swing; // 根据腿组判断当前是否处于摆动相 if (leg_group[i] 0) in_swing (gait_phase SWING_RATIO) ? 1 : 0; else in_swing (gait_phase SWING_RATIO) ? 1 : 0; if (in_swing) { // 摆动相足端相对机体向前移动并抬离地面 Leg_SetTarget(i, 0.0f, -STEP_LENGTH / 2.0f, -LIFT_HEIGHT); } else { // 支撑相足端相对机体向后移动推动机体前移 Leg_SetTarget(i, 0.0f, STEP_LENGTH / 2.0f, 0.0f); } } }这里的物理含义要反复强调摆动相中足端向前移动是相对于机体坐标系而言支撑相中足端向后划通过地面摩擦力反推机体前进。所以机器人前进的真正驱动力来自支撑相的后划动作。Leg_SetTarget内部会调用逆运动学解算出关节角再叠加零位修正并写入PWM。如果足端轨迹只是简单的前后平移行走会显得生硬更细腻的做法是在摆动相中按正弦曲线插值抬升高度让足端走出一条平滑的抛物线float lift sinf(gait_phase * M_PI) * LIFT_HEIGHT; Leg_SetTarget(i, 0.0f, -STEP_LENGTH / 2.0f, -lift);正弦插值的相位起点从0开始前半周期抬升到最高点再回落足端就不会在落地时砸出一个台阶感而是自然地完成“抬起—前摆—落下”的过程。这个细节写成论文里的轨迹规划小节答辩时会被认为是理解到位的表现。3.4 转弯与前进的方向控制接口毕业设计演示场景一般只需要前进、后退、左转、右转和停止。转弯实现不需要额外算法只需要让左右两侧腿在支撑相的推动量不同左转时左侧腿的推进量减为原来的60%右侧保持100%机体会向左偏转。把这套控制量封装成接口上层指令只传速度和转向系数// motion.c void Motion_SetControl(float speed, float turn) { // speed正值前进负值后退 // turn正值左转负值右转 for (uint8_t i 0; i 6; i) { float leg_speed speed; // 左侧腿编号0、1、2右侧3、4、5 if (i 3) leg_speed turn * speed * 0.4f; else leg_speed - turn * speed * 0.4f; Leg_SetTarget(i, leg_speed, 0.0f, 0.0f); } }实际使用时speed和turn由无线指令解析后的数值填入实现逻辑和步态调度解耦。这里注意转向系数不能太大否则左右推动量差值过大会导致侧翻。写论文时把转向控制描述为“差速转向”并对比一下轮式差速和腿足差速的差异这段内容很容易凑成有含金量的文字。4. 基于ESP8266的六足机器人APP远程控制与联调排错4.1 ESP8266透传模式与AT指令配置答辩现场用手机APP遥控六足机器人比拖一根串口线演示靠谱得多。STM32和ESP8266之间走UARTESP8266作为TCP Server手机APP作为客户端连接。初始化指令序列如下AT # 检查模块响应返回OK ATRST # 复位模块 ATCWMODE1 # 设置为Station模式 ATCWJAPGraduation,12345678 # 连接WiFi热点 ATCIPMUX1 # 开启多连接 ATCIPSERVER1,8080 # 启动TCP Server监听8080端口 ATCIFSR # 查询模块IP手机APP连接该IP这个链路里最容易卡住的是ATCWMODE这一步不同固件版本的ESP8266返回值不同需要用ATGMR确认固件版本。现场没有路由器时可以直接用手机开2.4GHz热点ESP8266初代模块不支持5GHz频段这个坑在移动热点场景下必踩。4.2 STM32端UART中断接收与指令解析手机APP发送的指令帧格式定义为“命令字三位数值”比如F100表示以速度档位100前进L050表示左转强度50。命令以换行符结尾STM32端在串口接收中断里逐字节缓存收到换行后整体解析// uart2.c uint8_t rx_buf[32]; uint8_t rx_char; uint16_t rx_cnt 0; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart-Instance USART2) { rx_buf[rx_cnt] rx_char; // 收到换行符或缓冲区满解析一帧指令 if (rx_char \n || rx_cnt 32) { rx_buf[rx_cnt - 1] \0; // 去掉换行符 Command_Parse((char*)rx_buf); rx_cnt 0; } // 重新使能单字节接收中断 HAL_UART_Receive_IT(huart, rx_char, 1); } } void Command_Parse(char *cmd) { uint16_t value (cmd[1]-0)*100 (cmd[2]-0)*10 (cmd[3]-0); if (cmd[0] F) Motion_SetControl( value, 0); // 前进 else if (cmd[0] B) Motion_SetControl(-value, 0); // 后退 else if (cmd[0] L) Motion_SetControl(0, value); // 左转 else if (cmd[0] R) Motion_SetControl(0, -value); // 右转 else if (cmd[0] S) Motion_SetControl(0, 0); // 停止 }这段代码的逻辑很直观UART中断每次只收一个字节缓存到rx_buf遇到\n才开始解析。把协议固定成定长帧的好处是不需要做字符串分割直接按索引取字符并计算数值。串口波特率统一用115200ESP8266出厂默认波特率可能是9600先用ATUART_DEF115200,8,1,0,0固定到115200后再接线联调否则会收到一屏乱码。4.3 安卓APP与Socket通信资源包里编译好的APK可以直接安装测试想改按键布局或命令字的话Android Studio工程里逻辑也很清晰核心代码是Java Socket发送指令// MainActivity.java 片段 Socket socket new Socket(192.168.1.100, 8080); DataOutputStream out new DataOutputStream(socket.getOutputStream()); out.writeBytes(F100\n); // 发送前进指令 out.flush(); socket.close();需要注意几点writeBytes写入的是ASCII码字符串尾部必须带\n与STM32端的换行判定匹配Android主线程不允许直接做网络请求必须放到子线程或AsyncTask里否则会抛出NetworkOnMainThreadException。手机上先安装“网络调试助手”类工具验证机器人IP和端口能连通再打开APP调功能能省掉大量排查时间。4.4 Keil烧录与联调阶段的常见问题先看Keil MDK工程打开就报错的情况。最常见的原因是STM32F1系列Device Pack版本和源码工程不匹配Keil 5兼容C51和STM32时需要注意Pack Installer里要彻底卸载旧版本再安装统一版本不要保留多个Device Family Pack混装。再看ST-Link烧录失败。PC识别不到调试器时先打开设备管理器确认驱动识别到但连不上目标芯片时检查SWD四根线是否接反特别是SWDIO和SWCLK交叉的情况经常发生。如果Keil报Error: No STM32 target found!先把Frequent ST-Link配置里的连接速率从5MHz降到1MHz重试再检查目标板供电是否正常。工程配置里要勾选Flash Download标签下的“Reset and Run”烧录完成后自动运行程序。接着是调试模式的断点失效。表现为“当前不会命中断点尚未加载该文档的任何符号”这个和Keil优化等级有关把工程设置里C/C一栏的优化等级改为-O0同时取消“One ELF Section per Function”的勾选恢复正常断点。很多人在这个问题上卡一下午其实和硬件无关纯属编译器优化把符号表合并掉了。最后是舵机抖动。排除供电问题后重点关注两处定时器实际输出的PWM周期是否为精确的20ms检查预分频器和自动重装寄存器的配置任何一个参数不对都会导致舵机反复找中点另一处是信号线过长导致沿变缓舵机线超过20cm时建议降低PWM频率或加缓冲驱动。这两个问题在腿足类项目里出现频率极高整理成下表方便快速定位现象优先排查点常见根因全部舵机抖动PWM周期精度定时器预分频或ARR配置错误单个舵机抖动该通道供电与信号线插接不牢或地线压降上电不动作舵机零位顶死装配时关节卡死遥控指令无响应UART波特率ESP8266与STM32速率不一致5. 六足机器人毕业设计论文文档与答辩PPT的整理思路5.1 论文结构如何对应源码模块源码包里的论文文档最好的用法不是整篇照抄而是把其中“系统测试”一章替换成自己实测的数据。论文第三章硬件设计对应引脚分配表、电源树和机械结构图第四章软件设计对应步态状态机、逆运动学求解和串口协议设计第五章测试结果要包含直行偏移量、转弯半径、连续行走时长。答辩老师最看重的验证方式是“重复性”同一段10米直线走三次每次偏离多少厘米都列出来比任何文字都有说服力。5.2 答辩PPT的页面节奏与关键素材PPT控制在20页左右是比较舒服的节奏背景与意义2页总体方案框图2页硬件设计4页软件设计4页系统测试3页总结与展望2页致谢1页。三角步态原理用一页动图或序列照片展示效果最好不要贴整屏代码。硬件部分放实物照片比放原理图更有现场感软件部分放步态流程图和命令协议表。答辩时让机器人实机行走尽量控制在1到2分钟提前让所有舵机上电并确认姿态归零不要在台上现场烧录程序。5.3 答辩前最值得做的一次验证方案最后给一个落地可执行的测试方案把这组数据放进论文测试表和答辩PPT里整个项目的说服力会明显上升在60cm宽、180cm长的测试跑道上分别完成直行、左转、右转、停车四个动作每个动作测10次记录成功率、平均偏移量和单次动作耗时。测试时给机器人正上方放一个手机慢动作拍摄能清楚看到三角步态中间时三条腿着地、三条腿摆动的交替过程。这套数据就是一串最简单的统计数字却能把“能走”和“走得如何”区分开。如果毕设时间只够改一个地方就改这张实测数据表。本文还有配套的精品资源点击获取