
比赛成绩公布的时候候场区里还有队伍在拧螺丝。轮腿机器人这一赛项的屏幕跳出一个排名第四名。按照评奖比例这个位置对应的是省级二等奖。那一刻旁边的队友没有说话但手机里教练发来的“可惜了”三个字比赛场上的任何声音都更刺耳。两个多月的项目过程其实没有太多空白。从需求拆解、机械装配、电控联调到让轮腿机器人从“只能站在原地发抖”到“能按流程完成一整圈任务”每一步都走了不止一遍。赛前两周我们甚至连续跑出过三轮满场零失误。所以当第四名的数字出现时我脑子里翻来覆去想的不是“准备不充分”而是“过程明明都对了结果却还差一步”。后来把工具收进整理箱坐在实验室里复盘了两天才慢慢想明白一个问题这场比赛的真正胜负手不是“能不能完成”而是“能不能在系统必然波动的条件下依然稳定完成”。第四名和省二之间隔的不是熬夜时长也不是某一个算法的优劣而是对“稳定性”两个字理解深度的差距。这篇博客想写的就是这条复盘链。它更像是一份从第四名倒推出来的竞赛工程笔记为什么轮腿机器人这种赛项会比其他项目更容易出“省二”真正决定名次的系统瓶颈藏在哪里现场调试和赛前准备的优先级应该怎么定以及一次止步省二的经历最后能沉淀成什么。1. 为什么“第四名”和“省二”会同时出现很多第一次参赛的人会先问第四名怎么不是省一这其实和地方赛事的评奖规则有关。在多数省级机器人竞赛里奖项比例会提前划定一等奖只取排名最靠前的若干支队伍二等奖再对应后续排名。第四名按比例落进省二不是说你的项目比第三名差了一个数量级而是比分的分布恰好把你放进了这个区间。规则就是这样你不用把它当成技术结论也用不着为此反复抱怨。比规则更值得聊的是为什么“能完成高难度动作”的队伍常常输给看起来更朴素的队伍。我在候场区观察过不少同场的对手发现队伍大致分成两类。第一类是“稳定流”。机器人外形不花哨结构保守主控和算法也偏常规但每一轮都能按流程跑完成绩集中在很窄的区间里。第二类可以叫“极限流”追求最高速度、最复杂的变腿动作训练视频很有冲击力可一到正式比赛完成率经常只剩一半。轮腿机器人赛项的计分逻辑通常不是“谁快谁赢”而是任务完成度、完成质量、额外用时和罚分综合计算。稳定流的单项极限不一定最高但分数期望很稳极限流一旦中途失误可能直接丢掉整段任务分把之前抢出来的时间优势全部赔回去。所以省赛名次其实诞生在“上限、稳定性和失误代价”三者的交汇处。我们这支队伍当时处在更有意思的位置平时训练用时很稳定看起来属于稳定流但到了比赛现场才发现这种稳定一直被一个隐藏因素支撑着——我们每次练习之后都有充足时间重置系统。现场一旦进入连续两轮、限制重试次数的模式系统的真实稳定边界就暴露出来了。第四名的出现不是某一次“表演”失误而是整个系统在“不允许重试”的约束下稳定边界被精确测了出来。这个解释也让我后来想通一件事为什么省二这个结果会这么扎人。因为系统并不是没能力冲到更前面而是我们从头到尾都没有为“异常分支”“恢复策略”“失控预案”留出足够的设计空间。这些东西不直接占分数也不写进技术报告的功能亮点却恰恰是区分“训练型稳定”和“系统型稳定”的关键。2. 轮腿机器人最容易“翻车”的三个工程层2.1 机械层间隙、重心和看不见的形变轮腿机器人的核心难点在于把足式的关节结构和轮式的高速移动叠在同一个底盘上。它既要靠轮子获得速度和连续运动的效率又要通过腿部关节改变形态、越过障碍、适应坡道。这带来一个直接后果任何一个机械公差都会被动态负载不断放大。第一个常见问题是重心偏高或偏离几何中心。很多队伍习惯把电池、主控板、图传模块全部堆在上层理由是走线方便、调试方便。但轮腿机器人在高速转弯、越障时重心每抬高一点控制系统需要输出的矫正力矩就要明显增大。如果机械结构再夹带一两毫米的不对称控制系统在高动态下就会持续抖振。第二个常见问题是连接件间隙。用 3D 打印外壳和铝合金方管搭建的底盘静态检查时往往看不出问题但电机开始频繁加减速后螺丝松动、轴承游隙增大、联轴器打滑等小缺陷会被连续放大。最麻烦的是这些缺陷不会立刻表现为“机器不能动”而是表现为某一轮成绩莫名多出几秒且很难复现。我后来总结了一个比较实用的验收方法装配完成后先在中等速度下连续跑 10 分钟停机后立刻检查所有紧固件、法兰接头、轮胎和支腿看有没有位移或磨损痕迹。不要只用眼睛看要在螺丝和结构件画标记线第二次启动后对比标记是否错位。这个方法不能保证机械完全没问题但能尽早排除影响最大的那批隐患。2.2 电控层故障往往不在电机而在供电和线束电控层最常见的误区是把注意力放在电机型号、主控芯片、驱动板参数这些“名牌”上却忽略了完整的电流供应链路。轮腿机器人需要同时驱动两个或四个轮电机还要叠加腿部关节舵机或无刷电机的瞬时电流。启动、急停、越障瞬间总电流会冲到很高。如果电源线太细、插头接触电阻偏大或者锂电池电量偏低导致内阻上升母线电压就会瞬间被拉低。轻则主控复位重则姿态数据错乱整车直接失控。线束和运动部件之间的干涉是另一个很难在现场定位的问题。腿部关节不断往复运动线束如果恰好从关节活动半径附近穿过使用几次后外部绝缘皮就可能破损造成信号闪断或短路。这类故障没有稳定报错代码症状通常是“这一轮还好好的下一轮突然乱窜”非常消耗现场判断时间。建议在备赛后期做一张供电检查表电池内阻状态、所有接线端子压接是否牢靠、电机驱动输入电容容量够不够、线径是否覆盖最大电流、每个运动部位线束余量是否充足。比赛日进入检录区之前再用满载状态跑一组急加减速确认母线电压跌落不超过预设阈值。这一套操作听起来繁琐但能排除现场一半以上的“不明原因失控”。2.3 算法层优先级和控制频率比算法名词更重要算法层的选择很多很多队伍会纠结要不要上卡尔曼滤波、要不要用强化学习、要不要加入视觉 SLAM。但真正决定现场能不能稳定跑完的往往是三件更基础的事控制频率够不够、各控制环的优先级对不对、状态机有没有覆盖异常分支。轮腿机器人常用的方案是“直立环—速度环—转向环”的串级 PID。直立环负责维持车身平衡速度环跟踪目标速度转向环负责航向。整套系统对姿态解算频率和控制频率非常敏感。常见工程选择是姿态解算 500Hz 到 1kHz控制环 200Hz 以上。如果主控资源不够可以把视觉、路径规划等上层任务放到独立处理器避免抢占实时控制的中断资源。下面是一段示意性的控制结构不同主控、不同电机驱动方案差异很大不能直接复制主要用于说明调参时应该关注哪几个量// 示意串级 PID 的最小计算框架 // dt 来自高精度定时器或实时系统节拍 float balance_out pid_update(pid_balance, imu_pitch_angle, target_pitch, dt); float speed_out pid_update(pid_speed, current_wheel_speed, target_speed, dt); float steer_out pid_update(pid_steer, current_yaw, target_yaw, dt); float left_motor clamp(balance_out - speed_out steer_out, -limit, limit); float right_motor clamp(balance_out - speed_out - steer_out, -limit, limit);这段代码最核心的地方不是 PID 公式本身而是三个环路输出的“方向符号”和“钳位上限”。方向符号接反车会直接倒钳位上限设置偏高可能出现持续震荡下限设置偏高则容易出现低速抖动。推荐的做法是先单独调试直立环再逐步加入速度环和转向环每加一个环就重新录一轮日志。状态机同样容易被忽视。很多队伍只覆盖了“正常启动—执行任务—正常停止”这一条主路径却没有处理急停后如何恢复、通信中断时轮子该怎么办、姿态超限后要不要进入保护模式。没有异常分支的状态机就像只修了主干道却没有建环岛的路网一遇临时堵车就全盘瘫痪。我建议在比赛前三周把状态机画成一张流程图。把可能的异常事件按“输入类、通信类、姿态类、任务类”分好类并为每个异常设计一个最低限度的兜底动作。“最低限度”不一定是复杂恢复逻辑有时候就是停车、报警、保持姿态、等待裁判重置。能处理异常往往比能跑更快的动作更值钱。3. 现场调试省一和省二之间的分水岭3.1 赛前 24 小时只做减法不做加法赛前 24 小时最正确的操作不是继续验证新点子而是把所有系统状态收敛到已知范围内。这一条我们不是没听过但执行得很差。赛前一个晚上我觉得某个转弯段的转向速度还能再快一点于是单独改了一版转向参数。第二天第一轮确实快了零点几秒表面看收益为正。但第二轮系统在同一个弯道里出现了明显抖动进而影响后续任务完成度丢掉的分远超那零点几秒。这种失误在比赛里非常典型。新参数在实验室跑了十几次也许没有问题但现场的地面摩擦、光照、场地拼接缝隙、电池剩余电量都和实验室不同。参数一旦跨过稳定阈值就很可能以“偶发抖动”的方式暴露出来。在有限次数的上场机会里一次偶发抖动就足以改变整轮成绩。赛前 24 小时最重要的原则是只做减法不做加法。任何新功能、新参数即使在实验室里已经跑通了也不建议在这个阶段上车。所以我的建议是赛前 24 小时只做状态确认不做能力扩展。确认所有备份参数、确认机械标记线、确认备用电池、确认快换件、确认日志文件能正常写入。这些都做完了再考虑要不要把速度提升 1%。3.2 现场排查顺序先硬件再供电再通信最后参数现场最容易出现的操作错误是一遇到问题就打开 PID 面板开始拧参数。这种行为在实验室里很有效因为环境可控在赛场高压环境下却容易把问题带向更远的错误方向。正确的排查顺序应该是先确认机械结构没有脱落、干涉再确认电池电压、指示灯、急停状态接着确认串口、无线通信、遥控器响应是否正常最后才进入控制参数检查。这套顺序的底层逻辑是在物理世界和代码世界的交界处优先排除物理和电气问题因为它们更可能造成“瞬间完全失效”。我见过某支队伍因为一条 USB 转串口线松动在现场反复调了一中午机械结构最后只是把线重新插牢就恢复了。高压状态下人的注意力会下意识集中在那些“看起来高深”的环节上反而忽略了最简单的物理连接。3.3 轮腿机器人现场故障排查链路把上面两个经验合并可以形成一份比较实用的排查链路。当然每套硬件条件不一样字段和阈值需要自己调整。现场现象第一排查层第二排查层兜底操作上电无反应电池、开关、接线主控电源指示灯接可调电源限流测试上电后持续抖振机械连接、轮胎摆动IMU 安装是否松动紧固后重新标定零偏运行中突然断电电池电压、线径驱动模块过流保护降低急停电流并补大电容不能走直线轮子、编码器线速度环参数单轮开环测试确认执行器姿态发散传感器安装方向控制频率、滤波参数回退上一版参数并录日志通信中断天线、信道、线材主控串口配置改用有线调试并确认任务分这里要特别说明表格里的内容不是标准答案而是一个排查起点。比赛现场最忌讳的是直接跳到参数层反复试因为你可能在验证一个根本没坏掉的模块。4. 把“省二”的遗憾变成一套可复用的工程框架4.1 稳定优先于速度任务完成优先于花哨动作如果让我重新分配整个项目周期的精力我会把机械装配和台架测试的时间从三分之一提升到一半。轮腿机器人这类项目最终决定成绩的往往不是某个很酷的极限动作而是“基本盘”有多稳。“基本盘”具体包括结构刚度、重心位置、供电容量、控制频率、状态机边界、日志系统、团队分工。这些东西单独拿出来都不稀缺但能在一个项目里全部在截止日期前做到位就已经超过了大多数队伍。维度稳定流极限流核心目标每轮尽量跑完单轮尽量拿高分参数风格保守、留余量激进、逼近