尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

轮腿机器人竞赛复盘:平衡控制与PID调试,从省二到国赛仅差一步

轮腿机器人竞赛复盘:平衡控制与PID调试,从省二到国赛仅差一步 这次我们来聊一个很真实的竞赛故事浙江省机器人竞赛轮腿赛项拿了个第四名省二等奖但心里其实特别不甘心。前三是国赛门票第四名只能止步省二差得不多但就差那一步。这篇文章把我们从组队、设计、代码、调试到比赛当天的完整过程复盘一遍重点讲轮腿机器人的系统架构、平衡控制、比赛策略以及第四名背后到底输在哪里。如果你也在做准备参加轮腿类机器人竞赛或者在做两轮自平衡、轮腿平衡这类项目这篇内容可以直接当参考。1. 项目核心能力速览能力项说明竞赛名称浙江省机器人竞赛轮腿类赛项最终成绩省级二等奖第四名机器人类型轮腿式移动平台兼具轮式速度和腿式越障能力核心控制目标动态平衡、姿态稳定、任务点到达、搬运/避障等赛题动作典型硬件架构主控 MCU IMU 惯性测量单元 轮腿关节电机 编码器 电源管理核心算法姿态解算、平衡 PID 控制、运动规划、任务状态机适用读者准备打轮腿赛项的队伍、做自平衡机器人开发的同学调试重点机械重心、控制周期、PID 参数、比赛策略稳定性轮腿机器人本质上是在两轮自平衡底盘基础上给轮子增加一组腿部/连杆结构或者让轮子与腿式结构配合运动。它的优点是既能像轮式机器人一样在平地上高速移动又能通过腿式结构越过障碍、上下台阶灵活性明显高于普通四轮底盘。缺点是控制难度大平衡系统对机械重心、电机响应、传感器噪声都非常敏感现场环境一变算法可能整体失效。2. 轮腿机器人竞赛方案与总体架构2.1 比赛任务对系统设计的影响从浙江省这类赛项往年的题目设置看轮腿机器人通常需要在限定场地内完成一系列任务包括但不限于按指定路径行走跨越减速带或小型障碍搬运指定物块到目标区域绕开静态障碍物在终点区域准确停车。这类任务的共性要求是机器人必须持续保持平衡同时还要完成速度控制、方向控制、路径跟踪和末端操作复杂度比普通寻线小车高一个量级。2.2 系统层级划分我们把整个机器人分成五个层面层级内容对应模块机械结构层底盘、轮腿结构、负载安装位车架、连杆、轮毂电机、关节电机感知层获取自身姿态和位置信息IMU、编码器、视觉模块视赛项而定控制层平衡控制与运动控制主控 MCU、PID/MPU 控制算法决策层任务状态切换与路径规划状态机、路径规划算法供电与通信层动力供给与调试通信电池、稳压模块、串口/蓝牙/WiFi这个架构里最核心的是控制层。轮腿机器人的平衡控制和普通两轮自平衡车非常像本质是一个倒立摆问题。机器人需要实时读取 IMU 的角速度与加速度解算出当前倾角然后通过控制轮子前后运动来把重心维持在支撑点上方。2.3 控制周期选择平衡控制系统对实时性要求很高。我们最后把控制周期定在 2ms 到 5ms 之间也就是控制频率 200Hz 到 500Hz。硬件上如果使用 STM32F4 或更高性能的主控这个频率是可以稳定跑到的。如果控制周期太长比如 10ms 甚至 20ms系统很容易出现极限环振荡也就是机器人会不断前后摆动很难站稳。如果控制周期太短但 IMU 数据噪声大又会导致控制量抖动电机发热严重。所以实际调试时需要先确认 IMU 数据更新率再决定控制周期。常用做法是IMU 融合频率 500Hz控制频率 200Hz 到 500Hz电机驱动 PWM 频率 10kHz 到 20kHz避免产生可闻噪声。3. 机械结构与硬件选型3.1 轮腿结构选型轮腿结构是这套机器人最核心的机械设计点。我们内部讨论过三种方案方案结构描述优点缺点固定两轮结构经典平衡车结构不带腿部简单、控制难度低越障能力差难完成复杂赛题齿轮连杆轮腿轮子与连杆通过齿轮/同步带协调运动结构紧凑、越障能力中等传动间隙影响控制精度独立关节轮腿每条腿带一个关节电机可主动抬腿灵活性高能上台阶控制复杂机械成本高我们最终用的是中间方案齿轮连杆轮腿结构。它的思路是机器人在平地上保持两轮着地遇到障碍时通过连杆机构把轮子抬起来跨过去。这个方案的优点是既能满足赛题中的越障要求又不会像独立关节那样引入过多自由度控制算法上还能沿用两轮平衡车的模型。这里要特别强调一个经验轮腿结构一定要把重心设计得尽量低并且让重心落在轮轴正上方附近。如果是自研底盘优先把电池放在底盘最底部把主控和控制板放在电池上层不要为了走线方便把重件挂在顶部。3.2 硬件选型参考下面这张表是我们调试过程中逐步确定下来的一套可运行配置供参考。实际选型需要结合赛题、预算和队伍加工能力来定。部件选型建议作用主控STM32F405/F407 或 ESP32跑姿态解算与平衡控制IMUMPU6050 / ICM20602输出加速度和角速度用于姿态解算轮子电机带编码器的直流减速电机或轮毂电机驱动机器人前进、后退和转向关节/腿部电机舵机或带位置反馈的直流电机控制轮腿结构进行越障动作电机驱动双路 H 桥驱动模块或集成驱动板将控制信号转为电机功率输出编码器霍尔编码器 / AB 相增量编码器测量轮速用于速度闭环电源11.1V 3S 锂电池给电机和主控供电稳压5V/3.3V 降压模块给传感器和主控供电选型时有三个容易踩的坑电机响应速度不够。平衡控制要求电机能快速响应控制指令如果电机和驱动器的响应延迟过大机器人会表现为“反应慢半拍”很难稳定站立。编码器分辨率太低。轮速反馈用于速度闭环如果编码器每圈只有几百线低速状态下速度测不准系统容易震荡。IMU 安装位置离重心太远。IMU 如果安装在机械结构顶部振动和形变会直接污染姿态数据平衡控制就无从谈起。3.3 机械装配注意事项装配过程直接影响控制效果这里写几条踩出来的经验左右轮轴要保证同轴轮子不平行会导致机器人一直朝一侧偏。紧固件要加防松措施比赛现场振动很大螺丝松动后参数全变。电池、主控板要做减震固定最好用泡棉胶垫底否则冲击会传导到 IMU。轮腿结构中的齿轮或同步带要预留张紧调节位传动间隙太大会在换向时产生明显的机械回程差。4. 平衡控制算法与代码实现4.1 姿态解算平衡控制的第一步是获取机器人当前的倾斜角度。我们使用 MPU6050 作为惯性传感器通过加速度计和陀螺仪数据融合得到倾角。工程上最常用的方法是互补滤波或卡尔曼滤波。互补滤波实现简单、计算量小非常适合在 MCU 上跑。互补滤波的核心思路是加速度计在长期尺度上准确但短期噪声大陀螺仪积分在短期尺度上准确但长期会漂移。所以让加速度计通过低通滤波器控制长期趋势陀螺仪通过高通滤波器控制短期变化融合得到最终姿态角。// 互补滤波姿态解算示例 #define ALPHA 0.98f float angle 0.0f; float gyro_y 0.0f; float acc_angle 0.0f; void ComplementaryFilter_Update(float acc_angle, float gyro_rate, float dt) { // 高通陀螺仪积分负责短期动态 // 低通加速度计角度负责长期校准 angle ALPHA * (angle gyro_rate * dt) (1.0f - ALPHA) * acc_angle; }实际调试时ALPHA取值需要根据 IMU 数据噪声和机械振动特性调整。取 0.98 表示更信任陀螺仪动态响应快但角度容易受积分漂移影响如果取 0.92加速度计权重更高角度更稳但会有延迟。我们的经验是先给 0.95 到 0.98然后看站立时角度输出是否安静如果波形抖动明显就降低一点。补充一点MPU6050 在读取原始数据之前必须先做传感器初始化包括设置量程、配置数字低通滤波器、计算陀螺仪零偏。零偏偏大会让平衡控制出现固定方向的偏置力矩机器人会一直往一个方向冲。所以首次上电后要静止采集 200 到 500 组数据求平均作为零偏值写进代码或烧录到 Flash。4.2 平衡控制 PID平衡控制的被控量是机器人倾角。控制器期望倾角为 0也就是机器人保持竖直。通过调节轮子加速度来提供一个水平方向的惯性力把重心“托”回轮轴正上方。最常用的是串级 PID 结构外环是角度环内环是角速度环。外环输出作为内环的期望角速度内环输出作为电机控制量。这种结构比单级 PID 有更好的阻尼特性不容易震荡。// 串级 PID 平衡控制示例代码 float angle_cmd 0.0f; // 期望倾角 float angle_measure 0.0f; // 互补滤波输出 float angle_error 0.0f; float angle_pid_out 0.0f; float gyro_measure 0.0f; // 陀螺仪角速度 float gyro_error 0.0f; float gyro_pid_out 0.0f; float target_speed 0.0f; // 速度控制附加的角度偏移 // 每个控制周期调用一次 void BalanceControl_Update(void) { // 角度环 angle_error angle_cmd - angle_measure; angle_pid_out Kp_angle * angle_error Ki_angle * angle_integral - Kd_angle * gyro_measure; // 内环角速度环 gyro_error angle_pid_out - gyro_measure; gyro_pid_out Kp_gyro * gyro_error; // 叠加速度控制量速度环产生一个角度前馈 float motor_output gyro_pid_out target_speed; // 输出到电机驱动 Motor_SetOutput(motor_output); }这里有个常见误操作很多人会把角度环 Kd 加在角度误差的微分项上。理论上这样可以但工程上用陀螺仪角速度直接做 D 项效果更好因为陀螺仪的角速度数据噪声远小于角度差分得到的角速度控制更平滑。还有一个关键点是限幅。PID 输出必须做积分限幅和总输出限幅否则机器人倒地瞬间积分项会快速饱和重新扶起后机器人会猛冲。// 积分限幅示例 float angle_integral 0.0f; #define ANGLE_INTEGRAL_MAX 50.0f #define ANGLE_INTEGRAL_MIN -50.0f angle_integral angle_error * dt; if (angle_integral ANGLE_INTEGRAL_MAX) { angle_integral ANGLE_INTEGRAL_MAX; } if (angle_integral ANGLE_INTEGRAL_MIN) { angle_integral ANGLE_INTEGRAL_MIN; }4.3 运动控制与转向控制轮腿机器人不仅要站稳还要按比赛要求移动。前进和后退通过给平衡控制器一个角度偏移实现想往前走就把期望倾角设置为一个较小的前倾角机器人为了保持姿态会持续向前加速。想停止则需要把期望倾角恢复到 0同时用速度闭环做减速。转向控制我们采用差速方式左右轮给不同的速度偏置。由于轮腿结构的腿部动作会影响转向半径比赛时我们优先保证转向速度稳定而不是追求极端的小半径转弯。// 差速转向控制示例 void MotionControl_Update(float target_forward_speed, float target_turn_speed) { // 速度闭环为角度环提供期望倾角 speed_ctrl_output SpeedPID_Update(target_forward_speed, current_speed); // 根据转向量计算左右轮差速 float left_motor speed_ctrl_output - target_turn_speed; float right_motor speed_ctrl_output target_turn_speed; // 送入电机 Motor_SetLeft(left_motor); Motor_SetRight(right_motor); }4.4 任务状态机框架比赛过程中机器人需要在不同任务之间切换待机、启动、直线运动、越障、搬运、停止。我们用一个状态机管理整个流程避免在代码里堆大量 if 语句。// 任务状态机简化示例 typedef enum { STATE_IDLE 0, STATE_START, STATE_FORWARD, STATE_OBSTACLE, STATE_CARRY, STATE_STOP, STATE_FAIL } RobotState; RobotState current_state STATE_IDLE; void TaskStateMachine_Update(void) { switch (current_state) { case STATE_IDLE: if (start_signal_received) { current_state STATE_START; } break; case STATE_START: if (balance_ready) { current_state STATE_FORWARD; } break; case STATE_FORWARD: if (obstacle_detected) { current_state STATE_OBSTACLE; } else if (waypoint_reached) { current_state STATE_CARRY; } break; case STATE_OBSTACLE: if (obstacle_cleared) { current_state STATE_FORWARD; } break; case STATE_CARRY: if (finish_reached) { current_state STATE_STOP; } break; case STATE_STOP: // 保持静止 break; case STATE_FAIL: default: // 报错处理 break; } }5. 比赛流程与策略复盘5.1 赛前准备赛前一周我们基本每天都泡在实验室里跑完整流程。这里最耗时间的不是单点控制而是“把每个环节串起来之后还能保持稳定”。我们给自己定了一个原则每一轮完整跑通之后不管成绩如何都记录下一组机器人的状态数据包括电池电压、控制参数、任务完成时间、是否出现跌倒、跌倒发生在哪个环节。这个数据记录习惯在比赛当天起了很大作用。因为现场环境、地面材质、光照条件和实验室不同很多参数需要临时调整有历史数据做参考就不至于盲调。5.2 预赛表现预赛我们抽到的场地地面是光滑板材摩擦力比实验室的橡胶地面低很多。机器人第一次上场比赛时起步阶段出现了轻微的前后振荡明显是抓地力下降后速度闭环参数偏大。当时没有慌因为我们已经提前准备了“参数快调包”把角度环 P、D 和速度环 P 的档位分成三档通过遥控器按键快速切换。预赛第一轮结束后我们立刻切换到低摩擦档位第二轮的成绩明显回升以队伍排名前列进入决赛。这里分享一个经验比赛场地摩擦力和实验室差异很大赛前一定要做“低摩擦、中等摩擦、高摩擦”三组参数预设并且能在 30 秒内完成切换。不要到现场才去重新调 PID时间根本不够。5.3 决赛过程决赛环节加入了障碍物和搬运任务。我们的策略是前半段用高速通过直线路段在障碍物前提前减速完成越障动作后重新加速搬运环节保持低速高稳定性优先确保物块不掉落。从录像复盘来看我们的失误出现在两个地方第一搬运物块后重心发生变化机器人姿态出现偏移。我们赛前只做了空载状态下的完整调试负载状态的测试次数偏少导致搬运后的速度闭环参数不够理想。第二在最后一个转弯处机器人速度偏快转向时轮腿结构出现一次明显的侧倾。虽然没有完全跌倒但修正姿态消耗了大概两秒时间。最后总成绩排在第四名和第三名只差了不到一秒。5.4 名次和成绩的分析从客观数据来看第四名和第三名的差距主要在线路规划和稳定性而不是硬件极限。我们通过录像回放对比发现第三名队伍在搬运任务前没有完全停下来而是采用了一种“低速通过 机械臂顺势抓取”的策略节省了大量启停时间。我们的策略偏保守每个任务点之间都做了明确减速-停止-再启动的动作稳定性更高但时间开销大。在竞赛里“稳定完成所有任务”和“尽量快完成所有任务”之间需要权衡。我们选择了偏稳定结果输在时间上而有的队伍为了速度频繁跌倒成绩更差。最终这个第四名说明策略没有优化到最优解。6. 止步省二的技术因素分析6.1 负载适应性不足轮腿机器人的平衡控制模型依赖重心位置和转动惯量。搬运物块会明显改变重心高度如果控制算法不对这些变化做补偿机器人就会表现为起步猛、刹车点头、转弯侧倾。我们的代码里没有加负载自适应补偿。当时只做了空载调试负载测试不够这是一个直接原因。一个更稳妥的做法是在搬运任务中把期望倾角整体降低也就是让机器人保持略微后倾的姿态同时降低速度环上限用更保守的姿态参数换取稳定性。// 负载状态切换时降低速度上限示例 #define LOAD_MODE_MAX_SPEED 0.5f #define EMPTY_MODE_MAX_SPEED 1.0f void TaskMode_Switch(int is_loaded) { if (is_loaded) { speed_limit LOAD_MODE_MAX_SPEED; angle_cmd -2.0f; // 轻微后倾补偿负载重心前移 } else { speed_limit EMPTY_MODE_MAX_SPEED; angle_cmd 0.0f; } }6.2 转向动态不稳定我们的转向控制使用的是简单差速方式。正常行走时转向没问题但搬运负载后在转弯时出现了侧倾。原因是轮腿结构在转向时会产生额外的横向力矩而这个力矩在模型中没被显式补偿。改进方向是加入转向速度与前进速度的耦合限制前进速度越快允许的最大转向速度越小。这个思想类似阿克曼底盘的“转向稳定性边界”。6.3 任务间切换浪费了时间这也是我们和第三名差距最大的地方。我们的状态机在到达任务点后会先切到完全停止状态再启动下一个动作。这个流程稳定但笨重。如果能让机器人从“前进状态”平滑过渡到“低速搬运状态”而不需要完全停止至少能省下每个任务点约 0.5 到 1 秒。6.4 缺少备用方案比赛当天只带了一套完整机械结构和一套主控备件。决赛前一次测试中机器人摔倒后轮腿齿轮出现了轻微滑齿导致传动间隙变大平衡控制出现周期性抖动。虽然临时靠参数调整稳住了但控制性能已经受到机械损伤影响。如果当时带了一套完整的备用轮腿模块或者赛前对齿轮做了更严格的紧固处理决赛成绩可能还有提升空间。7. 轮腿机器人调试方法调试轮腿机器人比普通四轮底盘复杂很多下面是我们实践下来最有效的一套调试流程。7.1 先稳后走分阶段调试阶段目标验证方法第一阶段姿态解算准确手持机器人旋转确认上位机角度跟随正确第二阶段电机响应正常输出固定占空比观察轮子转速和方向第三阶段原地平衡扶住机器人用手轻推看能否恢复竖直第四阶段前进后退给定期望倾角偏移观察是否按预期移动第五阶段转向控制左右轮差速检验转弯半径和直线保持第六阶段越障动作低速通过障碍观察姿态恢复情况第七阶段完整流程按比赛流程连续跑多轮并记录数据一定不要跳过前三个阶段直接做完整流程。轮腿机器人的控制系统环环相扣底层没调稳上层跑得越快摔得越狠。7.2 数据记录与波形分析调试时建议把关键数据串口输出到 PC 端绘制波形包括角度环输入输出角速度反馈电机 PWM 输出速度环输出状态机当前状态。串口波特率 115200输出频率控制在 50Hz 到 100Hz 即可不需要太高。波形观察能快速判断系统是欠阻尼还是过阻尼。如果角度波形出现等幅振荡说明 P 项过大或 D 项不足 如果角度波形缓慢漂移说明角速度零偏没有校准或重力补偿不够 如果 PWM 输出饱和频繁说明系统受力不足或期望倾角过大。7.3 PID 参数整定经验建议先用试凑法不要一上来就搞自动整定。因为我们实际测试中自动整定参数在实验室好用上了比赛地面就失效原因在于自动整定没有覆盖到低摩擦工况。经验流程是先把角度环 P 设为 0D 设为 0逐步增大 P 直到机器人出现小幅高频振动然后增大 D 消除高频振动让机器人能静置 1 秒以上每次增加 20% 的 P再匹配 D重复操作角度环稳定后加入速度环速度环 P 从小到大调整最后加整定一个“低摩擦档位”降低速度环响应。每调完一步都要让机器人实际跑一段距离不要只做原地测试。因为原地站立稳定不代表移动过程中稳定。7.4 仿真先行如果队伍有仿真条件建议在 MATLAB Simulink 或 Webots 里搭建一个简化的倒立摆模型先在仿真环境里把控制系数范围摸清再上真机。仿真不能完全替代实车标定但能显著减少盲目试错。8. 常见问题与排查方法问题现象可能原因排查方式解决方案机器人上电后无法站立IMU 角度方向错误查看上位机角度波形向前倾斜时角度是否为预期方向修正 IMU 方向或调整角度正负号站立时持续前后振荡PID 的 D 项过小或天平惯量影响观察角度波形周期和幅值增大 D降低 P或减小控制周期起步猛冲或刹车点头速度环 P 过大检查速度环输出是否频繁饱和减小速度环 P增加加速度限制直线行走偏航左右轮编码器计数不一致或轮径差打印左右轮速度对比设定值做轮径校准给左右轮加偏置搬运负载后明显不稳负载改变了重心位置对比空载与负载状态的角度波形切换负载模式参数降低速度转向时侧倾转向速度与前进速度耦合不足录制转向过程视频逐帧分析限制转向速度上限降低临界速度比赛现场表现不如实验室地面摩擦系数、光线差异赛前用不同地面测试准备多套参数档位现场快速切换齿轮滑齿或传动间隙变大紧固不足或过载检查传动部分使用防松胶、加大紧固力矩备好备用件9. 改进方向与后续规划9.1 机械改进下一步最想改的是把轮腿关节从齿轮连杆换成带独立位置反馈的关节电机。这样能在不改变底盘宽度的前提下实现更灵活的越障动作比如主动抬腿、跨越更高障碍。但代价是控制维度增加需要引入动力学模型或者更鲁棒的姿态控制器。同时整个结构还需要做轻量化。我们目前的机械结构偏重电机负载率偏高尤其在比赛后半段电池电压下降时电机输出能力减弱平衡控制的余量变小。如果能把整机重量降低 15% 到 20%控制压力会小很多。9.2 控制算法改进从控制算法上我们计划在下一版引入 LQR 线性二次型调节器替代部分 PID 环节。LQR 能对状态变量进行最优加权在系统建模较好的情况下控制效果和鲁棒性会优于手工整定的 PID。同时加入负载观测器实时估计重心位置变化补偿负载带来的姿态偏移。还有一点是对摩擦力和地面反力的估计。目前控制模型假定理想地面实际上地面摩擦系数变化对平衡控制影响很大。后续计划引入简单的扰动观测器把摩擦力、外部冲击等都当作系统扰动进行前馈补偿。9.3 竞赛策略改进策略层面下次比赛会采用“分段速度规划”替代当前“等速启停”模式直线段用高速巡航接近障碍物前 1 米开始分段减速越障完成后加速到中速不等速度完全为 0 就进入下一任务段搬运段采用低速但全程不停车策略。这套策略更接近第三名队伍的竞速思路但需要配合更成熟的负载控制和转向稳定性方案。9.4 更多精力放在系统可靠性上最后一点也是最重要的教训竞赛成绩的差距往往不在单点技术的极限性能而在整个系统是否能在陌生环境里稳定复现。下次会把赛前测试计划做得更充分至少完成 50 轮完整流程模拟覆盖电池低电量、地面打滑、光照变化、不同负载等情况。只有经过足够多轮的重复验证才敢在比赛现场尝试更有攻击性的策略。第四名的成绩确实遗憾但复盘下来每一个扣分点都有明确的技术原因和改进方向。轮腿机器人是一个机械、控制、策略紧密结合的项目任何一个环节的短板都会在比赛中放大。希望这篇复盘能给准备打轮腿赛项的队伍一些参考也欢迎在评论区交流你们的轮腿调参经验。
返回列表