2026 年电赛(TI 杯)H 题:完整测评流程、失败案例复盘、比赛策略与开源交付

个人主页:
wengqidaifeng

✨ 永远在路上,永远向前走

个人专栏:
数据结构
C语言
嵌入式小白启动!
重要OJ算法题详解
蓝桥杯备战
C++从菜鸟到强手
python启航
AI大模型Agent:拥抱未来,赋能自己

文章目录

    • 博客系列总目录与阅读路线
    • 推荐阅读顺序
    • 全系列知识地图
    • 总览
    • 仓库资料边界
    • 开源说明
    • 第八篇:完整测评流程、失败案例复盘、比赛策略与开源交付
      • [1. 最终目标不是"代码完成",而是测评稳定](#1. 最终目标不是“代码完成”,而是测评稳定)
      • [2. 测评前的统一检查](#2. 测评前的统一检查)
      • [3. 每一问的验收思路](#3. 每一问的验收思路)
      • [4. 失败案例一:TB6612 未供电却怀疑代码](#4. 失败案例一:TB6612 未供电却怀疑代码)
      • [5. 失败案例二:灰度极性和顺序错误](#5. 失败案例二:灰度极性和顺序错误)
      • [6. 失败案例三:用同一套高 P 同时处理直线和半圆](#6. 失败案例三:用同一套高 P 同时处理直线和半圆)
      • [7. 失败案例四:错误地图和里程缩放](#7. 失败案例四:错误地图和里程缩放)
      • [8. 失败案例五:全白搜索变成主控制](#8. 失败案例五:全白搜索变成主控制)
      • [9. 失败案例六:S3 自动停车不稳定](#9. 失败案例六:S3 自动停车不稳定)
      • [10. 参数冻结和版本策略](#10. 参数冻结和版本策略)
      • [11. 开源交付内容](#11. 开源交付内容)
      • [12. 与往年电赛复盘的共通经验](#12. 与往年电赛复盘的共通经验)
      • [13. 最终检查清单](#13. 最终检查清单)
      • [14. 本篇结论](#14. 本篇结论)

博客系列总目录与阅读路线

本系列记录 MSPM0G3507 双主控小车从赛题分析、硬件搭建、底层驱动、循迹调试,到摆杆滚球控制和最终测评复盘的完整过程。文章中的路径均为仓库相对路径,代码、测试脚本和模块封装可以直接从公开仓库取得。

推荐阅读顺序

  1. 赛题拆解、总体方案与往年控制类小车赛题比较
  2. 硬件选型、接线与上电验证
  3. 软件架构、SysConfig 与模块化设计
  4. 编码器速度环、差速运动学、MPU6050 航向环与直线稳定
  5. 8 路灰度循迹、直线/半圆分段与 S1/S2/S3 状态机
  6. 摆杆机械结构、MaxiCamPro 测量、步进电机与三层 PID
  7. MaxiCamPro、双主控通信、VOFA+ 遥测与可复现实验方法
  8. 完整测评流程、失败案例复盘、比赛策略与开源交付

全系列知识地图

#mermaid-svg-yR75jC231tMGPFAK{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-yR75jC231tMGPFAK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-yR75jC231tMGPFAK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-yR75jC231tMGPFAK .error-icon{fill:#552222;}#mermaid-svg-yR75jC231tMGPFAK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-yR75jC231tMGPFAK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-yR75jC231tMGPFAK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-yR75jC231tMGPFAK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-yR75jC231tMGPFAK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-yR75jC231tMGPFAK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-yR75jC231tMGPFAK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-yR75jC231tMGPFAK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-yR75jC231tMGPFAK .marker.cross{stroke:#333333;}#mermaid-svg-yR75jC231tMGPFAK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-yR75jC231tMGPFAK p{margin:0;}#mermaid-svg-yR75jC231tMGPFAK .edge{stroke-width:3;}#mermaid-svg-yR75jC231tMGPFAK .section--1 rect,#mermaid-svg-yR75jC231tMGPFAK .section--1 path,#mermaid-svg-yR75jC231tMGPFAK .section--1 circle,#mermaid-svg-yR75jC231tMGPFAK .section--1 polygon,#mermaid-svg-yR75jC231tMGPFAK .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-yR75jC231tMGPFAK .section--1 text{fill:#ffffff;}#mermaid-svg-yR75jC231tMGPFAK .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-yR75jC231tMGPFAK .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-yR75jC231tMGPFAK .edge-depth--1{stroke-width:17;}#mermaid-svg-yR75jC231tMGPFAK .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-yR75jC231tMGPFAK .disabled,#mermaid-svg-yR75jC231tMGPFAK .disabled circle,#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:lightgray;}#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:#efefef;}#mermaid-svg-yR75jC231tMGPFAK .section-0 rect,#mermaid-svg-yR75jC231tMGPFAK .section-0 path,#mermaid-svg-yR75jC231tMGPFAK .section-0 circle,#mermaid-svg-yR75jC231tMGPFAK .section-0 polygon,#mermaid-svg-yR75jC231tMGPFAK .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-yR75jC231tMGPFAK .section-0 text{fill:black;}#mermaid-svg-yR75jC231tMGPFAK .node-icon-0{font-size:40px;color:black;}#mermaid-svg-yR75jC231tMGPFAK .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-yR75jC231tMGPFAK .edge-depth-0{stroke-width:14;}#mermaid-svg-yR75jC231tMGPFAK .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-yR75jC231tMGPFAK .disabled,#mermaid-svg-yR75jC231tMGPFAK .disabled circle,#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:lightgray;}#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:#efefef;}#mermaid-svg-yR75jC231tMGPFAK .section-1 rect,#mermaid-svg-yR75jC231tMGPFAK .section-1 path,#mermaid-svg-yR75jC231tMGPFAK .section-1 circle,#mermaid-svg-yR75jC231tMGPFAK .section-1 polygon,#mermaid-svg-yR75jC231tMGPFAK .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-yR75jC231tMGPFAK .section-1 text{fill:black;}#mermaid-svg-yR75jC231tMGPFAK .node-icon-1{font-size:40px;color:black;}#mermaid-svg-yR75jC231tMGPFAK .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-yR75jC231tMGPFAK .edge-depth-1{stroke-width:11;}#mermaid-svg-yR75jC231tMGPFAK .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-yR75jC231tMGPFAK .disabled,#mermaid-svg-yR75jC231tMGPFAK .disabled circle,#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:lightgray;}#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:#efefef;}#mermaid-svg-yR75jC231tMGPFAK .section-2 rect,#mermaid-svg-yR75jC231tMGPFAK .section-2 path,#mermaid-svg-yR75jC231tMGPFAK .section-2 circle,#mermaid-svg-yR75jC231tMGPFAK .section-2 polygon,#mermaid-svg-yR75jC231tMGPFAK .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-yR75jC231tMGPFAK .section-2 text{fill:#ffffff;}#mermaid-svg-yR75jC231tMGPFAK .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-yR75jC231tMGPFAK .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-yR75jC231tMGPFAK .edge-depth-2{stroke-width:8;}#mermaid-svg-yR75jC231tMGPFAK .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-yR75jC231tMGPFAK .disabled,#mermaid-svg-yR75jC231tMGPFAK .disabled circle,#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:lightgray;}#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:#efefef;}#mermaid-svg-yR75jC231tMGPFAK .section-3 rect,#mermaid-svg-yR75jC231tMGPFAK .section-3 path,#mermaid-svg-yR75jC231tMGPFAK .section-3 circle,#mermaid-svg-yR75jC231tMGPFAK .section-3 polygon,#mermaid-svg-yR75jC231tMGPFAK .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-yR75jC231tMGPFAK .section-3 text{fill:black;}#mermaid-svg-yR75jC231tMGPFAK .node-icon-3{font-size:40px;color:black;}#mermaid-svg-yR75jC231tMGPFAK .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-yR75jC231tMGPFAK .edge-depth-3{stroke-width:5;}#mermaid-svg-yR75jC231tMGPFAK .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-yR75jC231tMGPFAK .disabled,#mermaid-svg-yR75jC231tMGPFAK .disabled circle,#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:lightgray;}#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:#efefef;}#mermaid-svg-yR75jC231tMGPFAK .section-4 rect,#mermaid-svg-yR75jC231tMGPFAK .section-4 path,#mermaid-svg-yR75jC231tMGPFAK .section-4 circle,#mermaid-svg-yR75jC231tMGPFAK .section-4 polygon,#mermaid-svg-yR75jC231tMGPFAK .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-yR75jC231tMGPFAK .section-4 text{fill:black;}#mermaid-svg-yR75jC231tMGPFAK .node-icon-4{font-size:40px;color:black;}#mermaid-svg-yR75jC231tMGPFAK .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-yR75jC231tMGPFAK .edge-depth-4{stroke-width:2;}#mermaid-svg-yR75jC231tMGPFAK .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-yR75jC231tMGPFAK .disabled,#mermaid-svg-yR75jC231tMGPFAK .disabled circle,#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:lightgray;}#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:#efefef;}#mermaid-svg-yR75jC231tMGPFAK .section-5 rect,#mermaid-svg-yR75jC231tMGPFAK .section-5 path,#mermaid-svg-yR75jC231tMGPFAK .section-5 circle,#mermaid-svg-yR75jC231tMGPFAK .section-5 polygon,#mermaid-svg-yR75jC231tMGPFAK .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-yR75jC231tMGPFAK .section-5 text{fill:black;}#mermaid-svg-yR75jC231tMGPFAK .node-icon-5{font-size:40px;color:black;}#mermaid-svg-yR75jC231tMGPFAK .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-yR75jC231tMGPFAK .edge-depth-5{stroke-width:-1;}#mermaid-svg-yR75jC231tMGPFAK .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-yR75jC231tMGPFAK .disabled,#mermaid-svg-yR75jC231tMGPFAK .disabled circle,#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:lightgray;}#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:#efefef;}#mermaid-svg-yR75jC231tMGPFAK .section-6 rect,#mermaid-svg-yR75jC231tMGPFAK .section-6 path,#mermaid-svg-yR75jC231tMGPFAK .section-6 circle,#mermaid-svg-yR75jC231tMGPFAK .section-6 polygon,#mermaid-svg-yR75jC231tMGPFAK .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-yR75jC231tMGPFAK .section-6 text{fill:black;}#mermaid-svg-yR75jC231tMGPFAK .node-icon-6{font-size:40px;color:black;}#mermaid-svg-yR75jC231tMGPFAK .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-yR75jC231tMGPFAK .edge-depth-6{stroke-width:-4;}#mermaid-svg-yR75jC231tMGPFAK .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-yR75jC231tMGPFAK .disabled,#mermaid-svg-yR75jC231tMGPFAK .disabled circle,#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:lightgray;}#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:#efefef;}#mermaid-svg-yR75jC231tMGPFAK .section-7 rect,#mermaid-svg-yR75jC231tMGPFAK .section-7 path,#mermaid-svg-yR75jC231tMGPFAK .section-7 circle,#mermaid-svg-yR75jC231tMGPFAK .section-7 polygon,#mermaid-svg-yR75jC231tMGPFAK .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-yR75jC231tMGPFAK .section-7 text{fill:black;}#mermaid-svg-yR75jC231tMGPFAK .node-icon-7{font-size:40px;color:black;}#mermaid-svg-yR75jC231tMGPFAK .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-yR75jC231tMGPFAK .edge-depth-7{stroke-width:-7;}#mermaid-svg-yR75jC231tMGPFAK .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-yR75jC231tMGPFAK .disabled,#mermaid-svg-yR75jC231tMGPFAK .disabled circle,#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:lightgray;}#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:#efefef;}#mermaid-svg-yR75jC231tMGPFAK .section-8 rect,#mermaid-svg-yR75jC231tMGPFAK .section-8 path,#mermaid-svg-yR75jC231tMGPFAK .section-8 circle,#mermaid-svg-yR75jC231tMGPFAK .section-8 polygon,#mermaid-svg-yR75jC231tMGPFAK .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-yR75jC231tMGPFAK .section-8 text{fill:black;}#mermaid-svg-yR75jC231tMGPFAK .node-icon-8{font-size:40px;color:black;}#mermaid-svg-yR75jC231tMGPFAK .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-yR75jC231tMGPFAK .edge-depth-8{stroke-width:-10;}#mermaid-svg-yR75jC231tMGPFAK .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-yR75jC231tMGPFAK .disabled,#mermaid-svg-yR75jC231tMGPFAK .disabled circle,#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:lightgray;}#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:#efefef;}#mermaid-svg-yR75jC231tMGPFAK .section-9 rect,#mermaid-svg-yR75jC231tMGPFAK .section-9 path,#mermaid-svg-yR75jC231tMGPFAK .section-9 circle,#mermaid-svg-yR75jC231tMGPFAK .section-9 polygon,#mermaid-svg-yR75jC231tMGPFAK .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-yR75jC231tMGPFAK .section-9 text{fill:black;}#mermaid-svg-yR75jC231tMGPFAK .node-icon-9{font-size:40px;color:black;}#mermaid-svg-yR75jC231tMGPFAK .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-yR75jC231tMGPFAK .edge-depth-9{stroke-width:-13;}#mermaid-svg-yR75jC231tMGPFAK .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-yR75jC231tMGPFAK .disabled,#mermaid-svg-yR75jC231tMGPFAK .disabled circle,#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:lightgray;}#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:#efefef;}#mermaid-svg-yR75jC231tMGPFAK .section-10 rect,#mermaid-svg-yR75jC231tMGPFAK .section-10 path,#mermaid-svg-yR75jC231tMGPFAK .section-10 circle,#mermaid-svg-yR75jC231tMGPFAK .section-10 polygon,#mermaid-svg-yR75jC231tMGPFAK .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-yR75jC231tMGPFAK .section-10 text{fill:black;}#mermaid-svg-yR75jC231tMGPFAK .node-icon-10{font-size:40px;color:black;}#mermaid-svg-yR75jC231tMGPFAK .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-yR75jC231tMGPFAK .edge-depth-10{stroke-width:-16;}#mermaid-svg-yR75jC231tMGPFAK .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-yR75jC231tMGPFAK .disabled,#mermaid-svg-yR75jC231tMGPFAK .disabled circle,#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:lightgray;}#mermaid-svg-yR75jC231tMGPFAK .disabled text{fill:#efefef;}#mermaid-svg-yR75jC231tMGPFAK .section-root rect,#mermaid-svg-yR75jC231tMGPFAK .section-root path,#mermaid-svg-yR75jC231tMGPFAK .section-root circle,#mermaid-svg-yR75jC231tMGPFAK .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-yR75jC231tMGPFAK .section-root text{fill:#ffffff;}#mermaid-svg-yR75jC231tMGPFAK .section-root span{color:#ffffff;}#mermaid-svg-yR75jC231tMGPFAK .section-2 span{color:#ffffff;}#mermaid-svg-yR75jC231tMGPFAK .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-yR75jC231tMGPFAK .edge{fill:none;}#mermaid-svg-yR75jC231tMGPFAK .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-yR75jC231tMGPFAK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} H题车载平衡滚球
赛题与指标
赛道圈时
启停判据
滚球目标点
硬件系统
MSPM0G3507
TB6612与编码器
灰度与MPU6050
MaxiCamPro与步进电机
软件控制
速度环
航向环
灰度状态机
三层滚球PID
工程方法
接线验证
VOFA遥测
回归测试
测评复盘

总览

这道题不是单独写一个循迹 PID,而是把机械结构、电源、传感器、实时调度、速度闭环、航向辅助、视觉通信、双主控安全和赛道状态机组合成一个可测量、可恢复、可验收的系统。调试时坚持"每次只改变一个因素",并用串口遥测、主机回归测试和实车视频记录证据。

仓库资料边界

  • 小车运动主控工程:公开仓库根目录 smartcar_keil_diag/
  • 通用模块封装:公开仓库中的 ModulePackage/
  • 摆杆/滚球控制参考工程:BalanceController/
  • 硬件与接线说明:Hardware/
  • 主机测试与回归脚本:Tests/
  • 主控、蓝牙、VOFA+ 和双主控协议说明:仓库根目录下相应的 *.md 文件

主控采用 LCKFB 天猛星 MSPM0G3507,车体约为 30 cm × 24 cm,车轮直径约 65 mm。实际使用的主要器件包括 JGB37-520 直流减速电机、TB6612 驱动器、MPU6050、8 路灰度传感器、MaxiCamPro 和无编码器步进电机。涉及具体电气参数、安装尺寸和控制增益时,应以实测记录和仓库中的配置为准,不要直接照搬示例数值。

开源说明

完整工程、博客、测试脚本和模块封装均发布在 GitHub:

https://github.com/wengqidaifeng/smartcar_keil_diag

建议按 01→08 的顺序阅读;需要查代码时从 User/Source/ModulePackage/Tests/ 进入。文章中的结论区分为"源码已实现""主机测试已验证"和"必须在实车/机构上复测"三类,便于后来者复现实验并继续改进。

第八篇:完整测评流程、失败案例复盘、比赛策略与开源交付

1. 最终目标不是"代码完成",而是测评稳定

电赛项目容易在最后阶段陷入一个误区:程序能编译、模块都能动,就认为系统基本完成。实际上,裁判看到的是规定起点、规定地图、规定时间、规定误差和多次运行稳定性。工程内部的模块数量、代码行数和算法名称都不能代替测评结果。

因此最后阶段需要从"开发视角"切换为"验收视角"。每一问都建立独立测试流程、输入条件、通过阈值、急停方法和记录表。任何未在正式机械、正式地图、正式电池条件下重复通过的功能,都应标为待验证,而不是写入最终成绩。

2. 测评前的统一检查

机械方面,重新测量整车最大长度、宽度和高度,包括相机、线束、球槽最大倾角和活动连杆;检查螺丝、联轴器、合页/轴承、限位、轮胎和万向轮。球槽中心 O、±5 cm 标记清晰,钢球和槽内壁符合要求。电池固定牢固,重件尽量位于低层。

电气方面,确认 12 V 动力电、逻辑稳压、共地、电平转换、保险/开关、TB6612 STBY、步进 EN 和传感器供电。检查所有插头方向和应力释放,电机线远离 I²C 与编码器。准备可快速操作的物理总开关,J-Link 和串口线不能妨碍车辆运动。

软件方面,确认 Git 提交号、Keil 构建 0 error/0 warning、SysConfig 校验、主机回归、OLED 模式、K1 急停、K2 模式切换、故障复位和遥测字段。比赛固件应冻结,禁止临场同时修改多个参数。保留上一版已验证固件和烧录文件,以便快速回退。

3. 每一问的验收思路

图传问先独立验证:接收端位于规定区域外,画面完整覆盖球槽,连续录像可回放,延迟和卡顿在可接受范围。若 MaxiCamPro 同时做图传与视觉测量,要记录串口有效帧率;如果独立图传更可靠,就明确两相机职责。

小车高速整圈问使用 S1。车辆从启停线按规定位图启动,离线后重新武装,完整经过 AB、BC、CD、DA,回到终点后首拍触发主动刹车。记录总时间、终点触发到静止的距离、每段最大偏差和丢线次数。至少连续三次满足要求,才可认为稳定。

静止滚球问禁止车轮输出,完成回零和视觉就绪后,从 O 出发执行 +5 cm、稳定、折返、-5 cm、稳定。总计时从第一次离开中心开始,记录最大超调、最终误差、每段时间、视觉丢帧和球杆角度。到达判定必须同时考虑位置和速度。

带球整圈问使用 S2。小车不自动终点停车,由 K1 或上层任务结束;摆杆主控保持目标位置并接收车体姿态前馈。记录圈时、球位置峰值、第二段直线和两个半圆的误差。若球控制失败但车仍能跑,应有明确故障和安全停机,不能让步进机构持续撞限位。

第一段直线/入弯验证使用 S3,约 27 cm/s,前 140 cm 保持航向,随后进入正常半圆;在 8 s 内进入弯道是时间目标。当前取消自动停车,K1 明确停止,避免里程误差造成随机停车。正式赛题若要求在 B 点停,则应另建专门且经过重复验证的停车模式,而不是临时恢复旧逻辑。

4. 失败案例一:TB6612 未供电却怀疑代码

台架测试曾出现三个速度档轮子都不转,串口和主控看似正常。最终发现电池总开关未打开,逻辑域上电但动力域无电。这个案例说明故障树应从电源、地、使能、接线、方向、反馈到控制依次排查。若一开始就改 PWM 或 PID,不仅无效,还会在恢复供电后造成突然高速。

类似地,TB6612 未装、接线接反、模块正反面理解错误,都曾导致现象与预期不符。软件可以修正电机正方向映射,但不能补偿 VM 未供电、STBY 未使能或电机线断开。每次发现"完全不动"先测电压和使能;发现"方向相反"先逐轮点动;发现"速度不一致"再看编码器与速度环。

5. 失败案例二:灰度极性和顺序错误

早期红外模块黑线输出低,新灰度模块黑线输出高。如果沿用旧取反,程序会把白底当黑线,起点、终点、全白搜索全部错误。X4/X5 顺序一度也受旧封装影响。正确修复不是调 PID,而是逐路遮挡 X1~X8,输出原始电平和 active 位图,确认 X1 左、X8 右、中心顺序和极性。

这说明传感器驱动必须在算法前完成"语义标准化":无论物理高低,算法层只接收黑线 active=1;无论引脚如何,bit0 始终对应 X1。换模块时只改适配层并重新测试,控制层不应感知硬件极性。

6. 失败案例三:用同一套高 P 同时处理直线和半圆

为了让半圆转得过来,曾连续提高循迹 P 和边缘差速,半圆一度改善,但直线开始大幅蛇形,第二段直线尤其容易掉线。原因是半圆需要持续转向前馈和较大反馈,直线只需要小修正和角速度阻尼。全局 P 增大相当于把弯道需求强加给直线。

最终方向是按赛道状态分段:直线低增益、低限幅、航向保持;半圆高增益、几何前馈、较大差速;入弯提前减速;出弯用 180°航向恢复。状态机和限幅比继续寻找一个"万能 P"更有效。

7. 失败案例四:错误地图和里程缩放

在错误尺寸地图上调好的相位进入点,迁移到正式地图后不再成立。旧代码用固定缩放补偿一圈距离,导致进入半圆晚、退出半圆晚,车辆入弯靠全白右转,第二段直线仍处于弯道状态。速度变化后相位误差进一步扩大。

修复时恢复正式地图的真实分段里程,并增加灰度与 MPU 证据。里程只提供计划区间,不能单独决定所有状态。任何换地图、换轮胎或改变车重后,都要重新测一圈编码器距离和半圆累计角,而不是只改某个比例。

8. 失败案例五:全白搜索变成主控制

当弯道控制不够及时,小车冲出黑线后进入全白,搜索逻辑向右转,恰好又找回线。多次后看起来能完成半圆,实际上有效灰度控制占比很低,车辆依赖丢线策略绕圈。稍微提高速度或改变起始姿态,就会彻底失败。

解决方法是让有线状态下的半圆前馈和边缘权重足够,搜索只作短时恢复;搜索方向基于最后有效边缘,速度和差速受限;重捕获后清空历史。遥测中统计全白持续时间,可以判断车辆是"循迹跑完"还是"丢线后碰巧找回"。

9. 失败案例六:S3 自动停车不稳定

S3 曾尝试根据编码器里程、时间、灰度偏向和 MPU 入弯证据在 B 点自动停车。由于轮径误差、打滑和入弯证据时机不同,实测出现提前 5~20 cm 停、越过 B 点、减速后爬行、进入半圆仍不停甚至原地转等结果。继续堆叠条件使逻辑越来越复杂,却没有稳定基准。

最终按需求取消 S3 自动停车,降低到约 27 cm/s,保证 8 s 内进入弯道,停止由 K1 明确执行。这个决策体现比赛工程的重要原则:若一个功能暂时无法稳定满足评分规则,应简化边界并保留可控行为,而不是让不可靠自动化影响整个系统。

10. 参数冻结和版本策略

比赛前至少保留三个标签:底层已验证版、整圈保底版、联合滚球候选版。保底版只接受修复明确故障,不再尝试大幅提速;候选版可以优化性能,但每次都跑完整回归和三次实车。烧录前记录提交号和构建日志,OLED 或串口输出固件版本。

现场修改参数要有上限。若连续两次修改没有让预测指标改善,回退到保底版并重新分析数据。不要在电池即将耗尽、轮胎状态变化或地图移动后继续比较参数,因为实验条件已经不同。

11. 开源交付内容

完整仓库应包含小车主控源代码、摆杆控制参考工程、通用模块库、测试、SysConfig、Keil/CCS 工程、接线表、串口协议和博客。构建产物、日志、视频、个人 IDE 文件和临时备份应排除。README 首屏说明项目目标、目录、构建方法、已验证状态和安全边界。

博客不能只写最终方案,还应保留关键失败与取舍,让读者理解为什么直线与半圆分开、为什么视觉不直接发步进方向、为什么步数不能代替编码器、为什么编译通过不等于实车通过。开源价值在于提供可复现方法,而不是给出一组只适合某辆车的参数。

12. 与往年电赛复盘的共通经验

无论是循迹车、云台、倒立摆、搬运小车还是无人机,控制类题目都遵循相似规律:机械和测量决定上限,固定周期和闭环决定基础,状态机决定任务完整性,遥测和版本控制决定调试效率,安全保护决定能否持续实验。复杂算法只有建立在这些基础上才有价值。

往年题目中常见的"先把每个模块单独跑通"在本题仍然成立,但还要增加联合扰动测试。车辆和滚球分别稳定不代表同时稳定,必须在不同速度、弯道和急停条件下验证耦合。反过来,联合失败也不要同时调两套 PID,应先判断扰动来自哪条链。

13. 最终检查清单

上场前确认:机械外廓合规;球槽限位和回零有效;电池满电且固定;所有地线和插头可靠;灰度位图正确;编码器方向一致;MPU 静止校准完成;K1 急停有效;OLED 模式正确;S1/S2/S3 行为与说明一致;视觉数据新鲜;步进编码器反馈有效;故障能失能;保底固件可立即回退。

场地测试确认:第一直线无蛇形;BC 不依赖全白;BC 出口车头转正;CD 不在边缘来回救线;DA 转向与 BC 对称;终点识别不会提前;主动刹车距离满足要求;滚球在直线、半圆和停车时均无撞限位。每项都要看最差一次,不只看最好一次。

14. 本篇结论

本项目最重要的成果不是某个最终参数,而是一套从赛题指标、硬件事实、软件分层、闭环控制、遥测实验到测评交付的方法。失败案例说明,很多看似算法的问题实际来自电源、极性、状态或地图;有效改进来自证据和边界,而不是连续猜参数。把这些过程公开,能让后续复现者少走弯路,也能让自己在面对下一道控制类题时快速重建可靠的开发节奏。

相关推荐
ysu_03141 小时前
【创作128天纪念】从新手村踏上征途
c语言
0x3F(小茶)2 小时前
FreeRTOS 任务相关 API 函数
c语言·arm开发·单片机
c238562 小时前
C/C++每日一练21
c语言·开发语言·c++
学生哥-_-2 小时前
STC8H1K08单片机在Keil环境下各外设的配置及使用方法
单片机·嵌入式硬件·mongodb
hongmai6668884 小时前
聊聊ESP32-C3-WROOM-02-N8这颗8MB Flash的RISC-V模组
笔记·嵌入式硬件·物联网·智能路由器·risc-v
c2385610 小时前
MySQL 基础用法(上):库表管理与数据增删改
c语言·数据库·c++·mysql
李永奉10 小时前
C语言-嵌入式开发C语言常用预处理指令合集
c语言·开发语言
YuforiaCode12 小时前
第十六届蓝桥杯 2025 C/C++组 数列差分
c语言·c++·蓝桥杯
VALENIAN瓦伦尼安教学设备14 小时前
激光对中仪采购要点
数据库·嵌入式硬件·算法