第二十一届智能汽车竞赛---雁过留痕组技术方案分享

各位参赛同学,大家好!第二十一届全国大学生智能汽车竞赛已如期启幕,相较于往届赛事,本届赛题在规则设定、考核重点上均有显著调整,对参赛队伍的技术能力和实战水平提出了更高要求。今天,我们将聚焦雁过留痕组,邀请龙邱工程师为大家带来该组别的全方位深度解析,助力大家快速上手备赛。

编写本手册的核心目的,一是帮助新参赛同学快速认识智能汽车竞赛的魅力,搭建对雁过留痕组的基础认知;二是毫无保留地分享我们在该组别积累的实战方案、调车技巧与备赛心得。我们始终坚信,智能汽车竞赛中没有绝对的最优解,唯有不断探索、迭代优化,才能找到最适合自身队伍的方案。因此,我们希望通过本手册的内容,为大家提供一条清晰的探索路径,帮助大家在备赛过程中规避常见误区、少走弯路,更从容地应对比赛中的各类挑战,充分展现自身的技术实力。

本手册共分为七个核心部分,内容由浅入深、层层递进,覆盖备赛全流程,具体如 下:赛题规则、搭车清单、软件环境搭建、软件基础入门、软件控制思路、打靶功能思路、车模控制思路,全方位助力参赛同学高效备赛。

为保障学习效果,建议读者按照章节顺序逐步阅读。尤其针对新参赛同学,建议优先从搭车清单和软件环境搭建两个章节入手,先完成基础准备工作,再逐步深入学习硬件设计的细节的软件控制的核心思路,实现从入门到精通的稳步提升。

为方便大家交流探讨、互助共进,我们建立了专属QQ 讨论群。无论你在备赛过程中遇到机械设计、硬件制作、软件编程等技术难题,还是想交流比赛策略、分享备赛经验、结识志同道合的伙伴,都可以加入群聊畅所欲言,我们将与大家一同探讨、共同进步。

一、赛题规则

赛题规则是备赛的核心依据,贯穿备赛全流程,需要持续关注官方最新发布的规则细则与修订内容,确保备赛方向与赛事要求高度契合。

1.1 规则信息来源

全国大学生智能汽车竞赛官网

【卓晴老师 CSDN

《第二十一届全国大学生智能汽车竞赛比赛规则》

《第21 届智能车竞赛雁过留痕组比赛场地与紫外线感光片说明》

【卓老师微信公众号及评论区: TsinghuaJoking

https://mp.weixin.qq.com/s/R-OUn04QUXGrBduNXBNbcA

1.2赛题要求

二、搭车清单

此处以我们演示车模方案为例。

|------------------|----------------------|----------|------------|
| 模块名称 | 作用 | 是否必须 | 是否需要自制 |
| C 车模 | 车模运动平台 | 是 | 否 |
| 电池 | 供电 | 是 | 否 |
| STC32G144 核心 板 | MCU 最小系统,引�� GOIO 管脚 | 是 | 否 |
| STC32G144 母版 | 稳压电源、统一外设资源接口 | 是 | 是 |
| 神眼摄像头 | 识别赛道,循迹 | 是 | 否 |
| DRV8701E 双路电 机驱动 | 驱动控制两路电机 | 是 | 是 |

|--------------|---------------------|----------|---|
| LQ 1024 线编码器 | 精确反馈两个电机的转速 | 是 | 否 |
| 激光模块 | 包含激光的云台,打靶 | 是 | 否 |
| LSM6DSR 陀螺仪 | 姿态反馈,转向控制 | 否 | 否 |
| 低压报警器 | 保护电池 | 否 | 否 |
| Ips2.0 显示屏 | IPS 彩屏,显示神眼图像,显示数据等 | 否 | 否 |
| USB-TTL 模块 | 串口调试 | 否(比赛时禁用) | 否 |
| 蓝牙模块 | 无线调试查看参数等 | 否(比赛时禁用) | 否 |
| 无线图传模块 | 传输车模运行时图像 | 否(比赛时禁用) | 否 |

三、软件环境搭建

3.1 安装 Keil 集成开发环境

在此我们以 STC32G144 单片机为例,可在 STC 官网获取芯片规格书:

https://www.stcai.com/cp_stc32xl

通过查阅规格书可知,STC32G144 型号需要安装 Keil 的 C251 编译器。

(1)首先登录 Keil 官网,下载最新版的 C251 安装包,下载链接如下:

https://www.keil.com/download/product/

信息随便填写,点确定后进入下载页面进行下载。

(2)下载完成后双击安装包开始安装,点击 "Next":

(3)勾选 "I agree to all the terms of the preceding License Agreement",然后点击 "Next":

(4)选择安装目录,然后点击 "Next":

(5)接下来随意填写即可,然后点击 "Next":

(6)安装完成,点击 "Finish" 结束。

(7)安装完成后需要破解,CSDN 上相关注册教程有很多,大家可以自行搜索(Keil C251 注册),这里就不再赘述。

3.2 安装 AiCube - ISP 烧录软件

进入 STC 官网:

https://www.stcai.com/gjrj

在置顶选项中找到 "软件工具",单击进入后即可下载最新版的 ISP 烧录软件。

3.3 添加型号和头文件到 Keil

使用 Keil 之前需要先安装仿真驱动。仿真驱动的安装步骤如下:

(1)首先打开 AiCube - ISP 烧录软件,然后在软件右边功能区的 "Keil 仿真设置" 页面 中,先选择对应的单片机型号(此处以 STC32G144 为例),然后点击 "添加型号和头文件到 Keil 中 添加仿真器驱动到 Keil 中" 按钮:

(2)接下来会现如下画面:

(3)将目录定位到 Keil 软件的安装目录,然后确定。安装成功后会弹��如下的提示框:

即表示驱动正确安装了。

3.4 安装 CH340 串口驱动

进入以下网址下载安装即可:

https://www.wch.cn/downloads/CH341SER_EXE.html

3.5 下载开源库

3.5.1 开源库获取途径:

龙邱 21 届智能车综合技术交流群(QQ):228227119

龙邱 21 届雁过留痕智能车交流群(QQ):311091469

龙邱科技 Gitee:https://gitee.com/lq-tech

龙邱科技淘宝客服:https://longqiu.taobao.com/shop/view_shop.htm

3.5.2 库结构说明

模块例程包括:GPIO 输入输出、ADC 数据采集、UART 串口收发、OLED / IPS 屏幕、定时器中断、编码器读取、电机控制、陀螺仪数据读取等诸多使用示例。

3.6 拓展 Keil C 代码中断号

在 Keil 目前的 C51、C251 编译环境下,中断向量号只支持 0~31,即中断地址必须小于 0100H。程序里使用的中断向量号超过 31,编译时就会报错。随着芯片的功能越来越多、越来越强,STC 单片机的部分中断向量号已经超�� 31。此前临时解决的方法是借用 13 号中断向量地址,通过汇编代码从当前中断地址跳转到 13 号中断地址执行。

此外,有网友提供了 Keil 中断号拓展插件,安装到 C51、C251 目录下也可以解决中断向量号超 31 时编译报错的问题。

插件安装方法:

(1)首先打开开源库文件夹中的 "软件工具" 文件夹,双击运行文件夹内的可执行文件:

(2)点击 "打开" 按钮,选择 Keil 的安装目录,然后点击确定按钮:

(3)安装成功后显示如下提示:

即表示安装完成。(注意:部分旧版本 Keil 编译器可能不支持此插件)。

四、软件基础入门

软件是小车的 "灵魂",负责控制小车的赛道识别、前进、转弯等核心功能,但对于新手入门而言,先让小车跑起来是第一步。本节优先介绍单片机基础外设的作用和使用方法,在后面的章节中再涉及循迹方法、算法优化方向以及调试技巧。

基础外设是软件控制的基础,需要对每个外设的功能、使用方法进行了解。

4.1 GPIO 输入输

GPIO 是通用输入输出(General Purpose Input/Output)端口的简称。通俗来讲就是单片机可控制的引脚,用于与外部设备进行通信和控制。

GPIO 接口可以配置成输出模式来控制外部设备,也可以配置成输入模式来读取外部信号,将主控芯片的 GPIO 引脚与外部设备连接起来,还可以实现与外部通讯、控制以及数据采集等功能。

最基本的输出功能是由单片机控制引脚输出高、低电平,实现开关控制,如把 GPIO引脚接入到 LED 灯,那就可以控制 LED 灯的亮灭;引脚接入到继电器或三极管,那就可以通过继电器或三极管控制外部大功率电路的通断(例如蜂鸣器、激光笔)。

最基本的输入功能是检测外部输入电平,如把 GPIO 引脚连接到按键,通过检测电平高低区分按键是否被按下;引脚接入到单路光电管,通过检测电平高低区分黑白赛 道。

引脚的输出模式有以下几种:

4.1.1 推挽输

推挽输出的最大特点是可以真正能真正的输出高电平和低电平,在两种电平下都具有驱动能力;

4.1.2 开漏输

开漏输出最主要的特性就是高电平没有驱动能力,高电平仅为高阻态,需要借助外部上拉电阻才能真正输出高电平。

引脚的输入模式有以下几种:

4.1.3 浮空输入

可读取引脚电平,若引脚悬空,则电平不确定;

​​​​​​​4.1.4 上拉输入

可读取引脚电平,内部连接上拉电阻,悬空时默认高电平;

​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​4.1.5 下拉输入

可读取引脚电平,内部连接下拉电阻,悬空时默认低电平。

​​​​​​​4.2 ADC 采集

ADC 是模数转换器(Analog to Digital Converter)的英文简称,用于将连续的模拟信号转换为数字形式,以便数字系统能够处理。通常是将信号采样并保持以后,再进行量化和编码,这两个过程是在转化的同时实现的。

我们可以使用 ADC 采集经过运算放大器电路放大后的电磁传感器信号、光电管信号,也可用于采集电池电压。

ADC 采集核心相关概念及参数如下:

4.2.1 模拟信号

模拟信号是连续变化的信号,可以在任意时间内取得任意值。例如,声音、光线等自然界中的信号都是模拟信号,其值在一定范围内连续变化。模拟信号可以直接传输和处理,但在长距离传输或复杂系统中容易受到噪声和失真的影响,因此需要谨慎处理和放大。

4.2.2 数字信号

数字信号是离散的,只能在离散的时间点上取值。这些值通常用二进制数字来表示,例如 0 和 1。数字信号可以通过数字系统进行高效传输和处理,因为它们更不容易受到干扰和失真的影响。数字信号可以轻松地存储、复制、处理和传输,且在处理过程中可以利用各种数字算法进行处理。

4.2.3 转换过程

具体的转化步骤在这里就不展开说明,作为开发者,我们重点关注以下核心参数。

4.2.4 分辨率

表示对输入信号的分辨能力,即数值部分的精度。模拟采样中常说的 8 位、12 位 ADC,指的就是分辨率。例如:输入模拟电压的变化范围为 0~3.3 V,输�� 12 位二进制数可以分辨的最小模拟电压为 3.3V / 4095 ≈ 0.806mV。

4.2.5 工作电压和基准电压

工作电压是 ADC 芯片工作的额定电压;关键的是基准电压(又称参考电压),可来自芯片内部或外部接入,其决定了 ADC 的分辨率,因此基准电压一定要稳定。

4.3 定时器中断

定时器中断是一种基于定时器的中断机制,其核心作用是在预设的固定时间间隔内,精准触发指定事件或执行特定代码段。

在智能车中,定时器中断是实现周期性任务的核心手段,广泛应用于精准定时、传感器数据采集、转向环与速度环的闭环控制、以及编码器计距离、陀螺仪角度积分等。

举例而言,若将中断周期配置为 2ms,那么中断服务程序将严格按照每 2ms 一次的频率反复执行。

++++定时器中断的优先级高于主程序循环++++。一旦中断条件满足,系统会立即暂停主循环中当前正在执行的代码,转而去执行中断服务程序;待中断程序执行完毕后,系统将自动回到主循环,从被打断的位置继续向下运行。

因此,对于按键扫描、霍尔传感器信号采集这类对实时性和响应优先级要求高的任务,非常适合放在定时器中断中执行,以确保数据采集的及时性和准确性。

值得注意的是,定时器中断服务程序中严禁加入长时间的延时或阻塞操作,否则会占用大量资源,导致主循环及其他低优先级任务无法正常运行,还可能使中断服务程序的运行时间超过预设的中断周期,进而引发时序紊乱甚至整个系统的崩溃。

4.4 PWM 脉宽调制

脉冲宽度调制(Pulse Width Modulation,PWM)简称脉宽调制,是一种对模拟信号进行数字编码的方法。它通过在一个固定的时间周期内改变信号的脉冲宽度来模拟电压或电流的变化。

PWM 信号通常用于控制电机、LED 灯、伺服机构等,以调整它们的输��或工作状态。

PWM 信号具有两个主要参数:

4.4.1 周 期/ 频率

电机通常选择 1k ~ 30kHz 的 PWM 频率,频率过低会导致电机噪音和发热,频率过高可能超出驱动芯片的响应能力;

舵机通常要求 50Hz ~ 333Hz,其角度由高电平脉冲宽度(0.5ms ~ 2.5ms)决定;

无刷负压电机通常要求 50Hz ~ 300Hz,其转速由高电平脉冲宽度决定(1ms ~ 2ms);

4.4.2 占空比

高电平状态所占整个周期的百分比,它决定了 PWM 信号的平均电压或电流值。

PWM 信号的占空比决定了目标设备的输出特性,例如电机的转速或 LED 的亮度。更大的占空比通常表示更高的输出值。在智能车竞赛中,PWM 是实现电机速度控制和舵机转向调节的核心技术。通过调整 PWM 信号的占空比,可以精确控制电机的转速和舵机的转向角度。

4.5 串口通信

单片机中的串口是一种用于数据传输的通信接口,它可以将数据以串行的方式进行传输。串口通常由两个引脚组成,即发送引脚(TX)和接收引脚(RX)。当单片机需要发送数据时,它将数据转换为串行格式,并通过 TX 引脚发送出去。接收方通过 RX 引脚接收数据,并将其转换为原始格式,从这里可以知道串口通信在连接时需要将发送引脚(TX)连接接收引脚(RX)。

串口通信可以通过硬件或软件实现,其中硬件串口通常具有更高的速度和可靠性,而软件串口则具有更高的灵活性和可定制性。在单片机中,串口通常用于与其他设备进行通信,例如遥控器、传感器、显示屏、上位机等。

串口协议是指在串行通信过程中,双方之间所遵守的通信规则和约定。UART 串口协议包含以下内容:

4.5.1 数据帧格式

UART 串口协议使用包含起始位、数据位(5 至 8 位)、可选的奇偶校验位及 1 或 2

个停止位的数据帧来传输信息。具体格式需双方预先协商确定;

4.5.2 波特率

UART 串口协议使用波特率来指定数据传输的速率。波特率表示每秒钟传输的位数。常见的波特率包括 9600、19200、38400、57600 和 115200 等。通信双方必须使用相同的波特率才能正确地接收和发送数据;

4.5.3 帧同步

UART 串口协议使用起始位和停止位来标识每个数据帧的开始和结束。起始位是一个低电平信号,用于通知接收端数据帧的开始。停止位是一个高电平信号,用于通知接收端数据帧的结束;

4.5.4 错误检测

UART 串口协议利用奇偶校验位检查数据位数量是否符合预期,并通过校验和验证整个数据帧的完整性,以此来发现传输过程中的错误;

4.5.5 数据流控制

UART 串口协议支持硬件数据流控制和软件数据流控制。硬件数据流控制使用 CTS 和RTS 信号来控制数据传输。软件数据流控制使用 XON(ASCII 码为 0x11)和 XOFF(ASCII 码为 0x13)字符来控制数据传输。

串口通信作为一种基础而强大的技术手段,广泛应用于智能车等自动化领域中,可以实现数据的传输,从而对系统进行实时监控和调试。

五、软件控制思路

具体细节请查看龙邱科技微信推文:

https://mp.weixin.qq.com/s/Va7R6lBqCoQq1eqh02nWug

今年STC 单片机首次增设摄像头组别,相信不少备战的同学们都想要知道这颗新U 是否能够快速上手并能够像传统摄像头组别一样,高效完成图像处理,提高车模控制系统上限。

据了解有的同学在搭建完核心算法组合后,可能感觉到略微卡顿或系统延迟,影响车 模调试上 限。回想我们第一次测试时,单帧处理耗时居然高达 20 多ms,这导致车辆运行稳定性和反应速 度受限、甚至有冲出赛道的情况发生,这使得调试陷入瓶颈,提速困难,短时间内难以找到有效 突破方向。

针对这一问题,我们结合备战同学的实际调试场景,经过反复测试、迭代优化,整理出一套实用 性极强且实测验证有效的帧率优化思路,优化后单帧处理耗时可稳定降至 9-11ms,彻底解决卡 顿难题,这里我们将图像处理和优化思路分享给大家,希望能够帮助到更多的同学!

接下来,我们将从灰度图、二值化与大津法的核心解析、算法优化、搜线策略等多个维度展开,为各位同学系统说明一下如何在高帧率与有限资源之间取得最佳平衡。

5.1 基础铺垫

同学们遇到的卡顿问题,核心症结主要集中在两点:一是内存资源不足,二是算法计算耗时过长。在拆解具体优化方法前,我们先补充基础知识点,帮助大家吃透核心原理、少走弯路------首先明确,摄像头获取到的图像为灰度图,后续的二值化、赛道识别均基于灰度图展开。

5.1.1 灰度图:摄像头采集的核心图像格式

摄像头拍摄到的图像并非我们日常所见的彩色图,而是灰度图------这类图像仅包含明暗信息,不包含色彩信息,每个像素点的明暗程度用灰度值(0-255)表示。其中,灰度值 0 对应纯黑色,255 对应纯白色,介于两者之间的数值则对应不同深浅的灰色,赛道与背景的差异,本质就是灰度值的差异。

5.1.2 二值化:突�� 赛道特征的关键步骤

由于灰度图包含大量明暗渐变的像素点,直接用于赛道识别会增加计算量,因此需要进行二值化处理------二值化的核心是设定一个阈值,将灰度图中所有像素点的灰度值与该阈值对比,灰度值大于阈值的像素设为纯白色(对应赛道区域),小于等于阈值的像素设为纯黑色(对应背景区域),最终将灰度图转化为仅含黑白两色的二值图,清晰区分赛道与背景,为后续搜线算法简化计算。

为了让大家更直观理解阈值对二值化效果的影响,我们准备了一份灰度图用不同阈值二值化的结果动图,可清晰看到:不同阈值下,赛道与背景的区分效果差异明显,阈值选择不当会导致赛道轮廓模糊、背景干扰过多,甚至无法识别赛道。
阈值变化

5.1.3 大津法:自动筛选最优二值化阈值的核心算法(原理详 解)

二值化的关键在于阈值选择,手动设定阈值不仅效率低,还会受环境光照影响(光照变化会导致赛道与背景的灰度值差异变化),而大津法(也叫最大类间方差法),正是为解决这一问题而生的自动阈值筛选算法,其核心原理围绕"类间方差最大化"展开,无需手动干预,能适配不同光照场景,也是备战同学最常用的二值化算法。简单来

说,大津法的核心逻辑是:通过遍历所有可能的灰度阈值(0-255),计算每个阈值对应的"类间方差",找到类间方差最大的阈值,即为最优二值化阈值------这是因为类间方差越大,代表赛道(一类像素)与背景(另一类像素)的灰度差异越明显,区分效果越好。

为了让大家更直观地理解大津法的原理及阈值筛选过程,我们同步准备了一张大津法示意图,图中清晰呈现了算法筛选最优阈值的核心逻辑。

结合示意图,我们进一步拆解大津法原理的三个关键环节,对应图中三个核心部分:

5.1.3.1 直方图

示意图上方的灰色柱状图,是大津法计算的基础,用于显示该灰度图的灰度分布情况。横轴为灰度值(0-255),纵轴为对应灰度值的像素数量,从直方图中可直观看到,赛道与背景的像素会分别集中在两个不同的灰度区间(这是大津法能生效的前提),我们可通过直方图初步判断赛道与背景的灰度差异范围。

5.1.3.2 方差曲线

示意图下方的蓝色曲线,是大津法原理的核心体现,代表每个灰度阈值(0-255)对应的类间方差(Between-Class Variance)。类间方差是衡量"赛道类像素"与"背景类像素"灰度差异的核心指标,其计算逻辑是:将图像按当前阈值分为前景(假设为赛道)和背景两类,计算两类像素的灰度均值之差的平方,再结合两类像素的数量占比,最终得到类间方差。曲线的每个点,都对应一个阈值的类间方差结果。

5.1.3.3 最佳阈值

图中用红圈标记的曲线最大值点,是大津法的最终输��,即为自动筛选的最优二值化阈值。结合大津法"类间方差最大化"的核心原理,这个最大值点对应的阈值,能让赛道与背景的灰度差异达到最大,从而最大程度区分赛道与背景,完美规避手动设定阈值的弊端,也能适配光照变化带来的灰度值波动。

5.2 精准优化

5.2.1 针对大津法,破解内存与耗时痛点

了解基础原理后,我们回归核心优化需求。大家常用的 188×120 分辨率图像,若直接定义两个完整数组,可能会出现内存不够的问题;同时,每帧均遍历全图像素计算阈值,会大幅增加计算耗时,进而导致卡顿现象。

经过多轮测试验证,我们总结出两个实用的优化技巧,二者组合使用可实现效果翻倍,且不影响图像识别精度。

5.2.2 技巧 1 :图像下采样 ------ 平衡效率与精度,降低资源占用

针对大家调试时最常遇到的「内存不够」「单帧处理耗时久」两个问题,我们给出最简单、易操作的下采样实操方法,不用复杂修改代码,具体操作如下:大家常用的图像分辨率是 188×120(宽 188 像素、高 120 像素),下采样核心就是「隔一行取一

行、隔一列取一列」,直接将原图尺寸压缩一半,最终得到 94×60 分辨率的图像

(188÷2=94,120÷2=60),后续仅用这张压缩后的图像,执行大津法阈值计算即可。

为了让大家更直观感受下采样的优化效果,我们结合对比图,将 188×120(未优化分辨率)与 94×60(下采样后分辨率)的核心关键数据,清晰拆解如下,每一组数据都能直接体现下采样的优势,大家一看就懂、一用就会:

首先来看下采样后的 94×60 分辨率(优化后),其核心数据如下:分辨率为 94×60,对应大津法计算阈值时需遍历的直方图操作数仅为 5640 次,最终计算出的最优阈值为 62;

再对比我们常用的、未优化的 188×120 分辨率:其分辨率为 188×120,直方图操作数高达 22560 次,刚好是 94×60 分辨率的 4 倍(标注为x4),而最终计算出的最优阈值为 61。

单看这两组数据,就能清晰发现下采样后的图片阈值几乎一样,但是计算量小了数倍!

5.2.3 技巧 2 :帧间采样 ------ 依托场景特性,大幅缩减重复计算

结合大家实际调试的赛道行驶场景不难发现,环境光照的变化具有明显连续性,不会出现突变情况,这就意味着,相邻两帧图像的最优二值化阈值差异极小,完全无需每帧都重复执行完整的大津法阈值计算,可通过"复用阈值"减少冗余操作。

基于这一核心特性,我们为大家整理了简单易落地的"计算帧+继承帧"循环优化模式:每 10-20 帧(可根据自身赛道的光照情况、赛道复杂度,灵活调整N 值),执行一次完整的大津法阈值计算(即"计算帧");其余中间帧无需重复计算,直接复用上一计算帧得出的最优阈值(即"继承帧")。

这一优化策略效果十分显著,可将大津法的计算负载降低 90%以上,有效为车辆控制等其他核心算法腾出更多CPU 运行时间,进一步提升系统帧率的稳定性,让车辆运行更流畅,助力大家高效完成调试。

5.2.4 最优组合:下采样 + 帧间采样,彻底破局卡顿

结合前文两种优化技巧的核心优势,我们强烈推荐大家将二者搭配使用,实现内存占用与计算耗时的双重减负、双重提升,实操简单且不影响识别精度:建议大家始终在下采样后的 94×60 分辨率图像上执行大津法阈值计算,同时搭配每 10 帧(示例值,可根据自身赛道光照、复杂度灵活调整)计算一次阈值的帧间采样模式,兼顾便捷性与优化效果。

两种技巧组合后的预估优化效果十分显著:内存占用可稳定降至原来的 1 / 4 ,彻底规避 内存不够的问题;计算量直接缩减至原来的 1 / 40 ,大幅降低 CP U 负载,调试中的卡 顿难题可彻底根治,同时系统帧率稳定性会得到显著提升,帮助大家节省调试时间、高效推进备战进度,轻松突破帧率瓶颈。

软件控制思路 ------ 搜线策略对比

解决大津法优化问题后,搜线算法的合理选型也能进一步提升系统效率,帮助同学们少走弯路。 以下为两种常用搜线算法的实测对比,供大家结合自身基础和赛道场景参考选择。

5.3 两种常用搜线算法实测分析

5.3.1 八邻域搜线法:隧道摸墙,精准追踪赛道边界

八邻域搜线的原理其实特别好理解,我们用一个类比就能吃透:想象自己身处一条漆黑的隧道中,看不到前方的路,想要顺利走出隧道,最稳妥的方法就是双手摸着隧道的一侧墙壁,顺着墙壁的轮廓一步步向前走------八邻域搜线,本质就是让程序"摸"着赛道的边界,一步步向上追踪,精准找到整条赛道的轮廓。

先给大家明确左右边界的核心搜线流程,记准这个流程,再看示意图会更易理解:

左边界:采用逆时针搜索,顺序固定:先搜当前像素的右边 → 再搜右上角 → 接着搜上面 → 然后搜左上角 → 最后搜左边,搜到边界点后就停止,不再继续排查其他方 向;

右边界:采用顺时针搜索(与左边界方向相反),按照对应对称顺序排查相邻像素,同样搜到边界点后停止,确保始终贴合赛道边缘追踪。

这张是 5×5 细节示意图,清晰标注左边界逆时针搜索的每一个步骤,可直观看到程序

"摸墙"的具体路径,对照上面的流程就能快速对应上每一步操作:
八邻域细节

核心原理:和"隧道摸墙"一样,八邻域搜线核心就是"先找墙、再摸墙走",具体分为 3个简单步骤,对应程序的执行逻辑,没有复杂术语,直白易懂:

5.3.1.1 " 墙根 " :确定初始边界点

首先在图像的最底部(对应车辆近处的

赛道,也是赛道最清晰、最容易定位的位 置),从图像中间向左右两边搜索,找到黑白跳变点(黑色对应背景、白色对应赛

道),这两个跳变点就是赛道的初始左边界和初始右边界,相当于我们摸到隧道墙壁的第一个触点。

5.3.1.2 " 墙走 " :沿边界向上追踪

找到初始边界点后,程序就开始像我们摸隧道墙壁一样,顺着赛道边界向上追踪,每一步都会仔细检查当前像素的相邻像素(即八邻域范围),精准锁定下一个边界点,确保不偏离赛道轮廓。

5.3.1.3 " 方向 " :左右边界搜索规则

左右边界搜索有讲究:重点注意!左边界和右边界的搜索方向不一样,避免搜线跑偏,结合 5×5 细节示意图,具体顺序如下(记准这个顺序,调试不踩坑):

**左边界:**采用逆时针搜索,顺序固定:先搜当前像素的右边 → 再搜右上角 → 接着搜上面 → 然后搜左上角 → 最后搜左边,搜到边界点后就停止,不再继续排查其他方 向;

**右边界:**采用顺时针搜索(与左边界方向相反),按照对应对称顺序排查相邻像素,同样搜到边界点后停止,确保始终贴合赛道边缘追踪。

结合上述搜线原理与流程,我们来看 94×60 分辨率图像的八邻域搜线整体效果图,直观感受实际调试中的搜线效果:
八邻域整体
上图清晰呈现了八邻域搜线在实际优化后图像中的完整追踪效果:程序从图像底部的初始边界点出发,沿着赛道左右两侧边界,一步步向上追踪至图像顶部,形成完整的赛道边界轨迹。结合前文的 5×5 细节示意图,大家可以快速对应"左边界逆时针、右边界顺时针"的搜索逻辑,调试时若出现搜线偏移、中断等问题,也可对照此图快速排查异常。
调试注意事项(重点提醒

虽然原理易懂,但调试时需重点注意 2 点,避免出现搜线中断、边界偏移的问题:

  • 严格记准搜索方向:左边界逆时针(右 右上角 上面 左上角 左边)、右边 界顺时针,方向记错是搜线跑偏的主要原因,可对照 5×5 细节示意图反复核对;
  • 做好断点续接:若遇到赛道边界有轻微断点(如光照影响导致的短暂模糊),可在程序中添加简单的断点续接逻辑,避免程序 " 摸丢墙 " ,确保搜线连续不中断。

5.3.2 最长白列搜线法:逻辑简洁,新手易上手

最长白列搜线法的核心逻辑简单易懂,无需复杂的邻域判断,全程步骤清晰、可操作性强,非常适合刚接触摄像头调试的新手,完整算法流程拆解如下,每一步都直白好记,配合演示视频观看,能快速吃透:

5.3.2.1 第一步:统计每列连续白点个数,生成分布直方数据

操作非常简单,从图像的最下方一列开始,逐列向上寻找白色像素点(二值化后对应赛道区域),同时同步计数;一旦遇到黑色像素点(对应背景区域),就立即停止该列的计数。按照这个方法,遍历完所有列后,我们就能得到每一列连续白点的个数,形成完整的分布直方数据,为后续找边界奠定基础。

5.3.2.2 第二步:定位左、右最长白列,确定搜索截止行

这一步是算法的核心,具体操作分为两步:一是从图像左侧到右侧,逐列查找连续白点数量最多的一列,即为「左最长白列」;二是从图像右侧到左侧,同样逐列查找连续白点数量最多的一列,即为「右最长白列」。

5.3.2.3 第三步:精准查找赛道左右边界,处理丢线情况

找到搜索截止行后,我们就可以开始定位赛道边界了,搜索范围固定为「从图像最下一行(对应车辆近处)开始,到搜索截止行结束」,具体边界查找规则如下:

左边界查找:以左最长白列为起点,向左逐像素排查,找到「黑黑白」的像素组合

(即前两个为黑色、第三个为白色),此时这个白色像素点,就是赛道的左边界;

右边界查找:以右最长白列为起点,向右逐像素排查,找到「白黑黑」的像素组合

(即前两个为白色、第三个为黑色),此时这个白色像素点,就是赛道的右边界。

补充说明(丢线处理):若沿着上述规则查找,直到扫描到图像的边缘,仍然没有找到对应的「黑黑白」「白黑黑」像素组合,说明出现了丢线情况,此时直接将图像的屏幕边界,当作赛道边界,避免程序因丢线陷入混乱,保证调试稳定性。

为了让大家更直观地掌握整个算法的执行过程,我们还准备了最长白列搜线法的整体流程演示视频,结合视频对照上述步骤,能快速理解每一步的实际操作效果,新手也能快速上手调试。
最长白列初始

5.3.2.4 核心优势(贴合新手需求

相较于八邻域搜线法,最长白列搜线法的最大优势就是门槛低、易操作。算法逻辑清晰连贯,无需记忆复杂的邻域搜索方向,每一步操作都有明确的规则,代码编写难度低;调试过程直观,可通过查看每列白点计数、最长白列位置,快速排查问题,无需复杂的逻辑判断,非常适合新手快速上手、快速落地。

5.3.2.5 局限性(客观说明,避坑提示

结合实际调试场景,该算法也存在一定局限性,大家可提前了解、规避问题:一是需要遍历整幅图像的所有列,计算耗时相对固定,无法像八邻域搜线法那样节省计算 量;二是在简单直道场景下,会存在一定的冗余计算,运行效率低于八邻域搜线法;三是面对复杂弯道时,由于最长白列长度缩短、视野变近,边界识别精度可能会略有下降,需做好调试适配。

5.3.2.6 最长白列优化方案(兼顾效率与易用性

针对上述局限性,我们对最长白列搜线法进行了简单易落地的优化,核心是修改第一步的扫描规则,优化后可大幅提升效率,具体如下:

优化核心(明确两步扫描规则,避免混淆):优化仅针对前两步的扫描逻辑,分两步明确,后续丢线处理等步骤与未优化版本完全一致,无需额外修改:

  1. 统计白点、找左 / 右最长白列:保留"从图像最下方一列开始,逐列向上寻找白 点、遇到黑点停止计数"的核心逻辑,扫描规则为隔两列搜一列------即不扫描所有列,每间隔两列,仅对一列进行白点计数,跳过中间两列的扫描,最终定位出左、右最长白列。
  2. 扫线找边界点:找到左、右最长白列后,向两边扫线寻找"黑黑白""白黑黑"边界组合时,扫描规则改为隔一列扫一列,且每行都必须完整扫描(不跳过任何一行),确保边界点定位精准,既节省计算量,又不影响识别精度。

优化后实测效果(核心数据):优化后最长白列搜线法的总像素访问量仅为 3503 次,相较于未优化版本的全列扫描,节省了 76%的计算量,计算耗时大幅降低,冗余计算问题得到有效解决,同时完全不影响边界识别精度,兼顾了新手易用性和调试效率。

为了让大家更直观地体会优化前后的效率差异,我们也准备了对应的演示gif,可清晰看到"隔两列搜一列"的扫描过程,以及优化后像素访问量减少、搜线效率提升的实际效果,结合数据对比,能快速吃透优化逻辑。
最长白列优化

5.3.3 算法选型建议:优先推荐八邻域,最长白列适配新手

结合前文两种算法的原理、实操及调试场景,同时兼顾最长白列搜线法的新增优化方案,我们从算法耗时资源占用适配场景三个核心维度,做详细对比,帮大家快速做出选择------核心结论先明确:从备战调试的效率、稳定性需求出发,优先推荐选择八邻域搜线法;优化后的最长白列搜线法虽大幅提升效率,但仍有局限性,更适合纯新手入门适配,具体对比如下:


补充选型建议:结合备战核心需求(解决卡顿、提升帧率、稳定识别),优先选择八邻域搜线法,其在耗时和资源上的优势能与前文大津法的优化技巧形成协同,彻底解决调试中的核心痛点;若你是纯新手,可借助优化后的最长白列搜线法入门(效率提升、操作简单),快速熟悉搜线逻辑,待掌握基础调试技巧后,建议及时切换为八邻域搜线法,兼顾入门难度与备战效率,避免因算法选型不当影响进度。

六、 打靶功能思路

今年的重点是STC32 单片机+神眼摄像头对靶环的检测,靶环检测的核心流程包括图像预处理(大津法二值化)、边线搜索(左右边线定位)、靶环中心计算(三种算法可选)三部分。在此龙邱科技为大家提供以下三种方法基本思路:

6.1 方法 1 :黑白跳变检测边界点

该方法通过黑白像素跳变定位靶环的左右、上下边界,最终计算中心点。具体流程如下:在成功提取赛道左右边线后,可在两边界之间的水平区域内进行靶环检测。

6.1.1 核心步骤

  • 水平方向搜索:从左向右扫描该区域,找到第一个由黑变白的跳变点,记为左边界点;继续向右扫描,找到随后出现的第一个由白变黑的跳变点,记为右边界点。
  • 宽度验证:计算左右边界点的横向距离,若小于预设的最小有效宽度阈值,则判定为干扰或噪声,直接退出本次检测。
  • 中心初判:取左右边界点的中点作为候选中心横坐标,并检查该位置是否为白色像素。若非白色,说明不符合靶环特征,退出检测。
  • 垂直方向搜索:以该中点为起点,分别向上和向下逐行搜索:向上找到第一个由白变黑的跳变点,记为上边界点;向下找到第一个由白变黑的跳变点,记为下边界 点。
  • 中心精确定位:取上下边界点的纵向中点,结合已有的横向中点,最终得到靶环的中心坐标。​​​​​​​

6.1.2 方法优势

该方法利用靶环典型的"白环黑底"结构特征,通过双向跳变检测与几何约束,有效提升识别鲁棒性与定位精度。

6.2 方法 2 :黑点坐标平均法

该方法通过统计左右边线中间的黑色像素点,取坐标平均值作为靶环中心,流程简洁、易操作。

6.2.1 核心步骤

在左右边线的中间直接找黑点,记录每一个黑色像素点的位置,直至遍历完整个边线中间区域,将记录到的每个黑色像素点的坐标相加取平均,得到的坐标即为靶环的中心点。

6.3 方法 3 :最长白列特征法

该方法利用靶环与赛道的宽度差异(靶环宽度远大于赛道),通过最长白列定位靶环区域,再计算中心点。靶环会被直接搜索为边线,通过识别路宽差异即可定位中心点。

6.3.1 核心步骤

以上三种靶环检测思路,可根据实际场景选择合适的算法。如需进一步优化,可结合STC32G144 的特性优化程序代码来提升搜线速度和处理速度。

七、车模控制思路

7.1 电机闭环控制

电机闭环控制核心配置:使用LQ-DRV8701E 新版双路电机驱动,搭配龙邱新版正交/方向MINI 编码器(LQSTC32G144 母板编码器接口选择兼容方向和AB 正交编码器)测量电机速度,控制算法采用增量式PID,可较好实现速度控制。采样数据稳定可靠,结构上采用插拔式设计,连接稳定、易更换,能够更好地实现稳定的速度闭环控制。

DRV8701E 是一款由德州仪器推出的全桥栅极驱动器,采用先进的N 沟道MOSFET驱动架构,具备极低的传输延迟与高峰值输出电流能力,响应迅速、控制精准。该芯片集成了完善的保护机制,可稳定驱动高电流负载,支持PWM 调速与多种工作模 式,适用于电机控制、工业自动化及大功率驱动系统等高要求应用场景。

7.1.1 速度闭环的必要性

想象一下骑自行车上下坡:上坡时需要用力蹬,下坡时则要轻握刹车。如果没有这些调整,车速就会完全由坡度决定。智能车的电机也是如此,没有速度闭环时,电池电压变化会导致车速不稳定,两个参数相同的电机也会因电气差异出现转速不同的情 况。

速度闭环就是给电机装上"智能油门",通过实时调整电机功率,让车速始终稳定在设定值附近。这不仅让行车更平稳,更为后续的转向控制奠定了坚实基础。

7.1.2 增量式 PID :精准的速度调节器

增量式PID 的核心思想很直观:不直接决定输出力的大小,而是计算输出力需要改变多少。其核心公式清晰地体现了这一点:

本次调整量 = Kp×(本次误差-上次误差) + Ki×本次误差 + Kd×(本次误差-2×上次误差+上上次误差)

这个"本次调整量"正是增量式PID 的关键输出。它告诉我们,基于当前和近期的误差情况,控制输出应该在上一时刻的基础上增加或减少多少。

用骑车的例子具体理解调整量的形成:

  • 比例(P)贡献:当发现这次比上次速度差得更远(误差在变大),会立即额外加大蹬车力度阻止情况恶化,这部分贡献是 Kp×(本次误差-上次误差)。
  • 积分(I)贡献:当发现当前速度比目标慢,存在持续差距,会持续稳定地增加蹬车力度,直到追上目标速度,这部分贡献是 Ki×本次误差。
  • 微分(D)贡献:当预感到速度即将开始下降(误差变化很快),会提前增加一点力度防止速度下跌,这部分贡献是 Kd×(本次误差-2×上次误差+上上次误差)。

最终的实际控制命令,是将计算出的"本次调整量"与上一次的输出相加得到:本次输出= 上次输出+ 本次调整量

7.1.3 仿真效果展示

为方便演示,我们在MatLab 中进行了仿真,可清晰观察响应曲线,实际调试时也可借助相关软件工具查看调试情况,具体分三步演示:

7.1.3.1 仅引入比例 (P) 控制

刚开始仅给比例控制,控制器一看到误差就快速响应,但存在明显缺陷------始终刹不住车,稳定后的速度总比目标值差一点,即典型的"静差"现象。

反映在曲线上,起步迅猛、快速上扬,但最终停在目标值下方,无法达到预设速度。

7.1.3.2 引入积分 (I) 控制

为解决"静差"问题,我们给系统加入了积分控制。现在的控制器就会记账,不仅关注当前还差多少,还把之前欠的"旧账"都一笔笔记下来。这样一来,系统终于能精确地达到目标值了,彻底告别了"总是差一点"的尴尬。

不过,I 的系数过大,它就会变得过分较真,每次都要把之前的欠账连本带利地追回来,结果导致系统冲过头,然后不得不往回调整,来来回回要好几次才能稳定下来,这里我们用极端情况(仅引入I)来做演示:

那么好,此时的响应曲线在目标值附近略微震荡几下,最终稳稳地停在理想位置。

7.1.3.3 引入微分 (D) 控制

微分控制如同"预言家",不关注当前和历史误差,专注于预测误差变化趋势。当系统接近目标值时,微分控制会提前调整输出,避免超调,让系统响应更平稳。加入微分控制后,响应曲线呈平滑弧线,无超调、无振荡,能快速且平稳地达到目标状态。

7.1.4 关键注意事项:输 限幅保护

微分控制的加入确实让系统变得优雅而高效,但细心的工程师会发现一个潜在的问

题:这个不断累积的"调整量"并非可以无限增长,若不加以限制,会引发一系列硬件及系统故障。

我们可以用骑车的场景类比理解这一风险:在一条漫长的下坡路上,为了维持目标速度,需要持续轻捏刹车。如果系统机械执行"本次输出 = 上次输出 + 本次调整量"的公式,刹车力度会不断累积,最终可能超出物理极限,导致失控。


通过电机堵转仿真可清晰验证限幅的必要性:在第 10S 时突然施加 5ms 的堵转,响应曲线会在堵转瞬间出现小尖峰;若将堵转时长延长,曲线会直线飙升,很快达到理论计算值的数倍。

若未设置输出限幅,失控的PWM 信号将带来严重后果,具体如下:

  • 电机过热:巨大的电流持续通过电机绕组,导致电机温度急剧升高,影响使用寿命甚至烧毁电机;
  • 驱动器损坏:功率器件可能因过流而烧毁,导致电机驱动模块失效;
  • 系统崩溃:即使解除堵转,饱和的积分项也需要很长时间才能恢复,导致整个车模控制系统陷入紊乱。

因此,必须在代码中为增量式PID 加入限幅保护,确保输出在硬件允许范围内,具体代码示例如下:

若未设置输出限幅,失控的PWM 信号将带来严重后果,具体如下:

  • 电机过热:巨大的电流持续通过电机绕组,导致电机温度急剧升高,影响使用寿命甚至烧毁电机;
  • 驱动器损坏:功率器件可能因过流而烧毁,导致电机驱动模块失效;
  • 系统崩溃:即使解除堵转,饱和的积分项也需要很长时间才能恢复,导致整个车模控制系统陷入紊乱。

因此,必须在代码中为增量式PID 加入限幅保护,确保输出在硬件允许范围内,具体代码示例如下:

cs 复制代码
// 计算本次输出
output = last_output + delta_output;

// 对总输出进行限幅,确保在硬件允许范围内
if (output > MAX_OUTPUT) { output = MAX_OUTPUT;
} else if (output < MIN_OUTPUT) { output = MIN_OUTPUT;
}

7.2 舵机控制与位置式 PID

在完成电机速度环的控制后,智能车已能在直道上稳定行驶,但要实现弯曲赛道的自如穿梭,还需解决转向控制这一核心问题------舵机作为转向执行部件,搭配位置式 PID 控制算法,可实现精准、平稳的转向调节,为智能车灵活应对各类赛道工况提供保障。

7.2.1 位置式 PID :舵机角度控制的核心利器

与电机速度环使用的增量式PID 不同,位置式PID 的核心逻辑的是"明确目标位置、精准调控到位":增量式PID 关注"输出需要调整多少",而位置式PID 聚焦"输出应该达到哪个位置",恰好适配舵机"需精准定位转向角度"的控制需求。

位置式PID 的核心公式如下,简洁易懂且可直接应用于舵机控制:输出 = Kp × 当前误差 + Ki × 累计误差 + Kd × (当前误差 - 上次误差)

结合舵机转向控制场景,用通俗的类比拆解三个参数的核心作用,便于新手理解和调试:

  • 比例( P ):即时响应,纠正偏差:类似骑车时发现车身偏移,立即转动车把纠正,偏移量越大,车把转动幅度越大。若P 系数过小,转向响应迟缓,易偏离赛道;若P 系数过大,转向过于灵敏,直道行驶时会左右摇摆,无法保持稳定。
  • 积分( I ):累积修正,消除静差:好比自行车存在轻微跑偏隐患(如车轮轻微歪斜),需持续施加微小的反向作用力,逐步修正偏差。但I 系数不可过大,否则会出现 "矫枉过正",从一侧偏移变为另一侧偏移,导致转向振荡。
  • 微分( D ):提前预判,抑制超调:如同老骑手的经验,能敏锐感知车身偏移趋势,在偏差尚未扩大时提前调整,避免转向过度。D 系数可有效抑制舵机接近目标角度时的惯性超调,让转向更顺滑;若D 系数过大,会对微小偏差过度反应,导致转向僵硬、响应迟缓。

实际应用中,将位置式PID 的计算输出直接赋值给舵机,同时需对舵机转向角度进行左右限幅,避免超出机械结构承受范围,防止舵机损坏或转向失灵。

7.2.2 仿真效果展示:单 P 控制与 PD 控制对比

在舵机实际调试中,通常仅需PD 控制即可达到理想的转向效果。通过仿真软件可清晰观察单P 控制器与PD 控制器的性能差异,为实际参数调试提供参考,具体对比如下:

7.2.2.1 P 控制:响应快但稳定性差

单P 控制器的响应曲线呈现"追求精准却难以稳定"的典型特征:当目标角度突然变化时,舵机能够快速响应,迅速向目标位置转动,体现了比例控制"偏差越大、控制力越强"的核心特性。

但存在明显缺陷:由于缺乏微分控制的"预见性",舵机在接近目标角度时,会因惯性冲过头,随后反向修正,再次冲过头,形成持续振荡。这种现象类似初学者骑自行车,虽能明确转向方向,但始终在目标位置附近来回摇摆,无法稳定定位。

7.2.2.2 PD 控制:快速响应且稳定精准

加入微分控制后,PD 控制器的性能得到显著提升:微分项能敏锐感知舵机转向速度的变化趋势,在舵机快速接近目标角度时,提前"抑制冲量",有效避免超调现象。

此时的响应曲线呈现完美状态------快速启动、平稳接近、精准停止,无持续振荡,实现了响应速度与稳定性的双重兼顾。这也印证了:比例控制决定舵机的响应速度,微分控制保障舵机的转向稳定性,二者配合可让智能车的转向动作精准而优雅。

相关推荐
A.说学逗唱的Coke2 小时前
【AI协同软件工程】规范驱动开发工具全景解析:OpenSpec、SpecKit与传统SDD工具深度对比指南
人工智能·驱动开发·软件工程
抓蛙师2 小时前
Claude Code 宠物 (Buddy) 配置教程
人工智能·宠物
VBsemi-专注于MOSFET研发定制2 小时前
面向AI电动自行车电驱系统的功率MOSFET选型分析——以高效能、高可靠电机控制与电源管理为例
人工智能
victory04312 小时前
2026年4月3日 理论基石:数据量与模型参数量的关系
人工智能
平安的平安2 小时前
Python + AI Agent 智能体:从原理到实战,构建自主决策的 AI 助手
开发语言·人工智能·python
向上的车轮2 小时前
从零构建极简大语言模型:MiniLLMDemo 原理与实现详解
人工智能·语言模型·自然语言处理
十铭忘2 小时前
GenericAgent:可自我进化的自主 Agent 框架
人工智能
Coovally AI模型快速验证2 小时前
低空安全刚需!西工大UAV-DETR反无人机小目标检测,参数减少40%,mAP50:95提升6.6个百分点
人工智能·目标检测·计算机视觉·无人机
QYR_Jodie2 小时前
全球与中国亚克力板市场:2026-2032期间年复合增长率(CAGR)为5.2%
人工智能·市场报告