2026 年电赛(TI 杯)H 题:摆杆机械结构、MaxiCamPro 测量、步进编码器与三层 PID

个人主页:
wengqidaifeng

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

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

文章目录

    • 博客系列总目录与阅读路线
    • 推荐阅读顺序
    • 全系列知识地图
    • 总览
    • 仓库资料边界
    • 开源说明
    • [第六篇:摆杆机械结构、MaxiCamPro 测量、步进电机与三层 PID](#第六篇:摆杆机械结构、MaxiCamPro 测量、步进电机与三层 PID)
      • [1. 滚球系统为什么是欠驱动控制](#1. 滚球系统为什么是欠驱动控制)
      • [2. 机械结构是闭环的一部分](#2. 机械结构是闭环的一部分)
      • [3. 步进驱动不能等同于位置闭环](#3. 步进驱动不能等同于位置闭环)
      • [4. MaxiCamPro 负责测量而不是下命令](#4. MaxiCamPro 负责测量而不是下命令)
      • [5. 三层串级 PID](#5. 三层串级 PID)
      • [6. 调参顺序](#6. 调参顺序)
      • [7. 到达判定和任务状态机](#7. 到达判定和任务状态机)
      • [8. 车体姿态前馈](#8. 车体姿态前馈)
      • [9. 与往年摆杆、云台和球板题的比较](#9. 与往年摆杆、云台和球板题的比较)
      • [10. 本篇结论](#10. 本篇结论)
      • [11. 简化动力学与控制参数的物理意义](#11. 简化动力学与控制参数的物理意义)

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

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

推荐阅读顺序

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

全系列知识地图

#mermaid-svg-UVnsMR63DSwRgm2N{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-UVnsMR63DSwRgm2N .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-UVnsMR63DSwRgm2N .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-UVnsMR63DSwRgm2N .error-icon{fill:#552222;}#mermaid-svg-UVnsMR63DSwRgm2N .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-UVnsMR63DSwRgm2N .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-UVnsMR63DSwRgm2N .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-UVnsMR63DSwRgm2N .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-UVnsMR63DSwRgm2N .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-UVnsMR63DSwRgm2N .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-UVnsMR63DSwRgm2N .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-UVnsMR63DSwRgm2N .marker{fill:#333333;stroke:#333333;}#mermaid-svg-UVnsMR63DSwRgm2N .marker.cross{stroke:#333333;}#mermaid-svg-UVnsMR63DSwRgm2N svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-UVnsMR63DSwRgm2N p{margin:0;}#mermaid-svg-UVnsMR63DSwRgm2N .edge{stroke-width:3;}#mermaid-svg-UVnsMR63DSwRgm2N .section--1 rect,#mermaid-svg-UVnsMR63DSwRgm2N .section--1 path,#mermaid-svg-UVnsMR63DSwRgm2N .section--1 circle,#mermaid-svg-UVnsMR63DSwRgm2N .section--1 polygon,#mermaid-svg-UVnsMR63DSwRgm2N .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-UVnsMR63DSwRgm2N .section--1 text{fill:#ffffff;}#mermaid-svg-UVnsMR63DSwRgm2N .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-UVnsMR63DSwRgm2N .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-UVnsMR63DSwRgm2N .edge-depth--1{stroke-width:17;}#mermaid-svg-UVnsMR63DSwRgm2N .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled,#mermaid-svg-UVnsMR63DSwRgm2N .disabled circle,#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:lightgray;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:#efefef;}#mermaid-svg-UVnsMR63DSwRgm2N .section-0 rect,#mermaid-svg-UVnsMR63DSwRgm2N .section-0 path,#mermaid-svg-UVnsMR63DSwRgm2N .section-0 circle,#mermaid-svg-UVnsMR63DSwRgm2N .section-0 polygon,#mermaid-svg-UVnsMR63DSwRgm2N .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-UVnsMR63DSwRgm2N .section-0 text{fill:black;}#mermaid-svg-UVnsMR63DSwRgm2N .node-icon-0{font-size:40px;color:black;}#mermaid-svg-UVnsMR63DSwRgm2N .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-UVnsMR63DSwRgm2N .edge-depth-0{stroke-width:14;}#mermaid-svg-UVnsMR63DSwRgm2N .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled,#mermaid-svg-UVnsMR63DSwRgm2N .disabled circle,#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:lightgray;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:#efefef;}#mermaid-svg-UVnsMR63DSwRgm2N .section-1 rect,#mermaid-svg-UVnsMR63DSwRgm2N .section-1 path,#mermaid-svg-UVnsMR63DSwRgm2N .section-1 circle,#mermaid-svg-UVnsMR63DSwRgm2N .section-1 polygon,#mermaid-svg-UVnsMR63DSwRgm2N .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-UVnsMR63DSwRgm2N .section-1 text{fill:black;}#mermaid-svg-UVnsMR63DSwRgm2N .node-icon-1{font-size:40px;color:black;}#mermaid-svg-UVnsMR63DSwRgm2N .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-UVnsMR63DSwRgm2N .edge-depth-1{stroke-width:11;}#mermaid-svg-UVnsMR63DSwRgm2N .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled,#mermaid-svg-UVnsMR63DSwRgm2N .disabled circle,#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:lightgray;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:#efefef;}#mermaid-svg-UVnsMR63DSwRgm2N .section-2 rect,#mermaid-svg-UVnsMR63DSwRgm2N .section-2 path,#mermaid-svg-UVnsMR63DSwRgm2N .section-2 circle,#mermaid-svg-UVnsMR63DSwRgm2N .section-2 polygon,#mermaid-svg-UVnsMR63DSwRgm2N .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-UVnsMR63DSwRgm2N .section-2 text{fill:#ffffff;}#mermaid-svg-UVnsMR63DSwRgm2N .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-UVnsMR63DSwRgm2N .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-UVnsMR63DSwRgm2N .edge-depth-2{stroke-width:8;}#mermaid-svg-UVnsMR63DSwRgm2N .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled,#mermaid-svg-UVnsMR63DSwRgm2N .disabled circle,#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:lightgray;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:#efefef;}#mermaid-svg-UVnsMR63DSwRgm2N .section-3 rect,#mermaid-svg-UVnsMR63DSwRgm2N .section-3 path,#mermaid-svg-UVnsMR63DSwRgm2N .section-3 circle,#mermaid-svg-UVnsMR63DSwRgm2N .section-3 polygon,#mermaid-svg-UVnsMR63DSwRgm2N .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-UVnsMR63DSwRgm2N .section-3 text{fill:black;}#mermaid-svg-UVnsMR63DSwRgm2N .node-icon-3{font-size:40px;color:black;}#mermaid-svg-UVnsMR63DSwRgm2N .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-UVnsMR63DSwRgm2N .edge-depth-3{stroke-width:5;}#mermaid-svg-UVnsMR63DSwRgm2N .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled,#mermaid-svg-UVnsMR63DSwRgm2N .disabled circle,#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:lightgray;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:#efefef;}#mermaid-svg-UVnsMR63DSwRgm2N .section-4 rect,#mermaid-svg-UVnsMR63DSwRgm2N .section-4 path,#mermaid-svg-UVnsMR63DSwRgm2N .section-4 circle,#mermaid-svg-UVnsMR63DSwRgm2N .section-4 polygon,#mermaid-svg-UVnsMR63DSwRgm2N .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-UVnsMR63DSwRgm2N .section-4 text{fill:black;}#mermaid-svg-UVnsMR63DSwRgm2N .node-icon-4{font-size:40px;color:black;}#mermaid-svg-UVnsMR63DSwRgm2N .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-UVnsMR63DSwRgm2N .edge-depth-4{stroke-width:2;}#mermaid-svg-UVnsMR63DSwRgm2N .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled,#mermaid-svg-UVnsMR63DSwRgm2N .disabled circle,#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:lightgray;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:#efefef;}#mermaid-svg-UVnsMR63DSwRgm2N .section-5 rect,#mermaid-svg-UVnsMR63DSwRgm2N .section-5 path,#mermaid-svg-UVnsMR63DSwRgm2N .section-5 circle,#mermaid-svg-UVnsMR63DSwRgm2N .section-5 polygon,#mermaid-svg-UVnsMR63DSwRgm2N .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-UVnsMR63DSwRgm2N .section-5 text{fill:black;}#mermaid-svg-UVnsMR63DSwRgm2N .node-icon-5{font-size:40px;color:black;}#mermaid-svg-UVnsMR63DSwRgm2N .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-UVnsMR63DSwRgm2N .edge-depth-5{stroke-width:-1;}#mermaid-svg-UVnsMR63DSwRgm2N .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled,#mermaid-svg-UVnsMR63DSwRgm2N .disabled circle,#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:lightgray;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:#efefef;}#mermaid-svg-UVnsMR63DSwRgm2N .section-6 rect,#mermaid-svg-UVnsMR63DSwRgm2N .section-6 path,#mermaid-svg-UVnsMR63DSwRgm2N .section-6 circle,#mermaid-svg-UVnsMR63DSwRgm2N .section-6 polygon,#mermaid-svg-UVnsMR63DSwRgm2N .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-UVnsMR63DSwRgm2N .section-6 text{fill:black;}#mermaid-svg-UVnsMR63DSwRgm2N .node-icon-6{font-size:40px;color:black;}#mermaid-svg-UVnsMR63DSwRgm2N .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-UVnsMR63DSwRgm2N .edge-depth-6{stroke-width:-4;}#mermaid-svg-UVnsMR63DSwRgm2N .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled,#mermaid-svg-UVnsMR63DSwRgm2N .disabled circle,#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:lightgray;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:#efefef;}#mermaid-svg-UVnsMR63DSwRgm2N .section-7 rect,#mermaid-svg-UVnsMR63DSwRgm2N .section-7 path,#mermaid-svg-UVnsMR63DSwRgm2N .section-7 circle,#mermaid-svg-UVnsMR63DSwRgm2N .section-7 polygon,#mermaid-svg-UVnsMR63DSwRgm2N .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-UVnsMR63DSwRgm2N .section-7 text{fill:black;}#mermaid-svg-UVnsMR63DSwRgm2N .node-icon-7{font-size:40px;color:black;}#mermaid-svg-UVnsMR63DSwRgm2N .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-UVnsMR63DSwRgm2N .edge-depth-7{stroke-width:-7;}#mermaid-svg-UVnsMR63DSwRgm2N .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled,#mermaid-svg-UVnsMR63DSwRgm2N .disabled circle,#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:lightgray;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:#efefef;}#mermaid-svg-UVnsMR63DSwRgm2N .section-8 rect,#mermaid-svg-UVnsMR63DSwRgm2N .section-8 path,#mermaid-svg-UVnsMR63DSwRgm2N .section-8 circle,#mermaid-svg-UVnsMR63DSwRgm2N .section-8 polygon,#mermaid-svg-UVnsMR63DSwRgm2N .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-UVnsMR63DSwRgm2N .section-8 text{fill:black;}#mermaid-svg-UVnsMR63DSwRgm2N .node-icon-8{font-size:40px;color:black;}#mermaid-svg-UVnsMR63DSwRgm2N .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-UVnsMR63DSwRgm2N .edge-depth-8{stroke-width:-10;}#mermaid-svg-UVnsMR63DSwRgm2N .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled,#mermaid-svg-UVnsMR63DSwRgm2N .disabled circle,#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:lightgray;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:#efefef;}#mermaid-svg-UVnsMR63DSwRgm2N .section-9 rect,#mermaid-svg-UVnsMR63DSwRgm2N .section-9 path,#mermaid-svg-UVnsMR63DSwRgm2N .section-9 circle,#mermaid-svg-UVnsMR63DSwRgm2N .section-9 polygon,#mermaid-svg-UVnsMR63DSwRgm2N .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-UVnsMR63DSwRgm2N .section-9 text{fill:black;}#mermaid-svg-UVnsMR63DSwRgm2N .node-icon-9{font-size:40px;color:black;}#mermaid-svg-UVnsMR63DSwRgm2N .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-UVnsMR63DSwRgm2N .edge-depth-9{stroke-width:-13;}#mermaid-svg-UVnsMR63DSwRgm2N .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled,#mermaid-svg-UVnsMR63DSwRgm2N .disabled circle,#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:lightgray;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:#efefef;}#mermaid-svg-UVnsMR63DSwRgm2N .section-10 rect,#mermaid-svg-UVnsMR63DSwRgm2N .section-10 path,#mermaid-svg-UVnsMR63DSwRgm2N .section-10 circle,#mermaid-svg-UVnsMR63DSwRgm2N .section-10 polygon,#mermaid-svg-UVnsMR63DSwRgm2N .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-UVnsMR63DSwRgm2N .section-10 text{fill:black;}#mermaid-svg-UVnsMR63DSwRgm2N .node-icon-10{font-size:40px;color:black;}#mermaid-svg-UVnsMR63DSwRgm2N .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-UVnsMR63DSwRgm2N .edge-depth-10{stroke-width:-16;}#mermaid-svg-UVnsMR63DSwRgm2N .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled,#mermaid-svg-UVnsMR63DSwRgm2N .disabled circle,#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:lightgray;}#mermaid-svg-UVnsMR63DSwRgm2N .disabled text{fill:#efefef;}#mermaid-svg-UVnsMR63DSwRgm2N .section-root rect,#mermaid-svg-UVnsMR63DSwRgm2N .section-root path,#mermaid-svg-UVnsMR63DSwRgm2N .section-root circle,#mermaid-svg-UVnsMR63DSwRgm2N .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-UVnsMR63DSwRgm2N .section-root text{fill:#ffffff;}#mermaid-svg-UVnsMR63DSwRgm2N .section-root span{color:#ffffff;}#mermaid-svg-UVnsMR63DSwRgm2N .section-2 span{color:#ffffff;}#mermaid-svg-UVnsMR63DSwRgm2N .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-UVnsMR63DSwRgm2N .edge{fill:none;}#mermaid-svg-UVnsMR63DSwRgm2N .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-UVnsMR63DSwRgm2N :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/ 进入。文章中的结论区分为"源码已实现""主机测试已验证"和"必须在实车/机构上复测"三类,便于后来者复现实验并继续改进。

第六篇:摆杆机械结构、MaxiCamPro 测量、步进电机与三层 PID

1. 滚球系统为什么是欠驱动控制

球槽只有一个可控倾角,钢球却有位置和速度两个状态。控制器不能直接给钢球施加力,只能改变槽的倾角,让重力沿槽方向产生分量。因此球位置对球杆角度的响应具有惯性和积分特性:倾角持续为正,球会不断加速;等球到目标点才把槽放平,通常已经来不及,球会依靠惯性越过目标。

这类系统与普通舵机位置控制不同,也与倒立摆不同。它不要求把不稳定杆直立,但同样需要利用速度趋势提前制动。若只用 target-position 直接输出倾角,P 小时响应慢,P 大时反复越界。加入球速度环,使控制器在接近目标且球仍高速运动时提前反倾,可以显著减小超调。

2. 机械结构是闭环的一部分

球槽约 25 cm,中心标记 O,两侧至少覆盖 ±5 cm。转轴支撑高度约 6 cm,必须保证最大倾角时槽底最低点仍满足题目高度要求,并考虑槽体挠度、钢球直径和车体振动。若半槽长 125 mm、允许端点下降约 10 mm,几何倾角上限约为 asin(10/125)≈4.6°,实际还要留安全余量。

一个自由度必须由一个明确转轴约束。普通家具合页存在轴向窜动、回差和安装不同轴问题,两只合页若不共线会卡滞,步进电机发出脉冲但球杆角度不动,最终表现为"PID 输出很大、球却反应慢"。推荐使用步进云台自带轴承或刚性转轴作为主转动副,合页只作辅助承重;摇臂和连杆两端使用可转动连接,避免过约束。

步进电机、联轴器、摇臂和支架应尽量同轴,紧固后做位置标记,便于发现松动。重件放在车体低层,摆杆转轴靠近车体几何中心,避免重心偏移导致驱动轮负载变化。相机固定在车体刚性支架上,不能随球杆一起运动;视野覆盖整个槽且连杆不遮挡球。

3. 步进驱动不能等同于位置闭环

D36A 接收 ST、DIR、EN 等控制信号,ST 上升沿产生一步,细分和电流由拨码设置。发送了多少脉冲只代表命令位置,不代表电机实际到位:加速度过大、机构卡滞、电流不足或碰到限位都会失步。因此开环步数最多用于软限位和诊断,不能作为正式球杆角度反馈。

当前正式方案考虑带 MT6816 编码器的步进电机。AB 相可提供每圈多计数反馈,PWM 提供单圈绝对角,Z 相提供每圈基准。AB 用于快速角度和角速度更新,PWM/Z 用于上电校准和一致性检查。编码器 VCC 与输出逻辑必须确认是 3.3 V,线序 GND/Z/PWM/B/A/VCC 不得凭颜色猜。

球杆角度与电机轴角度通常不是固定比例,因为摇臂---连杆机构的几何关系非线性。可以在安全范围内每隔约 1°记录一次编码器计数和实测球杆角度,建立分段线性表。控制器根据编码器计数插值得到真实角度,而不是简单乘一个常数。若最终使用无编码器步进电机,至少需要机械回零、限位开关、低加速度和周期性重新找零,但性能与故障可观测性会下降。

4. MaxiCamPro 负责测量而不是下命令

相机输出钢球位置、球杆中心和目标相关信息。典型 BALL 帧结构为 BALL,count,x,y,z,diam,...,数量后每个球包含横向、纵向、距离和直径字段。另一种正式脚本可输出球中心 CX/CY、槽中心 OX/OY 和相对偏差。无论采用哪种格式,视觉端都应该发送测量,不能直接发送"步进向上/向下"命令。

由主控计算方向的原因有三点。第一,主控知道当前目标、限位和球杆角度;第二,视觉帧存在延迟,过期方向命令可能已经反向;第三,主控可以在丢帧时执行安全降级。视觉只负责"球在哪里",控制器负责"下一步怎样动作"。

像素不能直接当毫米。相机安装完成后,在 O、+50 mm、-50 mm 处分别采样多个帧,建立像素到毫米的比例或分段映射。若槽在图像中不是竖直方向,不能只用 CY-OY,应先求槽轴单位向量,再将球心与 O 点的二维差投影到轴上。镜头畸变明显时,需要更多标定点或透视校正。

多球检测时要有目标选择规则,例如选择最接近槽中心、直径合理且连续轨迹最近的球。字段数量必须满足 2+4×count,超长帧、非法数字、全零帧和数据年龄超限都应判为无效。视觉年龄超过约 150 ms 时停止新增步进请求,持续约 500 ms 则锁存故障并失能,具体门限要结合实测帧率调整。

5. 三层串级 PID

正式控制链为:球位置误差进入位置环,输出目标球速度;目标球速度与视觉差分得到的实际球速度比较,进入速度环,输出目标球杆角度;目标角度与编码器实际角度比较,进入角度环,输出目标脉冲频率或等效力矩命令。

位置环关注最终误差,带宽最低。可写为:

text 复制代码
v_ball_ref = PID_pos(x_ref - x)

输出需要限幅,避免距离目标较远时要求过高球速。接近目标时可使用目标速度曲线或误差死区。积分只用于克服轻微槽倾斜或摩擦,不宜过大。

球速度由相邻视觉帧差分:

text 复制代码
v_ball = (x_k - x_{k-1}) / Δt

视觉噪声会被差分放大,因此需要时间戳、低通或滑动拟合。速度环计算目标倾角:

text 复制代码
theta_ref = PID_vel(v_ball_ref - v_ball) + theta_ff

目标倾角限制在机械安全范围,例如初期 ±2~4°。接近目标而球仍高速前进时,速度误差会使 theta_ref 反向,实现提前制动。

角度内环根据编码器反馈输出目标脉冲频率:

text 复制代码
step_rate = PID_angle(theta_ref - theta)

脉冲频率还要经过最大频率、加速度、方向建立时间和软限位。角度环带宽最高,应先独立调好;如果角度跟不上,外层再聪明也无效。三层都要有抗饱和:角度已经到限位时,速度环和位置环不能继续积分。

6. 调参顺序

第一阶段不放球,只调角度环。给出 -1°、0°、+1° 等小阶跃,观察实际角度、超调、稳定时间和编码器方向。先低脉冲频率、低加速度,确认无失步、无卡滞和限位有效,再增加速度。角度环不稳定时禁止进入下一阶段。

第二阶段放球但固定目标在中心,只调球速度环。可人工给球一个小扰动,观察控制器是否产生反向倾角并减速。位置环暂时弱化或关闭,避免两个外环互相掩盖。球速估算噪声过大时先处理视觉滤波,不要用更大 D 硬压。

第三阶段调位置环,从小位移开始,例如 ±1 cm,再逐步扩大到 ±5 cm。先调 P 使球能到目标,再加入速度环制动,最后用很小积分消除偏置。每次记录到达时间、首次越界、最大超调、稳定时间和最终误差。5 s 任务应从离开 O 开始连续计时,贯穿 +5 cm 和 -5 cm 两段,不能每段重新计时。

7. 到达判定和任务状态机

任务状态可设为 IDLE、HOMING、WAIT_CENTER、MOVE_POSITIVE、SETTLE_POSITIVE、MOVE_NEGATIVE、SETTLE_NEGATIVE、DONE、FAULT。进入每个状态时重置必要的 PID 历史和计时器。到达 +5 cm 不只要求 |e|≤1 cm,还要求 |v_ball| 小于阈值并持续约 200~300 ms;否则球只是穿过误差带。

从 +5 cm 折返时,不应瞬间给最大反向角。位置环会产生反向目标速度,速度环根据当前正速度给出更强制动,再逐渐加速向 -5 cm。机械角度、球速和视觉年龄全程受到安全监控。总超时、回零超时、限位、编码器反向、命令有脉冲但编码器不动,都进入 FAULT。

8. 车体姿态前馈

小车加速和转弯会改变球的等效重力方向。摆杆主控可以接收小车 MPU6050 的车体倾角或角速度,加入目标倾角前馈:

text 复制代码
theta_ref = PID_vel(...) + Kf_car · car_angle

前馈符号必须通过实验确认,例如小车右转时球向哪侧滚,球槽正角定义又是哪一侧抬高。前馈只补偿可预测扰动,不替代球位置闭环。Kf 过大会在 IMU 噪声或路面颠簸时主动激励球,应从零逐步增加,并分别记录有/无前馈的误差峰值。

双主控通信传输姿态时要带时间戳或序号。过期姿态不能无限使用,通信断开时前馈回零,滚球闭环仍根据视觉工作或安全停机。小车的急停事件最好提前通知摆杆主控,使其把槽回到安全角并准备承受惯性,而不是急停后才被视觉误差被动拉回。

9. 与往年摆杆、云台和球板题的比较

往年云台题的目标通常是角度或光点,执行器位置与被控量关系相对直接;本题钢球有惯性,球杆角度只是加速度输入。传统位置环直接控制舵机角度的方法在低速演示中可能可用,但很难同时满足快速与低超调。增加球速度环是本题相对普通云台控制的重要区别。

与二维球板题相比,本题只有一个自由度,建模更简单,但车体本身在运动,扰动更强。与倒立摆相比,球杆系统不要求维持不稳定平衡点,但视觉延迟通常更大,摩擦和球槽几何更难精确建模。因此工程上采用串级 PID、限幅、标定和前馈,比一开始追求复杂模型控制更容易在比赛时间内落地。

10. 本篇结论

滚球控制能否成功,首先取决于机械转轴、回差、限位和编码器反馈,其次是视觉标定与延迟,最后才是 PID 数值。三层控制把"到位置""控制球速""跟踪球杆角度"分开,使每层可独立验证。MaxiCamPro 提供测量,步进编码器提供执行反馈,状态机提供时序和安全,车体 IMU 提供前馈。只有这些环节都有证据,静止 ±5 cm 和运动中稳定才具备可重复性。

11. 简化动力学与控制参数的物理意义

在小倾角下,沿槽方向的重力分量近似为 g·theta,球的加速度还受滚动惯量和摩擦影响,可粗略写成 x_ddot = K·theta - c·x_dot。这说明倾角主要控制加速度,而不是位置;速度环的存在具有明确物理意义。K 与钢球半径、转动惯量、槽形和摩擦有关,不必精确建模也能通过小倾角阶跃实验估计响应方向和数量级。

位置环输出上限决定最大目标球速,速度环输出上限决定最大安全倾角,角度环输出上限决定最大脉冲频率。三层限幅应从内到外一致:如果机械只允许 ±4°,速度环必须在此范围内;若角度内环在某步频以上必然失步,外环不能持续要求更快。抗饱和应把"下层已饱和"的信息反馈给上层冻结积分。

摩擦会造成中心附近死区。可用很小积分或静摩擦补偿,但补偿必须随球速和方向谨慎启用,否则会造成抖动。球槽若有固定倾斜,可以在标定后加入零位偏置;若偏置随机构位置变化,则说明几何或装配问题,应优先修机械。用控制器长期对抗结构松动,参数会随时间漂移。

对于更高阶方案,可以尝试状态反馈、LQR 或模型预测控制,但前提是球位置、球速度和球杆角度可可靠估计。比赛时间有限时,三层 PID 的优势是每层含义直观、可分步调试、易于加入限位和故障。高级算法不能绕过视觉延迟、回差和失步这些真实边界。

相关推荐
振南的单片机世界2 小时前
1MΩ内阻+10pF寄生电容=信号“低通谋杀”
arm开发·stm32·单片机·嵌入式硬件
十月的皮皮3 小时前
STM32从零到量产开发:四路继电器工业控制模块开发 -上位机主窗口设计说明
c语言·stm32·单片机·stm32cubemx
wuyk5554 小时前
第1章:无刷电机核心原理与运行机制
c语言·开发语言·stm32·单片机·嵌入式硬件·机器学习
科芯创展4 小时前
XZ9164,16V,0.8A稳压LDO芯片
单片机·嵌入式硬件
WWJA王文举4 小时前
HAL库、标准库、LL库和寄存器开发有什么区别?STM32四种开发方式一次讲透
stm32·单片机·嵌入式硬件
0x3F(小茶)4 小时前
FreeRTOS 系统配置
c语言·单片机·mcu
wengqidaifeng5 小时前
2026 年电赛(TI 杯)H 题:完整测评流程、失败案例复盘、比赛策略与开源交付
c语言·单片机·嵌入式硬件
0x3F(小茶)5 小时前
FreeRTOS 任务相关 API 函数
c语言·arm开发·单片机
学生哥-_-6 小时前
STC8H1K08单片机在Keil环境下各外设的配置及使用方法
单片机·嵌入式硬件·mongodb