在浙江赛区的轮腿机器人赛项中,拿到第四名、最终止步省二等奖,这个结果确实很遗憾。复盘时最该问的不是“还差多少分”,而是“我们到底在哪个技术环节失去了冲到省一的机会”。轮腿机器人不是一台普通的两轮小车,它需要在平衡控制、轮腿协同、任务路径规划和现场抗干扰之间同时做到可复现,任何一环只停留在“能跑”的程度,都会在正式比赛的连续任务中暴露出来。以下内容从参赛队伍技术成员的角度,重新拆解轮腿竞赛的备赛链路:从机械和硬件选型,到运动控制与导航调试,再到现场排错和答辩复盘,最终给出下一届备赛可以直接使用的检查清单。
1. 轮腿机器人赛项到底在考什么
1.1 先分清“轮式”和“轮腿式”在控制上的差异
在竞赛机器人里,最常见的是差速轮底盘:两个驱动轮加一个万向轮,控制量简单,左右轮速差决定转向,几乎不涉及重心控制。轮腿机器人则不同,它通过腿部关节改变机器人重心相对轮轴的位置,可以完成蹲下、抬腿、越障、调整姿态等动作。这种结构带来两个明显收益:一是越障能力比纯轮式强,二是通过改变重心可以实现更灵活的转向和姿态控制。代价是系统不再是一个纯运动学问题,而是“动力学加运动学”同时存在的控制问题。比如两轮平衡式轮腿,在俯仰方向上存在自不稳定环节,控制器必须持续输出,否则机器人在几十毫秒内就会倒地。
因此,比赛评分的底层逻辑很难只看“谁跑得快”。常见赛项会从任务完成度、完成时间、稳定性、技术答辩和文档材料等多个维度打分。如果队伍把大部分精力放在速度上,却忽视了多次连续运行的稳定性,正式比赛就容易在第二轮或第三轮失败,最终分数和名次都会掉下去。省二的名次中,很多队伍并不是没有能力完成动作,而是稳定性和可复现性不够。
1.2 常见评分点和技术点映射
不同赛区的评分细则会有差异,但常见赛项通常会从以下维度考察队伍:
| 评分侧重点 | 背后考察能力 | 容易失分的地方 |
|---|---|---|
| 任务完成度 | 软件状态机与机械动作是否可靠 | 动作序列在小概率状态下卡死 |
| 完成时间 | 控制速度、路径规划是否合理 | 导航参数保守导致绕路严重 |
| 稳定性 | 平衡控制、电机和 IMU 抗干扰能力 | 地面摩擦或灯光变化后抖动 |
| 答辩展示 | 方案设计和技术深度 | 只演示成功,不分析失败 |
| 文档规范 | 代码、接线、日志是否可维护 | 没有版本记录,无法复现参数 |
一轮比赛通常包含多次任务,成绩可能取最好或平均,具体要看实际规则。一个很常见的现象是:队伍在训练场地能稳定完成,到了比赛场地却频繁失败。原因往往不是某一个算法错了,而是标定、状态恢复和现场调试流程没有跟上。正式比赛比的是“断电重来也能继续跑”的工程能力,而不仅仅是演示视频里的最高水平。
1.3 省二和省一的差距通常不在“有没有做出来”
从浙江赛区第四名止步省二这个结果看,技术链路大概率已经打通:机器人能动、能完成指定任务、能在答辩中展示方案。缺少的往往是“高概率完成”的工程能力。省一队伍通常能在不同地面、不同光照、不同电池电量下连续多次保持相同表现,省二队伍则经常出现“第一遍成功,第二遍失败,第三遍又成功”的情况。这种波动在得分上可能只差一个任务节点,但反映的是控制参数、标定流程和异常恢复机制还不够系统。
2. 省赛前必备的环境与硬件基线
2.1 核心硬件如何选型更容易维护
轮腿机器人现在没有统一标准硬件。以常见的“双轮轮腿加前后辅助支撑”的结构为例,建议的硬件组合如下。这只是示例,落地前需要按实际赛项确认器件型号和接口。
| 模块 | 推荐方向 | 说明 |
|---|---|---|
| 主控板 | STM32F407 或同等级 | 负责电机控制和姿态解算,实时性高 |
| 上位机 | NVIDIA Jetson Orin Nano 或树莓派 | 负责视觉、导航和裁判系统通信 |
| IMU | MPU6050 / 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 和 mesh,control放 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 跳变”三类异常。
- 提升答辩质量,用数据表、参数对比和失败分析体现工程深度。
- 把代码和文档仓库化,从第一天开始记录每次版本的关键改动。
如果这些能力都补齐,即使下一次仍然没有拿到省一,队伍的工程评估能力也会明显高于这一届。竞赛名次会受现场因素影响,但可复现的技术能力和抗风险能力,是比奖状更值得留下的收获。