简介:这份资料面向备战全国大学生电子设计竞赛的参赛学生与指导教师,聚焦2024年电赛捡球小车赛题,提供一套可直接参考的完整工程实现。压缩包共344个文件,约5.44MB,以142个C头文件与97个C源文件为核心,构成小车控制、传感器采集与电机驱动的底层代码;另有72个crf等编译中间文件、Keil工程配置(uvprojx、uvoptx、sct)及少量Python脚本、说明文本与图片,便于在本地还原编译环境并对照理解工程组织。资源已有316人学习下载,具备一定参考基础。读者可从中获取循迹与捡球动作的代码框架、外设驱动写法、工程目录结构与调试配置思路,适合作为赛前练手、方案比对与查漏补缺的实战样本,对刚接触电赛控制类题目的同学尤具借鉴价值。
1. 电赛捡球小车:从赛题到评分,先搞清这四件事
电赛捡球小车这类题目,真正拉开差距的往往不是“能不能跑”,而是“跑得稳不稳、停得准不准、报告写不写得清”。很多队伍把八成时间砸在机械结构上,结果现场一上场,小车在场地边缘反复打转,识别框抖得像玄学,最后连基本分都没拿满。这场竞赛考的是系统工程能力:传感器选型与布局、图像识别或红外寻迹的稳定性、电机闭环控制、电源分配,以及现场调试与文档规范。拿分逻辑很直接——基本功能分必须全拿,扩展功能分按“稳一项加一项”的顺序推进,别一上来就堆功能。适合已经搭过小车底盘、写过单片机程序、但还没完整跑通过一场电赛流程的备赛者。下面按考点分布、高频模块、真题演练、易错点、现场答题与调试策略五块拆开讲,每一块都能直接拿去对照自己的方案改。
2. 考点分布:捡球小车赛题到底考哪几个模块
2.1 赛题任务拆解与分值结构
捡球小车类赛题通常给一个封闭场地,场地上散布若干目标球,小车从出发区启动,在规定时间内完成“寻球—接近—拾取—搬运—归位”的循环,部分年份还会加“按颜色分类”“避开障碍物”“返回出发区”等扩展要求。基本分集中在“能启动、能识别、能捡起、能放回”,扩展分集中在“分类准确率、用时、路径效率、人机交互”。备赛时先把任务拆成四个可独立验证的子任务:场地感知、目标定位、拾取动作、路径决策。每个子任务单独调通,再串成完整流程。很多队伍翻车的根源是四个子任务耦合在一起调,改一个参数牵动全局,最后连问题出在哪都说不清。
分值结构上,基本功能通常占六到七成,扩展功能占三到四成。这意味着哪怕扩展功能一个没做,只要基本流程稳定跑通,分数也不会太难看;反过来,基本功能抖动、扩展功能堆一堆,现场一紧张全崩。备赛策略应该是先把基本流程的稳定性做到“连续十次不失误”,再考虑加扩展。稳定性怎么衡量?不是看一次跑通,而是看十次里成功几次、失败时卡在哪个环节。建议做一个简单的记录表,每次测试记下“识别是否成功、拾取是否成功、用时、失败原因”,跑够二十次再谈优化。
2.2 硬件模块与传感器选型的考点映射
硬件部分考官和评审最常看的是“选型有没有依据”。捡球小车涉及的核心模块包括:主控(单片机或嵌入式板卡)、电机与驱动、电源管理、目标检测传感器、拾取机构。目标检测常见方案有红外对管、颜色传感器、摄像头加图像处理。红外对管便宜、响应快,但只能判断“有没有”,分不清颜色和距离;颜色传感器能分颜色,但受环境光影响大;摄像头信息量最大,但处理延迟和光照鲁棒性是血泪经验的重灾区。选型时要在报告里写清楚“为什么选这个、在什么条件下会失效、怎么补偿”,这比堆参数更能拿分。
电源管理是容易被忽视的考点。电机启动瞬间电流拉低电压,可能导致主控复位或传感器误判。常见做法是电机电源和逻辑电源分开走,加足够的滤波电容,电机驱动单独供电。拾取机构方面,常见有机械夹爪、滚筒吸入、铲斗推入。夹爪控制精度要求高但动作明确,滚筒容错好但容易卡球,铲斗结构简单但对球的位置要求高。选型要和场地球的大小、材质匹配,报告里给出测试数据比空谈“结构稳定”有说服力。
提示:硬件选型部分在评审问答里出现频率很高,准备时把每个模块的“选型理由、失效场景、补偿手段”三句话背熟,现场被问到能直接答。
2.3 软件流程:感知、决策、执行的闭环
软件流程可以画成一条闭环:传感器采集→目标判定→运动决策→电机执行→状态反馈。感知层负责“有没有球、球在哪、什么颜色”;决策层负责“先捡哪个、走什么路径、什么时候停”;执行层负责“电机怎么转、夹爪什么时候闭合”。闭环的关键是反馈:拾取成功后要有确认信号(比如夹爪限位开关或电流检测),否则小车会以为捡到了继续跑,实际空手而归。这类“假成功”是现场失分的隐形杀手。
决策逻辑上,简单场景可以用状态机:搜索态、接近态、拾取态、搬运态、返回态,每个状态有明确的进入条件和退出条件。状态机的好处是调试时能定位“卡在哪个态”,坏处是状态多了容易漏转移条件。建议把状态转移图画在纸上,每加一个功能就补一条转移线,别让代码里的 if-else 变成一团乱麻。感知层如果用车载摄像头,图像处理流程通常是“采集→颜色空间转换→阈值分割→轮廓提取→目标筛选→坐标输出”,每一步的参数都要在场地实际光照下调,实验室灯光和赛场灯光往往不是一回事。
3. 高频考点:识别、控制、拾取三个必考模块怎么答
3.1 目标识别:颜色阈值与轮廓筛选的答题模板
目标识别是捡球小车最常被问到的模块。面试或评审问答里,典型问法是“你怎么保证不同光照下都能识别到球”。答题思路分三层:第一层讲方案选择,说明为什么用颜色阈值而不是纯红外或纯模板匹配;第二层讲鲁棒性手段,比如在 HSV 颜色空间做阈值分割比 RGB 更抗光照变化,阈值不是拍脑袋定的而是用场地实拍图统计出来的;第三层讲失败兜底,比如连续多帧丢失目标时进入搜索旋转,而不是原地死等。
下面是一段典型的颜色阈值加轮廓筛选的 Python 伪代码,用 OpenCV 风格写,重点看注释里的参数含义和筛选逻辑:
import cv2 import numpy as np def detect_ball(frame, hsv_lower, hsv_upper, min_area=300, max_area=8000): # 转 HSV:比 RGB 更抗光照变化,阈值调整更直观 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 阈值分割:lower/upper 需用场地实拍图统计,不能照搬教程 mask = cv2.inRange(hsv, hsv_lower, hsv_upper) # 形态学开运算:去掉噪点,闭运算:填补目标内部空洞 kernel = np.ones((5, 5), np.uint8) mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) best = None for c in contours: area = cv2.contourArea(c) # 面积过滤:太小是噪点,太大可能是背景色块 if area < min_area or area > max_area: continue # 圆形度过滤:球在图像里近似圆形,用周长面积比筛掉长条干扰 peri = cv2.arcLength(c, True) if peri == 0: continue circularity = 4 * np.pi * area / (peri * peri) if circularity < 0.6: continue x, y, w, h = cv2.boundingRect(c) cx, cy = x + w // 2, y + h // 2 if best is None or area > best[0]: best = (area, cx, cy) return best # 返回 (面积, 中心x, 中心y),None 表示未检测到这段代码的关键不在函数本身,而在三个参数的来路:hsv_lower/hsv_upper必须用赛场同款灯光下的实拍图统计,min_area/max_area要根据球在图像中的像素大小和摄像头高度反推,circularity阈值用来排除场地边线和色块干扰。评审问“阈值怎么定的”,答“用实拍图统计加现场微调”比答“网上找的”高一个档次。另外注意,识别输出的是图像坐标,要转成小车动作还需要标定摄像头与车体的相对位置,这一步在报告里写清楚能加分。
3.2 电机闭环控制:PID 参数整定的现场答法
电机控制的高频问法是“你的小车走直线为什么能走直”或“转弯为什么不过冲”。答题核心是闭环:编码器测速→PID 计算→PWM 输出。开环控制靠时间估算,地面摩擦一变就偏;闭环控制靠反馈修正,参数整定好之后一致性明显提升。PID 三个参数的作用要能一句话说清:P 管响应快慢,I 管消除稳态误差,D 管抑制超调。现场被问“参数怎么调的”,答“先调 P 到等幅振荡,再加 D 压超调,最后加少量 I 消静差”是标准套路,但更打动人的是补一句“调完之后在不同电量下各跑十次验证一致性”。
class PID: def __init__(self, kp, ki, kd, out_limit=1000): self.kp, self.ki, self.kd = kp, ki, kd self.out_limit = out_limit self.integral = 0.0 self.prev_error = 0.0 def update(self, target, actual, dt): error = target - actual # 积分限幅:防止长时间偏差导致积分饱和,这是现场翻车的常见原因 self.integral += error * dt self.integral = max(min(self.integral, self.out_limit), -self.out_limit) derivative = (error - self.prev_error) / dt if dt > 0 else 0.0 self.prev_error = error output = self.kp * error + self.ki * self.integral + self.kd * derivative return max(min(output, self.out_limit), -self.out_limit)这段 PID 里最值得讲的是积分限幅。很多队伍调参时发现小车“起步猛冲、停下过冲”,查半天是积分项累积过大。限幅之后输出更平滑,但限幅值设太小又会导致稳态误差消不掉,需要在场地实测中折中。参数说明上,dt是控制周期,必须和实际调用间隔一致,用定时器中断保证;out_limit对应 PWM 占空比上限,要和电机驱动允许范围匹配。评审如果追问“控制周期多少”,答“和电机驱动响应匹配,太快没意义、太慢丢反馈”,比报一个具体数字更稳。
3.3 拾取动作:状态机与失败重试的答题思路
拾取动作的高频问法是“你怎么判断球捡起来了”和“没捡到怎么办”。答题模板是“动作分解加状态确认加失败重试”。动作分解:接近到指定距离→夹爪闭合或滚筒启动→确认信号→抬升或搬运。确认信号可以是限位开关、电流检测、或者红外对管被遮挡。失败重试:确认信号没来,先原地微调位置再试一次,连续两次失败就退回搜索态,别在原地死磕。这个逻辑写进报告,评审会认为你考虑过现场不确定性。
状态机实现上,每个状态设一个超时时间,超时未完成就转失败处理。比如“接近态”超过三秒还没进入拾取距离,说明定位偏了,退回搜索态重新找。超时时间根据场地实测定,别拍脑袋。拾取机构如果是夹爪,闭合力度要能夹住球又不把球挤飞,这个靠电流限制或机械限位实现;如果是滚筒,转速和入口角度要匹配球的大小,转速太高球会被弹开。这些细节在报告里用测试数据说话,比写“结构合理”有分量。
4. 真题演练:三道典型问答题的完整答法
4.1 问答题一:小车在场地边缘误判目标怎么处理
题目场景:小车靠近场地边界时,把边界色块误判成目标球,反复冲过去。答题思路分四步。第一步定位原因:颜色阈值把边界色和球色划进了同一区间,或者轮廓筛选没排除长条形边界。第二步给短期手段:加圆形度过滤和面积上限,边界色块通常形状不规则或面积偏大。第三步给长期手段:在决策层加“边界禁区”判断,小车进入边界一定距离内就禁止拾取动作,只允许转向离开。第四步给验证方法:用场地实拍视频回放,统计误判次数,改完再回放对比。
这类题面试官最想听的是“你有没有分层处理”。只答“调阈值”显得单薄,答出“感知层过滤加决策层禁区加回放验证”三层,说明你理解系统冗余。易错点是只改阈值不改决策逻辑,换个场地光照又翻车。补一句“阈值是场地相关的,换场地必须重新统计”能体现经验。
4.2 问答题二:电池电压下降后小车行为不一致怎么答
题目场景:满电时跑得好好的,跑几圈之后速度变慢、转弯半径变大。答题思路:先承认这是电源相关的一致性问题,再给原因链——电压下降导致电机实际转速低于预期,开环控制下表现为速度变慢;如果控制环用的是电压估算而非编码器反馈,转弯也会偏。解决手段分硬件和软件:硬件上电机独立供电加稳压,软件上用编码器闭环替代开环时间估算,并在低电量时降速运行保证可控。验证方法是故意用半电电池跑完整流程,看成功率下降多少。
这道题考的是“你有没有把电源当系统变量”。很多队伍只关注满电表现,现场跑几轮就原形毕露。答题时主动提“低电量测试”是加分项,说明备赛时做过边界条件验证。注意别把原因全推给电池,要落到“控制方式对电压变化的敏感度”上,这样才显得是工程分析而不是抱怨。
4.3 问答题三:多球场景下先捡哪个、路径怎么定
题目场景:场地上有多个球,颜色不同,要求按颜色分类搬运。答题思路:先讲决策目标——在时间限制内最大化有效搬运数,所以优先级是“近的先捡、同色的批量搬、远的留到最后”。再讲实现方式:感知层输出所有目标的坐标和颜色,决策层按距离排序并做简单聚类,执行层逐个处理。路径上不必追求最优解,用“最近邻加简单避障”就够,现场稳定比理论最优重要。最后讲异常处理:某个球连续两次拾取失败就标记跳过,别让一个球拖垮全局。
评审追问“为什么不用全局路径规划”时,答“场地小、目标少,最近邻的收益已经够,复杂算法增加调试风险”是合理回答。这道题的关键是展示“取舍意识”:知道什么该做、什么不值得做。易错点是上来就讲 A* 或遗传算法,听起来高级但和捡球小车的时间尺度不匹配,反而显得没做过实际测试。
5. 易错点:五类现场失分点与纠正答法
5.1 识别阈值照搬教程,换场地就崩
错在哪:直接拿网上教程的 HSV 阈值范围,实验室灯光下能用,赛场灯光一换就识别不到或误识别。为什么错:颜色阈值和光照色温强相关,教程参数是别人场地统计的,不具备迁移性。怎么答对:备赛时用赛场同款灯光拍一批图,统计目标色的 HSV 分布,取覆盖大部分样本又尽量窄的区间;现场再留微调余量,报告里写明“阈值基于实拍统计加现场微调”。
5.2 只测满电状态,低电量行为失控
错在哪:所有测试用满电电池,比赛跑几轮后电压下降,速度和控制精度全变。为什么错:电机转速与电压相关,开环控制下电压降直接表现为动作偏差,而备赛时没暴露这个问题。怎么答对:测试计划里强制加入“半电测试”,用可调电源或跑放电循环模拟;控制上尽量用编码器闭环,低电量时主动降速保稳定。评审问一致性时,主动提低电量验证是加分项。
5.3 拾取无确认信号,假成功累积
错在哪:夹爪闭合就认为捡到了,实际球没进夹爪,小车带着空夹爪跑完全程。为什么错:动作执行和结果确认混为一谈,缺少反馈环节。怎么答对:加确认信号,限位开关、电流检测、对管遮挡任选其一;确认失败进入重试,连续失败退回搜索态。报告里把“动作—确认—重试”画成流程,评审一眼能看懂。
5.4 状态机漏转移条件,卡死在某态
错在哪:状态机只写了正常转移,没写超时和异常转移,小车卡在“接近态”原地打转直到时间耗尽。为什么错:现场不确定性没被建模,代码里的状态转移是理想路径。怎么答对:每个状态加超时,超时转失败处理;失败处理里再分“可重试”和“直接放弃”。调试时打印状态切换日志,卡死时能立刻定位在哪个态。
5.5 报告只写“实现了”,不写“怎么验证”
错在哪:报告里功能描述一堆,测试数据没有,评审问“怎么证明稳定”答不上来。为什么错:备赛时重实现轻验证,没留测试记录。怎么答对:每个功能配一组测试数据,比如“连续二十次识别成功十九次,失败一次为逆光”;报告里写清测试条件、次数、成功率、失败原因。评审看报告先看数据,有数据的功能描述可信度完全不一样。
6. 现场答题与调试策略:一套能直接照做的备赛流程
备赛到最后阶段,最值钱的不是再加一个功能,而是把已有功能压到稳定。我的习惯是赛前两周开始执行一套固定流程,这里直接给出来。第一步,列功能清单,按“基本分功能”和“扩展分功能”分两栏,基本分功能标红,扩展分功能标灰。第二步,对每个标红功能做二十次连续测试,记录成功率和失败原因,成功率低于九成的功能暂停加新功能,先修稳定性。第三步,做低电量测试和逆光测试各十次,专门暴露边界条件。第四步,把测试记录整理进报告,每个功能配一张成功率表。第五步,模拟现场流程完整跑五遍,从启动到归位计时,记录每遍卡壳的位置。
这套流程里最容易被跳过的是第三步和第五步。低电量测试麻烦,逆光测试要搭遮光环境,很多队伍觉得“现场不会那么倒霉”,结果现场偏偏就倒霉。完整流程模拟也是,单模块调通和串起来跑是两回事,串起来跑五遍能暴露一堆接口问题。下面这张表可以直接拿去当测试记录模板:
| 测试项 | 条件 | 次数 | 成功次数 | 失败原因 | 处理动作 |
|---|---|---|---|---|---|
| 目标识别 | 正常光照 | 20 | |||
| 目标识别 | 逆光 | 10 | |||
| 拾取动作 | 满电 | 20 | |||
| 拾取动作 | 半电 | 10 | |||
| 完整流程 | 正常光照满电 | 5 | |||
| 完整流程 | 正常光照半电 | 5 |
填表的时候别自欺欺人,失败原因写具体,“识别不到”要写成“逆光下阈值分割后目标面积小于 min_area”。处理动作写“调低 min_area 并复测”而不是“已解决”。这张表填满之后,报告里的测试章节基本就成型了,评审问答也有据可查。
现场调试还有两个小习惯值得坚持。一是改参数前先记录当前值,改完对比测试,别一次改三个参数,否则好了不知道哪个起的作用,坏了也不知道哪个背锅。二是每次上车测试前检查电源电压和机械紧固,这两个是现场翻车的高频原因,检查一遍花不了一分钟。从那以后我每次带队伍备赛,赛前两周都强制走一遍这套流程,功能可以少做,测试记录不能少。希望帮到你。
本文还有配套的精品资源,点击获取