资讯动态

电赛轮腿式平衡小车:串级PID与运动学解耦实战

发布时间:2026/10/21 2:10:31 来源:尧图企业网站定制
简介这份资源是面向电子设计竞赛参赛者、自动控制与机器人方向学生的轮腿式自平衡小车完整项目包聚焦动态平衡原理与嵌入式控制实践。压缩包共1311个文件约49.48MB以C源码619个和头文件316个为主体辅以汇编启动文件、链接脚本、CMake构建配置、数学库及少量工程与说明文档覆盖从底层驱动到控制算法的完整代码链路。项目围绕轮式推进与腿部支撑相结合的创新结构展开涉及陀螺仪与加速度计数据采集、传感器融合滤波、PID等平衡控制策略以及电机驱动逻辑并可能包含硬件原理图、PCB布局与元器件清单便于理解电力系统与传感器配置方案。目前已有585人学习下载适合希望深入掌握自平衡控制、嵌入式开发与传感器应用的读者参考复现也可作为电赛备赛与课程设计的实战素材。1. 电赛平衡小车从“能站起来”到“能拿分”的考点拆解电赛控制类题目里轮腿式平衡小车几乎是“年年见”的题型。很多人以为它考的是PID调参玄学其实真正拉开差距的是状态观测、串级控制结构、以及动态解耦这三块硬骨头。这份资源把轮腿式平衡小车的完整工程拆成了可复现的模块从直立环、速度环到转向环的参数整定再到轮腿机构的运动学建模全部有对应的代码和调试记录。如果你正在准备电赛控制题或者想搞懂平衡小车从“能站起来”到“能抗扰”的每一步这份资料能帮你省掉大量翻车重来的时间。它适合已经学过基础PID、但一上实物就发现“理论能跑、实际就倒”的备赛者。2. 考点分布轮腿式平衡小车的三个核心模块2.1 直立环与速度环的串级结构平衡小车的控制骨架是串级PID外环速度、内环角度。很多队伍翻车就翻在把两个环并在一起调结果小车要么低频晃动要么高频抖动。正确的做法是先调内环直立环让车身能在外力轻推后回正且回正过程没有明显超调再串外环速度环用编码器反馈抑制车体缓慢漂移。直立环的输入是角度偏差和角速度输出是PWM占空比。关键参数是角度环的P和D。P决定回正力度D决定阻尼。经验值是先给P让车能站起来但会前后晃再加D把晃动压住。速度环的输入是编码器脉冲差值输出叠加到角度环的目标角度上。这里有个易错点速度环的输出极性必须和直立环一致否则会形成正反馈直接倒地。// 直立环PD 速度环PI 串级输出示例 float angle_pid(float target_angle, float current_angle, float gyro_y) { float error target_angle - current_angle; float p_out ANGLE_KP * error; float d_out ANGLE_KD * gyro_y; // 陀螺仪直接测角速度 return p_out - d_out; // 注意符号角速度方向与偏差方向相反 } float speed_pid(float target_speed, float current_speed) { static float integral 0; float error target_speed - current_speed; integral error * SPEED_KI; integral constrain(integral, -INTEGRAL_LIMIT, INTEGRAL_LIMIT); return SPEED_KP * error integral; } // 最终输出速度环输出改变直立环目标角度 float speed_out speed_pid(0, encoder_speed); float final_pwm angle_pid(speed_out, imu_angle, gyro_y);这段代码里ANGLE_KP和ANGLE_KD是直立环参数SPEED_KP和SPEED_KI是速度环参数。注意gyro_y的符号如果陀螺仪安装方向与车体前倾方向相反这里要取反否则D项会变成正反馈。INTEGRAL_LIMIT是积分限幅防止速度环积分饱和导致车体突然前冲。调试顺序必须是先关掉速度环只调直立环用手轻推车体看它能否在2秒内回正且不振荡再打开速度环从很小的SPEED_KP开始加直到小车能缓慢跟随遥控指令移动。2.2 轮腿机构的运动学解耦轮腿式结构和纯轮式最大的区别在于轮子的转动和腿的摆动会耦合。腿摆动时重心偏移轮子需要额外补偿才能保持平衡。很多队伍直接套用纯轮式平衡车的参数结果发现腿一动就倒。正确的思路是把腿摆角作为前馈量引入直立环目标角度。具体做法根据腿的摆角θ_leg和腿长L计算重心在水平方向的偏移量Δx L * sin(θ_leg)。把这个偏移量乘以一个补偿系数K_ff叠加到直立环的目标角度上。这样腿往前摆时目标角度自动往后偏轮子会提前做出补偿动作。// 轮腿运动学前馈补偿 float leg_angle get_leg_angle(); // 腿摆角单位弧度 float leg_length get_leg_length(); // 当前腿长 float com_offset leg_length * sinf(leg_angle); float feedforward_angle K_FF * com_offset; // 将前馈量叠加到速度环输出上 float target_angle speed_out feedforward_angle; float final_pwm angle_pid(target_angle, imu_angle, gyro_y);K_FF需要实测固定腿摆角逐渐增大K_FF直到小车在腿摆动时车身倾斜最小。这个系数和腿长、重心高度有关换电池或加装传感器后需要重新标定。注意sinf是弧度制如果传感器输出的是角度值要先乘以π/180。2.3 真题演练2023年电赛控制题“轮腿机器人”这道题要求轮腿机器人在行进中保持平衡同时完成指定路径。现场很多队伍卡在“直线走不直”和“转弯时倒地”两个问题上。直线走不直通常是陀螺仪零漂未校准或者左右轮编码器分辨率不一致导致速度环积分不对称。转弯倒地则是转向环和直立环的耦合没处理好。答题思路先做静态校准上电后前3秒不输出PWM采集陀螺仪零漂并取平均后续所有角速度减去这个均值。左右轮编码器要在同一段直线上手动推车对比脉冲数差值超过5%就要在速度环里做比例补偿。转向时把转向环输出限幅到直立环输出的30%以内避免转向过猛破坏平衡。提示电赛现场没有时间让你慢慢调参赛前必须把校准流程写成上电自动执行包括陀螺仪零漂、编码器一致性检查、电池电压补偿。3. 高频考点从传感器融合到电机驱动的答题模板3.1 姿态解算互补滤波还是卡尔曼电赛平衡小车最常用的姿态解算方案是互补滤波因为计算量小、参数直观。陀螺仪积分得到角度但会漂移加速度计测重力方向得到角度但噪声大。互补滤波用高通滤波取陀螺仪的高频分量用低通滤波取加速度计的低频分量加权融合。// 互补滤波姿态解算 float dt 0.005f; // 5ms控制周期 float alpha 0.98f; // 陀螺仪权重 float angle 0; void imu_update(float accel_angle, float gyro_rate) { // 陀螺仪积分预测 float predicted angle gyro_rate * dt; // 加速度计修正 angle alpha * predicted (1 - alpha) * accel_angle; }alpha越大越信任陀螺仪动态响应好但会漂移alpha越小越信任加速度计静态稳但动态滞后。平衡小车通常取0.95到0.99之间。注意accel_angle要用atan2计算且只在车体加速度较小时才可信所以很多方案会在电机加速时降低加速度计权重。面试官最想听的是你为什么选互补滤波而不是卡尔曼答案要落到“控制周期5ms以内卡尔曼的矩阵运算在8位单片机上跑不完互补滤波计算量小且参数物理意义明确”。如果面试官追问卡尔曼你要能说出状态方程和观测方程分别对应陀螺仪和加速度计以及协方差矩阵的物理含义。3.2 电机驱动PWM频率与死区补偿直流有刷电机用H桥驱动时PWM频率选10kHz到20kHz。太低会有可听噪声太高则MOS管开关损耗大。电赛常用TB6612或DRV8833前者支持100kHz但实际用10kHz足够。死区补偿是很多队伍忽略的点H桥上下管切换时需要死区时间防止直通但死区会导致低占空比时电机不转。解决办法是在PWM输出上加一个最小占空比偏置或者用硬件死区时间可调的驱动芯片。// 电机死区补偿 #define DEAD_ZONE 0.05f // 5%占空比以下电机不转 float motor_output(float pwm) { if (pwm 0) { return (pwm DEAD_ZONE) ? DEAD_ZONE : pwm; } else if (pwm 0) { return (pwm -DEAD_ZONE) ? -DEAD_ZONE : pwm; } return 0; }DEAD_ZONE要实测给电机逐渐增大的占空比记录它开始转动的最小值。补偿后速度环在低速时不会因为死区而积分饱和。注意这个补偿只对开环有效如果速度环有积分项积分会自动补偿死区但会带来启动延迟。3.3 真题演练2021年电赛“送药小车”平衡控制部分这道题要求小车在载药后保持平衡并行驶。载药后重心升高直立环的P和D都要重新整定。很多队伍直接沿用空载参数结果小车一放药就倒。答题思路先测空载和满载的重心高度根据重心高度调整直立环参数。重心越高P越小、D越大因为高重心系统更容易振荡。具体操作空载时调好直立环记录P0和D0。满载后把P降到P0的70%D升到D0的1.3倍再微调。同时速度环的积分限幅要减小因为满载时电机加速慢积分容易累积过大导致过冲。现场可以用砝码模拟载重提前标定一组参数。注意电赛现场不允许带砝码但可以用矿泉水瓶装水模拟提前在实验室做好重量-参数对照表。4. 易错点平衡小车调试中最容易翻车的五个地方4.1 陀螺仪零漂未校准就上电错在哪上电后直接进入控制循环陀螺仪零漂导致角度积分持续偏移小车会缓慢向一个方向加速直到倒地。为什么错MEMS陀螺仪零漂随温度变化冷启动和热机后零漂不同不校准等于给直立环加了一个持续偏差。怎么答对上电后前2秒电机不输出采集100次陀螺仪读数取平均作为零漂后续所有角速度减去这个值。如果比赛现场温度变化大每5分钟重新校准一次。4.2 速度环积分限幅过大错在哪速度环积分项没有限幅或限幅过大小车被挡住时积分持续累积一旦障碍移除小车会突然猛冲。为什么错积分项的作用是消除稳态误差但执行器有物理极限积分超过极限后只会造成过冲。怎么答对积分限幅设为电机最大输出对应占空比的20%到30%并且当PWM输出饱和时停止积分累积。4.3 直立环D项直接用角度差分错在哪用角度差分计算D项噪声被放大电机发出高频啸叫。为什么错角度差分等价于对角度的噪声求导噪声频率越高差分值越大。怎么答对直接用陀螺仪输出的角速度作为D项因为陀螺仪测的就是角速度不需要差分。如果陀螺仪噪声大加一级低通滤波截止频率设为50Hz到100Hz。4.4 轮腿前馈系数未随腿长变化错在哪腿长变化时前馈系数不变导致腿伸长时补偿不足、腿缩短时补偿过度。为什么错前馈量Δx L * sin(θ_leg)L变化时Δx成比例变化固定K_FF无法适应。怎么答对把K_FF乘以当前腿长与标定腿长的比值或者直接在线计算Δx而不查表。4.5 转向环与直立环共用PWM输出错在哪转向环输出直接叠加到左右轮PWM上没有限幅转弯时一侧轮子PWM饱和直立环失效。为什么错直立环需要PWM余量来维持平衡转向占用了全部余量车体必然倒。怎么答对转向环输出限幅到直立环输出的20%到30%并且优先保证直立环输出转向只在余量内分配。5. 答题技巧电赛现场如何快速整定参数现场调试时间通常只有4到6小时不可能从零开始调参。我的习惯是提前在实验室做好三组参数空载直立环、满载直立环、速度环基础参数。现场只做微调微调顺序固定为先陀螺仪零漂校准再直立环P和D再速度环P和I最后转向环限幅。具体操作上电后先用手推车体看回正力度。如果回正太慢加P如果回正后振荡加D。直立环调好后给一个很小的速度指令看小车能否缓慢移动。如果不动加速度环P如果移动时前后晃动减速度环P或加直立环D。转向环最后调先给很小的转向指令看车体倾斜程度倾斜大就减转向限幅。提示现场用蓝牙模块实时传回角度、速度、PWM数据用上位机画曲线比盲调快得多。没有蓝牙就用OLED屏显示关键数据至少能看到角度和PWM。押题思路轮腿式平衡小车今年大概率还是考“动态平衡路径跟踪”。动态平衡的考点是变重心补偿路径跟踪的考点是转向环与直立环的解耦。把这两个点吃透题目怎么变都不怕。另外电赛近年喜欢加“无线充电”或“视觉识别”模块平衡控制部分反而简化所以不要把全部时间花在调参上留出时间做任务逻辑。从那以后我每次赛前都会强制走一遍校准流程陀螺仪零漂、编码器一致性、电池电压补偿、死区补偿一个都不跳过。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑