轮腿机器人竞赛备赛:从平衡控制到稳定发挥的技术拆解
在浙江赛区的轮腿机器人赛项中拿到第四名、最终止步省二等奖这个结果确实很遗憾。复盘时最该问的不是“还差多少分”而是“我们到底在哪个技术环节失去了冲到省一的机会”。轮腿机器人不是一台普通的两轮小车它需要在平衡控制、轮腿协同、任务路径规划和现场抗干扰之间同时做到可复现任何一环只停留在“能跑”的程度都会在正式比赛的连续任务中暴露出来。以下内容从参赛队伍技术成员的角度重新拆解轮腿竞赛的备赛链路从机械和硬件选型到运动控制与导航调试再到现场排错和答辩复盘最终给出下一届备赛可以直接使用的检查清单。1. 轮腿机器人赛项到底在考什么1.1 先分清“轮式”和“轮腿式”在控制上的差异在竞赛机器人里最常见的是差速轮底盘两个驱动轮加一个万向轮控制量简单左右轮速差决定转向几乎不涉及重心控制。轮腿机器人则不同它通过腿部关节改变机器人重心相对轮轴的位置可以完成蹲下、抬腿、越障、调整姿态等动作。这种结构带来两个明显收益一是越障能力比纯轮式强二是通过改变重心可以实现更灵活的转向和姿态控制。代价是系统不再是一个纯运动学问题而是“动力学加运动学”同时存在的控制问题。比如两轮平衡式轮腿在俯仰方向上存在自不稳定环节控制器必须持续输出否则机器人在几十毫秒内就会倒地。因此比赛评分的底层逻辑很难只看“谁跑得快”。常见赛项会从任务完成度、完成时间、稳定性、技术答辩和文档材料等多个维度打分。如果队伍把大部分精力放在速度上却忽视了多次连续运行的稳定性正式比赛就容易在第二轮或第三轮失败最终分数和名次都会掉下去。省二的名次中很多队伍并不是没有能力完成动作而是稳定性和可复现性不够。1.2 常见评分点和技术点映射不同赛区的评分细则会有差异但常见赛项通常会从以下维度考察队伍评分侧重点背后考察能力容易失分的地方任务完成度软件状态机与机械动作是否可靠动作序列在小概率状态下卡死完成时间控制速度、路径规划是否合理导航参数保守导致绕路严重稳定性平衡控制、电机和 IMU 抗干扰能力地面摩擦或灯光变化后抖动答辩展示方案设计和技术深度只演示成功不分析失败文档规范代码、接线、日志是否可维护没有版本记录无法复现参数一轮比赛通常包含多次任务成绩可能取最好或平均具体要看实际规则。一个很常见的现象是队伍在训练场地能稳定完成到了比赛场地却频繁失败。原因往往不是某一个算法错了而是标定、状态恢复和现场调试流程没有跟上。正式比赛比的是“断电重来也能继续跑”的工程能力而不仅仅是演示视频里的最高水平。1.3 省二和省一的差距通常不在“有没有做出来”从浙江赛区第四名止步省二这个结果看技术链路大概率已经打通机器人能动、能完成指定任务、能在答辩中展示方案。缺少的往往是“高概率完成”的工程能力。省一队伍通常能在不同地面、不同光照、不同电池电量下连续多次保持相同表现省二队伍则经常出现“第一遍成功第二遍失败第三遍又成功”的情况。这种波动在得分上可能只差一个任务节点但反映的是控制参数、标定流程和异常恢复机制还不够系统。2. 省赛前必备的环境与硬件基线2.1 核心硬件如何选型更容易维护轮腿机器人现在没有统一标准硬件。以常见的“双轮轮腿加前后辅助支撑”的结构为例建议的硬件组合如下。这只是示例落地前需要按实际赛项确认器件型号和接口。模块推荐方向说明主控板STM32F407 或同等级负责电机控制和姿态解算实时性高上位机NVIDIA Jetson Orin Nano 或树莓派负责视觉、导航和裁判系统通信IMUMPU6050 / ICM20602六轴数据用于俯仰和横滚解算轮部电机带编码器的直流减速电机或伺服轮需要能精确获得轮速腿部电机舵机或带电流反馈的关节模组需要能锁住位置并检测堵转驱动器与电机匹配注意最大电流轮腿越障瞬间电流可能翻倍电池3S LiPo容量按续航计算容量不是越大越好重量会影响平衡硬件选型的第一原则是“好调试”不是“参数最高”。比如主频很高的开发板如果配套资料少很多队伍在校验编码器和调 PID 上就浪费一周。推荐先把厂商提供的示例跑通再改到自己的结构上。不要一开始就写完整系统。2.2 软件环境至少需要仿真、底层和联调三层在真实机器人上反复直接调试容易损坏机械件也会让队伍的时间都耗在拆装和重新接线。建议本地先搭三层环境仿真层Gazebo 中导入 URDF 模型先验证导航、路径规划和状态机逻辑。底层控制层STM32 上跑姿态环和轮速环通过串口打印传感器数据。联调层上位机和下位机通过串口或 ROS2 topic 连接统一使用一套状态定义。一个简单可复用的 ROS2 工作区结构可以这样组织src/ wheel_leg_bringup/ wheel_leg_description/ wheel_leg_control/ wheel_leg_nav/其中description放 URDF 和 meshcontrol放 PID 参数和状态机nav放 Nav2 参数。这样每次调参可以只改对应包的参数文件不需要翻控制器源码。仿真环境适合做快速验证但比赛现场必须使用经过实测的保守参数组不能把仿真参数直接搬到实机。2.3 队伍分工和调试节奏竞赛队伍通常只有几个人。建议至少分成三块底层控制负责姿态解算、PID、电机驱动。上层应用负责状态机、导航、视觉识别和裁判系统接口。机械与测试负责结构加固、线束整理、传感器标定和比赛日志记录。分工不是各做各的而是要建立“接口先定”的约定。比如底层控制发布robot_odom上层导航订阅它底层接收cmd_vel就按轮腿运动模型做速度映射。先约定消息类型再并行开发联调时才能快速定位问题。实际的备赛周期里最怕的不是某个算法难而是上位机和下位机的接口直到赛前一周还在变。3. 从“能跑”到“稳定”的轮腿控制链路3.1 自平衡与速度环先写一个可收敛的 PID轮腿平衡控制最常用的起点是串级 PID外环控制姿态角输出目标轮加速度内环控制轮速或轮角速度输出电机 PWM。先不追求现代控制理论先把一个可靠的 PID 写出来跑通再对比 LQR 和状态反馈。一个带积分限幅和输出限幅的 PID 实现如下用于说明思路typedef struct { float kp; float ki; float kd; float integral; float last_error; float integral_limit; float output_limit; } Pid; float pid_update(Pid *pid, float target, float measured, float dt) { if (dt 0.0f) return 0.0f; float error target - measured; pid-integral error * dt; if (pid-integral pid-integral_limit) { pid-integral pid-integral_limit; } if (pid-integral -pid-integral_limit) { pid-integral -pid-integral_limit; } float derivative (error - pid-last_error) / dt; float output pid-kp * error pid-ki * pid-integral pid-kd * derivative; pid-last_error error; if (output pid-output_limit) output pid-output_limit; if (output -pid-output_limit) output -pid-output_limit; return output; }调参顺序建议是先只加kp让机器人能朝目标角度反方向施加力矩然后加kd抑制震荡最后加很小的ki消除静态偏差。如果出现高频抖动先检查 IMU 滤波和输出限幅而不是继续加参数。需要特别注意的是轮腿机器人在电池电压变化时电机会有不同响应。如果控制周期固定为 1ms 或 5ms电池电压低时相同 PWM 产生的加速度会变小。比赛前除了调 PID还要做一个“电量与 PWM 映射”校准或者使用电机驱动器上的电流或速度闭环避免低压后机器人突然变软。3.2 轮腿越障时的状态切换越障是轮腿机器人区别于普通轮式底盘的关键动作也是最容易摔的环节。常见动作是先低速接近障碍抬升腿部改变重心高度前轮或支撑轮越过再落腿恢复平衡。整个过程不能只靠连续 PID 硬撑建议使用状态机把动作拆成阶段每个阶段设定完成条件和超时保护。一个最小状态机可以这样定义typedef enum { ST_INIT, ST_BALANCE, ST_APPROACH, ST_LIFT, ST_CLIMB, ST_SETTLE, ST_STOP } RobotState;状态机并不复杂重点是每个状态都要有“进入动作”和“退出条件”。例如ST_LIFT的进入动作是设置腿部关节目标角度退出条件是“抬升角度误差小于阈值且保持 0.2s”。不能只用“过了 2 秒”作为退出条件因为如果腿部电机堵转2 秒后机器人可能处于错误姿态继续下一状态就会摔倒。越障参数建议用一个结构体集中管理typedef struct { float approach_speed; float lift_height_cm; float climb_speed; float lift_angle_deg; float settle_time_s; float timeout_s; } ClimbParam;这样比赛现场可以根据障碍高度快速切换不同参数组而不是重新编译固件。现场出现问题也能通过日志快速确认是“超时退出”还是“角度误差未收敛”。3.3 上层导航不是越复杂越好如果赛项包含点位任务或自主巡检上层会用到导航。对于轮腿底盘建议先使用差速模型做 Nav2 配置再根据实际轮距、轮径校准里程计。Nav2 参数中常影响比赛表现的是机器人速度和加速度限制。一个保守的 DWB 局部规划器配置片段如下用于说明参数位置FollowPath: plugin: dwb_core::DWBLocalPlanner max_vel_x: 0.5 min_vel_x: -0.1 max_vel_theta: 1.2 min_speed_xy: 0.05 max_speed_xy: 0.6这里的max_vel_x不是越大越好。轮腿平衡机器人在急加速和急停时姿态角变化大如果底部平衡环没有同步提高带宽会出现“起步后仰、停车前冲”的现象。建议把加速度限制放在 Nav2 和底层两个层面先让底层能稳定执行 50% 速度再逐步调高目标速度。4. 浙江赛区现场容易翻车的几个环节4.1 场地地面、光线和标定比赛场地和训练室通常有明显差异。最容易中招的是三件事地面摩擦系数不同导致轮速 PID 和里程计标定失效。场地灯光或反光影响视觉识别白色标记线变成黑色。地毯或地胶接缝处有凸起机器人高速通过时会误判为墙或障碍。针对这几点现场调试顺序建议是先做 IMU 零点标定再做里程计直线校准最后跑一段任务路径。不要一上来就调导航参数。如果赛程允许至少提前一天到场地做“1 米直线”测试记录左右轮达到相同编码器速度后的实际位移偏移再修改轮距参数。这个测试看起来简单却能提前发现轮径不一致、编码器方向接反、驱动器响应不同步等多个问题。4.2 调试窗口永远不够用任何比赛给正式调试的时间都很短。现场最常见的情况是机器人通电后姿态异常队伍花了 20 分钟检查接线最后发现只是串口波特率选错导致上位机收不到 IMU 数据。为了避免这种浪费出发前要准备一套“现场启动检查表”。检查表至少包括IMU 数据是否输出角度是否稳定。轮子编码器是否在推动时产生数值变化。底层控制是否进入平衡状态。上位机收到的cmd_vel是否随时间变化。电池电压是否高于保护阈值。裁判系统或遥控接收是否正常。把这个流程压缩到 2 分钟以内比赛日才可以快速切换任务模式。调试窗口宝贵的另一个原因是现场临时改参数后很难完整测试完所有任务分支所以最好提前准备多组参数文件现场只做小范围调整而不是重新调整套 PID。4.3 断电、复位和手动接管正式比赛存在多次任务一旦机器人跌倒或断电要在最短时间内恢复。队伍需要提前设计三种恢复方式自动复位检测到姿态角超限或电机堵转进入安全停止状态。手动接管使用遥控器或串口命令切换到手动模式把机器人扶正并回到起点。热重启上位机和下位机重启后能从默认参数文件重新加载状态机。很多队伍只做自动复位忽略手动接管。自动复位在算法异常时可能反复触发反而让机器人乱跑。建议把“急停”和“手动模式”做成优先级最高的输入比赛现场能节省大量时间。同时机械上要预留一个能快速扶正机器人而不损坏结构的把手否则每次跌倒后队伍只能小心翼翼地把机器搬回起点。5. 复盘第四名为什么止步省二5.1 得分差异往往来自“完成次数”省二和省一的技术能力差距有时候并不是某一个算法没实现而是完成次数不够稳定。重新看比赛录像和裁判评分表时先统计队伍完成了几次“满分任务”再统计失败发生在哪个阶段。如果任务失败集中在“越障后落腿”和“转向后重新平衡”说明控制链路的问题不是速度而是状态切换的鲁棒性。推荐用一张简单的记录表复盘每次运行运行次数平衡是否稳定越障是否成功导航是否超时失败阶段可能原因1是是否无-2是是是转向后抖动地面摩擦变化3否否-起步后仰电池低压表格中的数据比排名更能说明问题。如果五次运行中只有两次完全成功那么省二的成绩是符合概率的。提升名次的关键是提高成功率而不是追求单次更快的速度。5.2 答辩和文档分数常被忽视很多队伍把答辩当成“展示成果”其实评委更关心设计约束、失败原因和改进方向。轮腿机器人在打磨阶段会有大量失败的尝试这些恰好是答辩的好素材。建议准备三部分内容结构设计为什么选轮腿复合而不选纯轮式或纯腿式。控制方案从 PID 到状态机的演进过程。比赛现场遇到的数据异常和最终结论。文档同样重要。代码、调试参数、机械图纸和硬件接线图如果都能版本化说明队伍具备工程管理意识。省一和省二在机械水平接近时就可能因为这一项拉开差距。答辩时不要只放成功视频也放一段失败录像然后说明你如何定位和修复这种回答的说服力比“我们的方案很稳定”强得多。5.3 名次不是技术水平的唯一证明第四名、省二等奖这个结果从竞赛角度看有遗憾但从工程能力看说明已经是赛区前十的参赛队伍。复盘时要避免两个极端一种是把失败全归给“运气差”另一种是认为自己“只差一点”。更合理的解释是技术链路已经跑通但工程化程度没有达到“高概率成功”的门槛。下一届备赛最该补的不是新算法而是系统性的稳定性测试和现场流程。6. 下一届备赛改进清单和常见坑6.1 至少避开的五个坑这里梳理五个与本文主题强相关的坑只在一类地面调参。训练时在木地板跑得很好换到比赛地胶就抖动。建议准备三种地面硬木、地胶、短毛地毯至少每周轮换测试一次。忽略电池电压变化。满电时参数和低电时参数要有两套否则后程会出现明显的姿态偏移。底层和上层共用电源无隔离。电机瞬间大电流会让 IMU 数据跳变导致平衡环误动作。建议电机电源与控制电源分开或使用隔离电源模块。状态机没有超时保护。腿部电机一旦卡住状态机可能一直停在原地。每个状态都需要“正常退出条件”和“异常超时退出”。现场调试没有版本对比。改一个参数后没有回退机制越调越乱。推荐每次调参都输出一份 YAML 或 CSV 日志记录时间、参数组和实测结果。6.2 比赛日检查清单出发前和比赛日可以复用下面这个清单[ ] 机械结构螺丝是否全部紧固线束是否留有活动余量。[ ] 电池充满且准备备用电池记录每一块电池的电压。[ ] 遥控器、裁判系统、上位机程序版本全部确认。[ ] 提前把场地标定参数写入独立文件。[ ] 准备“2 分钟启动流程”并打印出来。[ ] 机器人跌倒后能在 1 分钟内完成复位并重新开始任务。在实际项目中这个清单还可以继续扩充但核心是“减少现场临时决策”。正式比赛的每一分钟都很宝贵与其在现场想“这个参数要不要改”不如提前把所有可变项都做成可一键切换的配置。比赛日最怕的不是机器人坏了而是队伍因为紧张和缺乏流程把一个本来能修复的问题拖到比赛结束。6.3 从省二到省一下一步技术路线建议如果下一届还继续做轮腿机器人建议按优先级补齐以下能力建立完整的仿真与实机一致性验证流程减少在真实机械上的盲目调试。把平衡控制从固定 PID 升级到带状态观测器的 LQR 或 MPC前提是先保存好现有 PID 参数作为对比基线。引入故障诊断机制通过编码器和 IMU 数据判断“轮子打滑”“腿部堵转”“IMU 跳变”三类异常。提升答辩质量用数据表、参数对比和失败分析体现工程深度。把代码和文档仓库化从第一天开始记录每次版本的关键改动。如果这些能力都补齐即使下一次仍然没有拿到省一队伍的工程评估能力也会明显高于这一届。竞赛名次会受现场因素影响但可复现的技术能力和抗风险能力是比奖状更值得留下的收获。