项目简介
一维球杆平衡系统(Ball & Beam)是 2026 电赛参赛作品:一颗小球放在一根可绕支点转动的杆上,系统通过摄像头实时追踪小球位置,经卡尔曼滤波与延迟补偿后,驱动 X42S 闭环步进电机摆动杆的角度,把小球稳定在杆的中点(或任意目标位置)。
控制对象本质上是不稳定、二阶、带纯滞后的系统——小球在杆上会一直滚,没有任何自稳定能力,全靠闭环控制"救"回来。
系统架构
USB 摄像头 → OpenCV 视觉检测 → 卡尔曼滤波(+速度估计)
↓
延迟补偿(预测球未来位置)
↓
PD / SMC 滑模控制器 → 目标杆角度
↓
逆运动学 IK(杆角 → 电机角)
↓
CAN 总线(CANable/slcan)→ X42S 闭环步进电机 → 摆杆
整套视觉+控制在 PC / ARM 板(Orange Pi RK3588S)上跑,通过 USB-CAN 收发器直控电机,不经过下位机,把通信延迟压到最低。
硬件清单
| 部件 | 型号 | 作用 |
|---|---|---|
| 主控 | Orange Pi 5 Plus(RK3588S) | 视觉检测 + 控制运算 |
| 电机 | 张大头 ZDT X42S 第二代闭环步进 | 摆动杆(CAN 总线控制) |
| CAN 收发器 | CANable(slcan 固件) | USB ↔ CAN 桥接 |
| 视觉 | USB 摄像头 | 小球位置检测 |
| 执行机构 | 自制连杆 + 球杆 | 电机旋转 → 杆摆动 |
视觉部分
- 检测:ROI 裁剪 + 二值化 + Canny 边缘 + 霍夫圆检测,锁定小球圆心,换算成杆坐标系的毫米位置
- 滤波:卡尔曼滤波同时估计位置与速度,抑制检测噪声
- 延迟补偿:摄像头采集+处理有约 30~50ms 滞后,用估计的速度向前预测,补偿纯滞后环节——这是能否稳住的关键细节之一
控制部分
实现了两种控制器,可用编译开关切换:
1. PD 控制(线性)
围绕标定出的平衡点电机角做线性化:杆角误差 → 电机角修正量。简单可靠,是 baseline。
2. SMC 滑模控制(非线性)
设计了滑模面 s = c·e + ė,配合边界层饱和函数抑制抖振。相比 PD,对参数摄动和外部扰动(比如手拨一下球)鲁棒性明显更好。调参顺序:先调 c 让系统有明显动作,再调增益 K 和边界层厚度 δ 抑制抖动。
3. 开环扫描模式(SCAN_5CM)
除平衡外还实现了 ±5.5cm 自动往返扫描:球速低于 1mm/s 即刻切换阶段,用于电赛要求的"小球定点巡回"指标。
踩过的坑(血泪经验)
- 电机回零方向和工作方向绝不能搞反——回零用顺时针撞限位设零点,工作用逆时针负角度区间 [-80°, 0°],方向互换会直接撞坏机械结构
- 不要用 SET_ZERO 指令设零点,掉电丢失;用限位开关机械回零才可靠
- 平衡点电机角必须现场标定(实测为 -36.6°),重心装歪一点就全变
- SMC 增益太低时电机会"装死"不动——先怀疑增益,再怀疑别的
代码仓库
项目已完整开源(C++ / CMake,Windows & Linux 双平台):
🔗 GitHub:FlydreamKM/ball-beam-project
├── vision_pc/main.cpp ← 视觉追踪原型(检测+卡尔曼)
├── vision_pc/ball_balance.cpp ← 视觉+CAN 直控闭环(核心)
├── vision_pc/ik_sweep.cpp ← 开环扫描/IK 验证工具
├── X_V2.c / X_V2.h ← X42S 电机 CAN 协议库
└── vision_pc/MANUAL.md ← 完整使用手册
Linux 一键构建运行:
cd vision_pc
./build.sh --smc # 构建 SMC 版本
./run_smc.sh # 启动
欢迎 Star & 交流~有问题可以提 Issue。