第一次接触迷宫寻宝小车项目时,我和团队花了整整两周时间在实验室地板上画迷宫草图。作为典型的嵌入式综合项目,它完美融合了机械结构、电路设计、自动控制和机器视觉四大技术模块。我们最终选择的二驱三轮结构看似简单,实测中发现这种架构在急转弯时容易因重心偏移导致侧翻,后来通过在底盘后部加装配重块解决了这个问题。
电机选型上,MG513光电编码器电机配合TB6612驱动模块的方案性价比极高。这个组合有三个实战优势:首先是驱动模块自带5V/3.3V稳压输出,可以直接给OpenMV和STM32供电;其次是支持PWM调速响应速度达到微秒级;最重要的是TB6612的散热性能优异,在连续三小时满负荷测试中温度始终保持在50℃以下。这里有个坑要注意:电机电源必须与控制系统电源隔离,我们最初因为共地问题导致摄像头图像出现波纹干扰。
使用STM32F103ZET6作为主控芯片时,几乎耗尽了所有通用定时器资源。在电机控制方面,我们封装了基础运动函数库:
c复制// 电机模式设置函数
void Motor_SetMode(Motor_TypeDef motor, uint8_t mode) {
GPIO_WriteBit(motor.Port, motor.Pin1, (mode & 0x01) ? Bit_SET : Bit_RESET);
GPIO_WriteBit(motor.Port, motor.Pin2, (mode & 0x02) ? Bit_SET : Bit_RESET);
}
三环PID控制是车辆稳定运行的关键。速度环采用增量式PID算法,参数整定过程充满波折——最初Ki值设得过大导致电机剧烈振荡,后来通过Ziegler-Nichols法重新整定。实测数据显示,加入PID控制后直线行驶偏移量从±15cm降低到±2cm。
OpenMV4 Plus的MicroPython开发环境让视觉算法开发变得异常高效。在迷宫边界识别中,我们创新性地采用了双ROI检测策略:
python复制# 左右ROI区域定义
roi_left = (0, 120, 60, 30) # (x,y,w,h)
roi_right = (180, 120, 60, 30)
图像处理流水线包含三个关键步骤:首先用Laplacian算子增强边缘,然后进行自适应阈值二值化,最后通过线性回归拟合巡线。实测帧率能达到35fps,完全满足实时性要求。有个值得分享的调优经验:将摄像头焦距调整到15cm时,识别精度比默认的30cm配置提升40%。
Dijkstra算法在迷宫环境中展现出惊人效率。我们对其做了两点优化:首先是建立动态权重矩阵,当检测到死胡同时自动调高该路径权重;其次是实现分段规划策略,只计算当前位置到下一个目标点的最优路径。实测表明,这种方案比全局规划节省60%的计算时间。
路径坐标转换采用简单的线性映射:
python复制def pixel_to_map(x, y):
map_x = int(x * 10 / 160) # 将160像素宽度映射到10个地图单元
map_y = int(y * 10 / 120)
return (map_x, map_y)
JY61陀螺仪的数据通过DMA串口接收,极大减轻了CPU负担。角度环PID控制中,我们发现积分项累积误差会导致车辆"漂移",最终解决方案是加入误差限幅:
c复制if(angle_err > 300) angle_err = 300;
if(angle_err < -300) angle_err = -300;
串口通信协议设计为自定义二进制格式,包含帧头、数据区和校验和。这种格式比JSON等文本协议传输效率提升5倍以上,特别适合实时控制系统。
整个系统包含三个独立供电模块:12V锂电池组驱动电机,5V稳压模块供给主控板,3.3V LDO为传感器供电。在初期测试中,电机启停会导致电压骤降引发单片机复位,后来在电源输入端加入4700μF电解电容后问题彻底解决。
通过ESP8266模块搭建的WiFi调试通道堪称救命稻草。我们开发了简易的网页控制台,可以实时查看传感器数据和摄像头画面。这个设计在赛场调试时派上大用场——当发现路径规划异常时,直接通过网页调整参数就解决了问题。
比赛现场的光照条件往往与实验室差异巨大。我们准备了四套预设参数:强光、弱光、日光灯和混合光。上场前用色卡进行快速校准,整个过程不超过2分钟。这个小技巧让我们的识别准确率始终保持在95%以上。
机械结构方面,建议准备多种硬度的轮胎。在光滑的赛道上使用软质硅胶轮胎,摩擦系数比硬质轮胎提高0.3左右,显著减少打滑现象。这个小改动让我们的最快单圈成绩提升了15%。