共计 2283 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点
智能车竞赛中最让人头疼的往往是实时性问题。去年参赛时,我们遇到了几个典型问题:

-
摄像头采样延迟 :使用 OV7725 摄像头时,图像传输到处理器需要约 30ms,加上处理时间,总延迟经常超过 50ms。在高速过弯时,这种延迟会导致控制指令严重滞后。
-
电机控制抖动 :传统 PID 控制在低速时会出现明显的 ” 咯噔 ” 现象,特别是在起停阶段,这是由 PWM 分辨率不足和机械间隙共同导致的。
-
算力瓶颈 :在 STM32F4 平台上,运行完整的 OpenCV 图像处理流水线(Canny 边缘检测 +Hough 变换)需要近 80ms,根本无法满足实时性要求。
技术方案对比
我们对比了两种技术路线:
- 传统计算机视觉方案
- 基于 OpenCV 的流水线处理
- 平均耗时:76ms/ 帧(STM32F407@168MHz)
- 优势:无需训练数据,可解释性强
-
劣势:对光照变化敏感,弯道识别率仅 68%
-
轻量化深度学习方案
- 采用 YOLOv4-Tiny 改进版(输入尺寸 160×120)
- 平均耗时:22ms/ 帧(STM32H743@480MHz)
- 优势:弯道识别率达 94%,抗光照干扰能力强
- 劣势:需要 2000+ 标注图像进行训练
核心实现
模型量化与转换
使用 TensorFlow Lite 的 Post-training 量化工具:
import tensorflow as tf
# 加载原始模型
model = tf.keras.models.load_model('yolov4_tiny.h5')
# 转换器配置
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_types = [tf.int8] # 8 位整数量化
# 生成量化模型
tflite_model = converter.convert()
with open('yolov4_tiny_quant.tflite', 'wb') as f:
f.write(tflite_model)
关键参数说明 :
– Optimize.DEFAULT 启用默认优化(包含权重量化)
– supported_types=[tf.int8] 指定 8 位整数量化,相比浮点模型体积缩小 4 倍
嵌入式部署
基于 CMSIS-NN 加速库的部署流程:
- 使用 STM32CubeMX 配置硬件外设
- 分配 DTCM 内存:64KB 用于模型输入 / 输出
-
开启硬件 CRC 校验(模型校验需要)
-
内存占用分析(以 160×120 输入为例):
- 模型体积:1.2MB(Flash 存储)
-
运行时内存:184KB(包含中间激活值)
-
关键性能指标(Keil MDK-ARM 5.37 环境):
- 单帧推理时间:18.6ms(开启硬件 FPU)
- CPU 负载:平均 67%(含图像预处理)
性能优化技巧
双缓冲区 DMA 策略
在 camera.c 中实现:
// 定义双缓冲区
uint8_t frame_buffer[2][CAMERA_HEIGHT][CAMERA_WIDTH];
volatile uint8_t active_buf = 0;
// DMA 传输完成回调
void HAL_DMA2D_TransferCpltCallback(DMA2D_HandleTypeDef *hdma2d)
{
active_buf ^= 1; // 切换缓冲区
// 启动新采集(不影响当前处理)CAMERA_Start_DMA(&hdcmi, frame_buffer[active_buf]);
}
优势 :
– 图像采集与处理并行进行
– 实测可减少约 15ms 等待时间
定点数优化
将浮点运算转换为 Q 格式定点数(以赛道曲率计算为例):
// 原始浮点版本
float curvature = 2.0f * delta_y / (delta_x * delta_x);
// Q15 定点优化版
int32_t delta_y_q15 = (int32_t)(delta_y * 32768.0f);
int32_t delta_x_q15 = (int32_t)(delta_x * 32768.0f);
int32_t curvature_q15 = (2 * delta_y_q15) / ((delta_x_q15 * delta_x_q15) >> 15);
性能提升 :
– 运算时间从 56μs 降至 12μs
– 精度损失小于 0.5%
实战避坑指南
电磁干扰应对
遇到过的典型问题:
- 现象:电机启动时摄像头图像出现横纹
- 解决方案:
- 在电机电源线加装磁环
- 摄像头数据线使用双绞线
- 软件上增加中值滤波(3×3 kernel)
量化精度补偿
当发现 8 位量化导致弯道识别率下降 8% 时,我们采用:
- 校准集增强:在赛道上采集 200 张不同光照条件的图像
- 动态范围调整:手动设置量化范围(而非自动计算)
- 关键层豁免:对最后 3 个卷积层保持 FP16 精度
优化后量化模型精度损失控制在 2% 以内。
工业场景迁移思考
比赛技术向 AGV 落地的关键改进点:
- 环境适应性增强 :
- 增加红外传感器辅助定位
-
采用多模态融合(视觉 + 激光雷达)
-
可靠性提升 :
- 实现故障自检(看门狗 + 心跳包)
-
增加急停硬件回路
-
通讯协议标准化 :
- 改用 CAN 总线替代串口通信
- 支持 Modbus-RTU 协议
通过参赛积累的嵌入式 AI 经验,可以快速搭建工业级 AGV 的感知 - 决策 - 控制闭环系统,但需要特别注意功能安全认证(如 ISO 13849)的要求。
结语
从实验室到赛道的实践让我深刻体会到:嵌入式 AI 开发就是不断在性能、精度和功耗之间寻找平衡点。建议新手先从 YOLOv4-Tiny 这类轻量模型入手,逐步掌握量化部署的核心技巧。下次参赛我们计划尝试知识蒸馏技术,争取在保持实时性的前提下将识别率提升到 97% 以上。
