1. 项目概述
去年带队参加第25届中国大学生工程实践与创新能力竞赛智能救援赛道的经历,让我对智能搬运小车的开发有了全新的认识。我们的团队最终斩获省一等奖和国赛一等奖,这套方案的核心在于将视觉识别与运动控制完美结合,实现了对彩色球体的精准抓取和定点投放。整个系统基于STM32F103ZET6主控,配合MaixCAM视觉模块和全向轮底盘,在2.4m×2.4m的竞赛场地中展现了出色的稳定性和定位精度。
特别提示:本文分享的所有技术方案均为竞赛场景优化方案,实际工业应用需考虑更多环境因素。文中提到的设备选型仅供参考,具体采购时请注意型号匹配。
2. 核心设计思路
2.1 系统架构设计
我们的智能救援小车采用三层控制架构:
- 感知层:MaixCAM负责视觉识别,HWT101陀螺仪提供姿态基准,VL53L1X激光测距模块辅助定位
- 决策层:STM32F103ZET6实现PID闭环控制算法和状态机逻辑
- 执行层:三组1:30带编码器直流减速电机驱动全向轮
这种架构的优势在于:
- 视觉处理与运动控制分离,避免单一处理器过载
- 全向轮底盘可实现任意方向平移,特别适合狭小空间作业
- 编码器+陀螺仪的双重反馈确保定位精度
2.2 关键器件选型分析
主控选择:
STM32F103ZET6的144引脚封装提供了充足的GPIO资源,内置硬件浮点运算单元能高效处理PID计算。实测表明,在同时运行3路电机PID控制+1路角度环时,CPU占用率仍能保持在60%以下。
视觉模块对比:
我们测试过树莓派4B+OpenCV的方案,在运行YOLOv3-tiny时帧率仅8-10FPS,而MaixCAM运行自定义模型可达30FPS。关键差异在于:
- MaixCAM内置K210芯片专为视觉优化
- 配套的NNCase工具链支持模型量化压缩
- 直接输出目标坐标信息,减少主控计算负担
电机驱动方案:
采用DRV8833双H桥驱动模块,PWM频率设置为20kHz以避免可闻噪声。编码器信号通过STM32的定时器输入捕获模式采集,500线编码器经4倍频后单圈分辨率达2000脉冲。
3. 视觉识别系统实现
3.1 目标检测模型训练
使用MaixPy IDE进行模型训练,具体流程如下:
-
数据采集:
- 在比赛场地不同光照条件下拍摄500+张样本图片
- 包含各颜色球体在不同位置、角度的图像
- 添加20%的负样本(无目标场景)
-
标注与增强:
python复制# 数据增强配置示例 augmentations = [ RandomRotate(degrees=15), RandomZoom(scale=(0.8, 1.2)), RandomBrightness(delta=30), RandomContrast(lower=0.7, upper=1.3) ] -
模型训练:
- 基础网络选择MobileNetV1
- 输入分辨率设为224×224
- 训练50个epoch后mAP达到0.92
3.2 坐标转换与通信协议
MaixCAM与STM32通过串口通信,协议设计如下:
python复制# 数据打包格式(小端模式)
struct payload {
int32_t center_x; // 目标中心X坐标
int32_t center_y; // 目标中心Y坐标
int32_t width; // 目标宽度
int32_t class_id; // 类别ID
};
坐标映射关系:
- 图像坐标系原点在左上角
- X轴向右为正,范围0-320
- Y轴向下为正,范围0-240
- 当无目标时发送全零数据包
4. 运动控制系统详解
4.1 全向轮运动学模型
三轮全向底盘的运动学方程:
code复制[ v_x ] [ -sin(60°) cos(60°) R ] [ ω1 ]
[ v_y ] = [ -sin(60°) -cos(60°) R ] [ ω2 ]
[ ω_z ] [ 0 0 R ] [ ω3 ]
其中:
- v_x, v_y:车体坐标系下的平移速度
- ω_z:旋转角速度
- R:轮子中心到车体中心的距离
- ω1,ω2,ω3:各轮转速
4.2 多环PID控制实现
速度环参数整定:
- 先置Kp=1.0, Ki=0, Kd=0
- 给阶跃信号,观察响应曲线
- 增大Kp直到出现轻微振荡
- 加入Kd抑制振荡,典型值0.1-0.3
- 最后加入Ki消除静差,取值0.01-0.05
视觉伺服环调试技巧:
- 先调试X轴方向PID
- 设定目标位置在图像中心(160,120)
- 从低速开始测试,逐步提高响应速度
- 最终参数:Kp=0.8, Kd=0.15, Ki=0
4.3 绝对定位算法
安全区定位流程:
- 上电时记录初始角度为0°
- 通过陀螺仪积分获取当前绝对角度
- 根据编码器脉冲计算行驶距离
- 结合场地几何关系解算目标位置
c复制// 位置环计算示例
void PositionLoop() {
// 角度偏差计算
float angle_err = 90.0f - current_angle;
// 距离偏差计算
float dist_x = 120.0f - current_x;
float dist_y = 60.0f - current_y;
// PID计算
angle_output = angle_pid(angle_err);
dist_x_output = dist_pid(dist_x);
dist_y_output = dist_pid(dist_y);
// 运动合成
set_omni_speed(dist_x_output, dist_y_output, angle_output);
}
5. 系统集成与调试
5.1 机械结构优化要点
-
抓取机构设计:
- 采用双摆臂结构,舵机驱动
- 末端加装硅胶垫增大摩擦
- 抓取力度通过PWM占空比控制
-
重心配置原则:
- 电池尽量靠近底盘中心
- 摄像头安装高度距地面15-20cm
- 整体重心投影应在三轮构成的三角形内
5.2 电气系统布局建议
- 电机驱动线路与信号线路分开走线
- 编码器信号线使用双绞线并加磁环
- 为STM32和MaixCAM配置独立稳压电源
- 所有接插件采用防反插设计
5.3 现场调试经验
-
光照适应性调整:
- 准备不同色温的补光灯
- 在比赛场地实测时调整白平衡
- 对红色物体特别增加饱和度阈值
-
抗干扰措施:
- 电机PWM线与编码器线正交布置
- 串口通信增加CRC校验
- 关键变量使用volatile声明
-
故障应急方案:
- 心跳包监测系统状态
- 看门狗定时器设置1秒超时
- 重要参数保存在备份寄存器
6. 性能优化技巧
6.1 实时性提升方法
-
中断优先级配置:
- 编码器接口:最高优先级
- 串口接收:次高优先级
- 定时器中断:普通优先级
-
计算加速技巧:
- 使用STM32硬件FPU
- PID计算采用Q15格式定点数
- 预先计算三角函数值建表
6.2 运动平滑优化
-
速度规划算法:
c复制// S曲线速度规划 void speed_planning(float target) { static float current = 0; float accel = 0.2f; // 加速度系数 if(fabs(target - current) < accel) { current = target; } else { current += (target > current) ? accel : -accel; } return current; } -
动态PID调节:
- 根据误差大小自动调整参数
- 大误差时增大Kp加快响应
- 小误差时增大Kd抑制振荡
7. 常见问题解决方案
7.1 视觉识别不稳定
现象:目标坐标跳动严重
- 检查镜头焦距是否合适
- 增加检测结果滤波算法(如移动平均)
- 调整模型置信度阈值
现象:特定颜色识别率低
- 在HSV色彩空间重新标注样本
- 增加该颜色的数据增强幅度
- 检查环境光是否导致色偏
7.2 运动控制异常
现象:全向轮打滑
- 检查轮胎表面清洁度
- 降低加速度参数
- 增加编码器采样频率
现象:角度漂移严重
- 陀螺仪安装是否稳固
- 校准零偏电压
- 增加磁力计辅助校正
7.3 系统通信故障
现象:串口数据丢包
- 降低波特率(建议115200bps)
- 缩短通信线缆长度
- 添加软件重传机制
现象:控制响应延迟
- 检查FreeRTOS任务优先级
- 优化内存拷贝操作
- 使用DMA传输数据
这套系统经过多次比赛验证,在2.4m×2.4m的标准场地中,平均完成时间可控制在45秒以内,抓取成功率达98%以上。最大的收获是认识到简单算法的精心调校往往比复杂算法更可靠,特别是在实时控制系统中。建议后续团队可以尝试融合更多传感器数据,比如添加ToF摄像头实现三维定位,应该还能进一步提升性能上限。
