跳转至

Smart Car

全国大学生智能汽车竞赛

回顾本科期间参与的智能车比赛,这是我大学阶段投入时间和精力最多的一项竞赛。 整个过程收获颇丰,不仅显著提升了动手能力,也加深了我对专业知识在实际工程中的理解与应用。

背景

全国大学生智能汽车竞赛是一个典型的工程实践项目,涵盖理论设计、实际制作、整车调试以及现场比赛等多个环节。 我当时参与的是四轮组,赛道包含斑马线、坡道、路障、圆环、断路(电磁引导)、十字路口以及各类弯道等元素。

在系统实现上,智能车通过摄像头与电磁传感器获取赛道信息,经由算法完成路径识别与运动控制,最终实现车辆在复杂赛道环境下的自主行驶。 组委会规定了指定芯片系列,因此所有的算法逻辑都是非 AI 的,需要通过算法来实现路径识别和运动控制。

大三阶段刚刚学习完大部分专业课程,面对这样工程性较强的项目,实际是比较吃力的。 队伍由三人组成, 绝大部分队伍都是由不同专业的同学组成,分别负责硬件和软件部分。 事实上,这类比赛也存在不少“捷径”,例如直接复用往届代码或“祖传方案”,可以显著降低开发成本、缩短周期。

但当时我选择了一条更“慢”的路径——从零开始构建整个系统。从学习 PCB 设计、电路板焊接,到单片机编程与整车控制逻辑实现,几乎每一个环节都亲自参与。这种选择虽然增加了前期投入,但也让我对整个系统有了更加完整而深入的理解。

参与整个开发流程

我参与了智能车从设计到实现的完整开发流程,包括:

  • 硬件:PCB 绘制、焊接与电路调试
  • 机械:车体结构搭建与调整
  • 软件:控制算法设计与系统调试(三人组队,部分算法开发和调参工作是和队友共同完成)

侧面照片
仅存一张中后期车身脏兮兮的侧面照片


硬件 PCB 设计

硬件设计以 RT1021 为核心主控,配备灰度摄像头、电磁传感器、陀螺仪、电机驱动等多种外设。

最终版本

中期版本的设计是三个独立模块:主控板、电磁传感器模块与电机驱动板,便于系统集成与维护。 最终版本把主控板和电机驱动板合并了,集成度更高。

主控板实体图
主控板实体图


主控板

主控板以 RT1021 为核心,包含最小系统及外围核心电路,实现系统控制与数据处理。同时提供了电源,传感器,电机驱动,通信,人机交互,执行等模块。

模块 功能描述
主控芯片 基于 RT1021 芯片,包含最小系统及外围核心电路,实现系统控制与数据处理
电源系统 提供稳定供电,包含多路电源管理,实现 12V 转 5V 和 3.3V 输出
传感器 获取环境与姿态信息,包括灰度摄像头、电磁传感器、陀螺仪及编码器等
电机驱动 实现电机驱动控制,采用 H 桥结构,通过驱动芯片控制 MOS 管的导通与关断,实现电机的正反转;同时利用 PWM 信号调节导通占空比,从而控制电机转速
通信系统 实现数据传输与调试,支持串口、I2C、SPI 等通信方式
人机交互 支持参数配置与状态显示,包括液晶屏、按键及 LED 指示灯
执行系统 控制电机、舵机及蜂鸣器等执行部件

主控模块设计原理图

主控板设计原理图

PCB 3D

PCB


电磁传感器模块

电磁传感器模块用于获取赛道中间的磁场信息,采用五通道模拟信号调理电路。其信号路径为:输入信号先经滤波,再由运算放大器进行可调增益放大,随后经过低通滤波后输出至 ADC 接口。同时,电路板上还配备了电源去耦与状态指示功能,以提升供电稳定性和使用便捷性。

电磁传感器模块原理图

电磁传感器模块PCB 3D

电磁传感器模块PCB


机械结构

机械结构设计以紧凑、稳定和易于维护为核心目标。

车身顶部

结构部件(从前到后顺序) 功能描述
电磁传感器模块 断路引导
干簧管 检测终点
摄像头模块 赛道识别
测距模块 避障
前轮舵机系统 转向
主控板 核心控制
电池 供电和配重
编码器 速度反馈
后轮电机系统 驱动

软件编程

从软件控制的角度来看,小车程序本质上是在持续通过主程序和中断的方式读取各类传感器数据,并根据状态判断去驱动执行机构。可以将整个系统简单拆成两部分:

  • 输入数据


    • 摄像头图像,用于赛道识别与路径规划
    • 电磁信号,用于断路引导循迹
    • 陀螺仪姿态,用于坡道识别
    • 编码器,用于速度反馈
    • 测距模块中断信号,用于路障检测
    • 干簧管中断信号,用于终点识别
    • 拨码开关、按键等状态,用于模式选择和交互
    • 电池电压模拟量,用于电量计算和辅助速度控制
  • 输出控制


    • 左右电机 PWM,用于控制驱动力
    • 前轮舵机 PWM,用于控制转向角
    • 串口输出,用于调试和数据通信
    • 液晶屏显示,用于调试和显示各类信息
    • LED 指示灯,用于主控板状态指示
    • 蜂鸣器,用于报警和提示

图像处理

图像处理模块的核心任务是识别赛道边界,并据此计算赛道中心线,从而为路径规划与运动控制提供依据。 在实际实现中,通常流程包括:

graph LR
    A[图像采集] --> B[边界提取]
    B --> C[中线计算]
    C --> D[输出控制参考]

图像处理的中心线是什么?

图像处理中计算得到的赛道中心线本质上是一个测量值(实际值)。控制系统的目标并不是“跟随这条线”,而是让图像中的赛道中心线与图像的几何中线重合

换句话说,可以从控制角度理解为:不是让车去“找路”,而是通过调整车辆姿态,让“路”始终保持在摄像头画面的正中央。 这种视角转换,本质上是将路径跟踪问题转化为一个偏差最小化问题(视觉误差闭环控制)。

同时,在实际应用中还需要重点处理以下问题:

  • 镜头畸变(Distortion):摄像头带来的径向/切向畸变会影响边界识别精度
  • 透视变换(梯形矫正):远近导致的尺度变化,需要通过透视变换进行俯视化处理
  • 噪声与光照变化:影响边界提取稳定性

这些因素都会直接影响中心线计算的准确性,从而进一步影响整车控制效果。

摄像头图像

传统的图像处理

前期使用的做法,也是绝大部分比赛的队伍的图像处理做法。大致步骤:

  1. 灰度二值化(或者使用二值化的摄像头)
  2. 搜线等算法提取边线

可能遇到的问题:

  1. 基于阈值的二值化不能解决光照变化等问题,导致识别效果不佳。
  2. 即使使用大津法来动态计算阈值,也很难适应左右赛道光照不均匀等问题。

改进的图像处理

直接处理灰度图像,采用类似于卷积核的方式识别左右边线和前方的断路。多年后才意识到,这正是 Sobel 算子的思想!!!


控制算法

控制部分主要分为 方向控制速度控制,整体上采用的是 PID 思路,但侧重点并不一样。

方向控制 🧭

方向控制的核心目标是:让小车快速、稳定地回到赛道中心,同时尽量减少来回摆动。

在实际调参中,舵机控制通常更适合使用 P + 少量 D

  • P 用来根据偏差快速修正方向
  • D 用来抑制摆动、提升稳定性
  • I 一般很少使用,更不建议加太强的积分,否则容易导致转向滞后和振荡

速度控制 💨

速度控制通常采用 双环结构,外环负责根据目标车速调节目标电机转速,响应速度较慢;内环根据目标电机转速输出实际 PWM 信号,响应速度较快。简言之:

  • 外环:输入为目标车速,输出目标电机转速
  • 内环:输入为目标电机转速,输出 PWM

实际实现时,一般可以设计为:

  • 外环使用 PI 控制车速
  • 内环使用 PI 控制电机转速

总结

在整个比赛准备过程中积累了一些收获,同时现在看来也存在一些不足:

硬件方面: 虽然专业课中只学习了数电的理论知识,但自学了 PCB 设计、焊接以及电路板调试等实践技能,收获颇丰。这些经验也让我在硕士入学前于清华科技园实习期间, 对于四层板的的设计也感觉得心应手。

软件方面: 在开发过程中,没有简单照搬现成代码,而是独立实现了整车控制逻辑,并对部分模块进行了持续优化和重构, 对于算法和代码的架构设计有了一定的认识。 但由于经验有限,软件编程方面仍存在明显不足:

  • 以现在的视角(硕士毕业并多年工作经验, 学习或瞻仰过很多系统架构,比如数据库或调度系统等)回看,当时的代码架构设计太差了,很多逻辑都耦合在一起了。
  • 没有代码版本管理观念, IAR 上也是可以配置 Git 的,额外增加了代码维护的复杂度。
  • 对于单片机系统,在中断频率设置和处理逻辑方面考虑不够充分,有较大的提升空间。