OpenMV+STM32电赛小车跟踪实战:从硬件选型到PID调参的避坑指南
去年参加电子设计竞赛时,我们团队选择了小车跟踪这个颇具挑战性的题目。本以为凭借OpenMV的图像识别能力和STM32的控制逻辑,可以轻松实现目标,没想到从硬件组装到算法调试,处处是坑。这篇文章将分享我们团队在项目开发中遇到的实际问题及其解决方案,希望能帮助后来者少走弯路。
1. 硬件选型与搭建:那些容易被忽视的细节
1.1 摄像头选择与安装
OpenMV作为核心视觉传感器,选型和安装直接影响跟踪效果。我们最初使用OpenMV4 H7版本,发现其处理速度虽快,但在强光环境下容易出现过曝问题。后来改用带全局快门的OpenMV4 Plus,配合偏振滤镜,显著改善了室外环境下的识别稳定性。
关键安装要点:
- 摄像头高度建议在15-20cm之间,俯角约30度
- 使用3D打印支架固定,避免振动导致的图像模糊
- 在镜头周围加装遮光罩,减少环境光干扰
注意:OpenMV的镜头畸变校正常被忽视,我们使用如下代码进行实时校正,效果显著提升:
python复制import sensor, image, math
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
# 镜头畸变校正参数
def undistort(img):
k1 = -0.15 # 径向畸变系数
k2 = 0.3
cx = img.width() / 2
cy = img.height() / 2
for y in range(img.height()):
for x in range(img.width()):
r = math.sqrt((x - cx)**2 + (y - cy)**2) / max(cx, cy)
dx = int((x - cx) * (1 + k1 * r**2 + k2 * r**4))
dy = int((y - cy) * (1 + k1 * r**2 + k2 * r**4))
if 0 <= dx + cx < img.width() and 0 <= dy + cy < img.height():
img.set_pixel(x, y, img.get_pixel(dx + cx, dy + cy))
1.2 电机驱动方案对比
我们测试了三种常见电机驱动方案,性能对比如下:
| 驱动芯片 | 最大电流 | PWM频率 | 发热量 | 价格 |
|---|---|---|---|---|
| L298N | 2A | 5kHz | 高 | 低 |
| TB6612 | 3.2A | 100k |
