尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

智能车竞赛开源项目深度解析:硬件设计、传感器融合与串级PID实战

发布时间:2026/9/29 2:33:02

资讯中心
01
ARTICLE

智能车竞赛开源项目深度解析:硬件设计、传感器融合与串级PID实战

智能车竞赛开源项目深度解析:硬件设计、传感器融合与串级PID实战
如果你常在GitHub上翻智能车仓库大概率见过lanr/soberup这个名字。第21届竞赛结束后我们以“soberup战队”的名义把整套项目完整开源了目录最开始照着队内习惯随手写了“疯狂电路组”——说是组别不如说是自嘲队里搞硬件的几个人什么都敢焊、什么都敢改后来连算法侧的活也被我们用电路设计“抢”掉了一半。这篇文章想把这份开源目录讲透里面到底开源了什么、为什么我们敢把家底亮出来以及你在复现和二次开发时最容易踩的坑。不管你是刚接触智能车的大一新生还是已经跑过一两年的老队员这篇应该都有点用至少能帮你少走几个月的弯路。1. 为什么敢开源全套项目目录背后的底气与动机1.1 开源的初衷不是分享代码而是分享“决策过程”很多人以为开源就是把代码往仓库一扔写个README就完事。我们最初没打算开源毕竟比赛资料是花了大半年时间、烧了不少板子和轮胎才换来的。但第21届赛场上遇到几支队伍他们的车出问题后连排查思路都没有临时抱佛脚翻群文件、翻往年开源项目那一刻我意识到对新手来说最缺的不是最终版本的代码而是“遇到问题之后先查什么、再查什么”的完整思路。所以这份开源目录刻意做成了“过程型开源”而不是“结果型开源”。你会在doc/里看到整整一年的调参记录包括哪一天改了哪个电感的高度、哪一天因为陀螺仪温漂把车跑飞、甚至还有几次烧板子的照片和原因分析。代码只是载体真正值钱的是我们踩过的坑和当时的判断逻辑。1.2 仓库目录的整体结构与阅读顺序以我们当时的开源版本为例根目录大致是这样的soberup/ ├── README.md ├── doc/ │ ├── 硬件手册.md │ ├── 调参手册.md │ ├── 赛道元素识别说明.md │ └── 调试日志/按日期整理的记录 ├── hardware/ │ ├── schematic/主控板、驱动板、传感器板原理图 │ ├── pcb/PCB工程文件 │ ├── BOM.xlsx │ └── 3D_print/车模结构件模型 ├── firmware/ │ ├── core/启动文件、时钟、中断 │ ├── drivers/外设驱动摄像头、编码器、陀螺仪等 │ ├── modules/ │ │ ├── camera_process.c │ │ ├── electromagnetic.c │ │ ├── control.c │ │ ├── element_detect.c │ │ └── state_machine.c │ ├── main.c │ └── project/Keil工程文件 ├── host/PC上位机源码 └── tools/图像调试、参数监视小工具建议的阅读顺序是先读README.md了解整体选型和设计目标再翻doc/调参手册.md搞懂每类参数是什么意思接着看hardware/理解硬件架构最后才打开firmware/看代码。千万直接上来就翻control.c没有前边的背景信息你根本不知道那些PID系数是怎么配出来的。2. “疯狂电路组”的硬件设计架构、电源与抗干扰2.1 整车电气拓扑与核心选型队名叫“疯狂电路组”根源就在硬件方案上。我们的车采用“摄像头为主、电磁为辅”的感知方案整车的电子系统可以分成几个独立的模块主控STM32H750VBT6主频跑在480MHz兼顾图像处理和串级PID运算摄像头灰度摄像头通过DMA采集实际参与计算的分辨率只有80×60电磁传感器水平电感配合竖直电感用于环岛、车库等元素的辅助判断惯性测量六轴陀螺仪重点使用Z轴角速度给方向内环提供反馈执行机构前轮舵机负责转向后轮电机通过编码器闭环控速电源7.2V电池组经过多路降压/稳压后分别供给数字、模拟和功率部分选STM32H750而不选K66或TC264主要原因是仓库里大量代码是从老项目迁移过来的H750的引脚兼容性好而且内置大容量Flash图像缓存可以直接放在内部SRAM里访问速度快画质和延迟都能兼顾。2.2 电源树设计为什么数字地和模拟地必须分开很多自制板子跑起来不稳定问题不在代码而在电源。我们的第一版主控板把所有地直接铺在一起结果电磁传感器读数在电机加速时剧烈跳动图像也出现横纹干扰。后来查了一圈才确认是数字电路的高频开关噪声串进了模拟采样回路。第二版改成严格的电源树分离7.2V电池 ├─ 功率部分电机驱动直接取电池加一个大容量电解电容 ├─ 数字部分DC-DC降压到5V再LDO稳压到3.3V └─ 模拟部分电池先过LC滤波再LDO稳压到3.3V/5V数字地和模拟地在主控板单点连接电磁传感器的信号线用屏蔽线屏蔽层只在传感器端单端接地。这样处理之后原本在示波器上看到的几十毫伏毛刺基本消失电磁数据的稳定性提升非常明显。你在复刻我们这套硬件时即使不打算完全照搬我也强烈建议把模拟供电和数字供电分开这个习惯能帮你省掉大量排查时间。2.3 传感器板与电机驱动板的“疯狂”细节传感器板是整个电路设计里最“疯”的部分。我们没有直接把电感信号送进ADC完事而是在板上用运放搭了二级放大和二阶低通滤波把工频干扰和电机PWM耦合进来的高频分量都挡在ADC之前。这样做的好处是主控读到的数据几乎不需要软件滤波既省CPU时间又降低了相位延迟。电机驱动用的是分离MOS方案而不是一体化的集成驱动芯片。分离方案虽然调试麻烦一些但好处是内阻可控、驱动电流大、而且可以根据实际发热情况换不同封装。我记得为了压驱动管的温升我们在PCB上铺了加宽的铜皮还特意把MOS放在风口位置让车跑起来时气流自然带走热量。3. 摄像头与电磁的互补逻辑稳定识别赛道元素3.1 灰度图像的轻量处理思路摄像头的图像处理我们刻意做得比较“土”没有上神经网络也没有用复杂的透视变换原因是竞赛车的算力再强也有上限与其把时间花在花哨的算法上不如把传统的二值化、搜线、补线做到极致。具体流程是摄像头输出灰度图先统计直方图用自适应阈值做二值化再按行扫描提取左右赛道边界。逆光或者强反光环境下固定阈值会失效所以我们的二值化阈值是每帧动态计算的。不要小看这个细节很多队伍到了现场发现跑不稳十有八九是二值化阈值没有自适应。搜线之后如果某一行只找到一侧边界就根据相邻行的边界宽度做外推补齐如果两侧都丢线就进入“丢线处理”状态用电磁数据和上一次有效中线做融合。这里体现了双传感器的价值单摄像头丢线时电磁仍然能告诉你赛道大致在车的哪一侧。3.2 电磁差比和从原始值到归一化偏差电磁部分的核心是把电感的感应电压转换成赛道偏差。我们用了经典的差比和方式以水平电感排列为例err (A - B) / (A B)A和B分别代表左右电感的归一化幅值。之所以用比值而不是直接做差是因为差比和能消除电感高度、电池电压和环境磁场变化带来的共模影响。比如电池从8V掉到7V所有电感的绝对输出都会减小但比值基本不变。这一点在比赛后期尤其重要因为电池电压全程都在降。竖直电感的作用和水平电感不同它主要用来感知前方的导线变化对环岛和十字路口更敏感。我们用竖直电感的比值作为“赛道类型置信度”当摄像头特征模糊时这个置信度决定切换哪种控制策略。3.3 环岛状态机入环、环内、出环的判定环岛是很多队伍的噩梦因为它的视觉特征和普通弯道太像了。我们的方案是用状态机管理环岛全过程入环检测摄像头识别到环岛入口的弧形引导线同时竖直电感出现明显的信号回落两个条件同时满足才进入“入环预备”状态避免误判。环内循迹进入环岛后控制策略从正常赛道循迹切换为“靠环内边界行驶”此时中线的目标不再是赛道中心而是偏心线通过控制器让车稳定绕环。出环判定当摄像头重新看到外侧完整边界且陀螺仪累计转角达到预设值时判断已经接近出环点切换回正常循迹。如果只靠摄像头环岛入口的弧形在不同光照下可能看不出来如果只靠电磁普通大弯和环岛入口很难区分。我们这套“图像特征电磁特征航向角累计”的三重逻辑在跑场测试中把环岛成功率从单传感器的不到六成提到了九成以上。3.4 双传感器融合为什么更稳经常有人问为什么不像很多强队那样只靠摄像头一路莽原因很简单摄像头怕逆光、怕反光、怕帧率不够而电磁怕干扰、怕大前瞻失效。两者单独使用都有明显短板但它们的失败模式几乎不重叠。摄像头看不清的时候电磁通常很稳电磁被外部干扰的时候摄像头反而正常。我们在融合时没有做复杂的卡尔曼滤波只做了一个“置信度加权”正常情况下方向偏差80%来自摄像头、20%来自电磁当图像丢线面积超过阈值时权重自动切换为摄像头20%、电磁80%。这个思路非常简单但实测效果很好在直道入环和强光路段尤其明显。4. 控制链路核心从赛道偏差到PID输出角速度4.1 为什么方向环的输出不是PWM而是角速度很多新手写的转向控制是“偏差大就转大角度”直接把偏差映射到舵机PWM这种做法在低速下没问题一旦速度上来就露馅了同样的偏差在慢速和快速时所需的转向力矩完全不同而且直接给PWM会导致转向动作生硬车会一顿一顿的。我们的方向控制设计成串级结构外环是“赛道偏差到期望角速度”的位置环内环是“期望角速度到执行机构输出”的速度环。也就是热词里说的“PID输出角速度”。角速度由陀螺仪的Z轴实时测量形成一个闭环的阻尼系统。这样设计最直接的好处是转向动作和车速解耦。车速高时相同的赛道偏差只会产生较小的角速度期望防止侧滑车速低时同样的偏差会产生更充分的转向保证过弯半径足够。你可以把这个结构简单理解成开车外环决定方向盘的意图内环决定方向盘实际打多快两者配合才能让车既跟线又平顺。4.2 串级PID的具体结构与代码对应关系方向串级控制的伪代码结构大致如下// 外环位置环输出期望角速度 float desired_yaw_rate position_pid_update(deviation); // 内环角速度环输出舵机PWM float servo_pwm rate_pid_update(desired_yaw_rate, gyro_z); // 速度环独立控制后轮电机 float motor_pwm speed_pid_update(target_speed, encoder_speed);代码结构上control.c里维护了三个独立的PID结构体。位置环只用了P和D不给I因为赛道偏差本身就是周期性变化的积分项容易造成过冲角速度环用P和I用I消除陀螺仪零偏引起的静态误差速度环P、I、D都开但D项加了一阶低通滤波防止编码器量化噪声被放大。陀螺仪角速度的滤波也很重要。裸数据直接使用会引入高频噪声但我们不能用它自带的重力校准而是做了一阶互补滤波把角速度积分得到的角度和加速度计估算的角度做了融合。这里要提醒一句智能车竞赛环境下陀螺仪积分时间长了会漂所以方向内环尽量直接用角速度不要依赖积分后的角度。4.3 参数整定的实际顺序与记录串级PID最大的坑是如果你内外环同时调根本不知道是哪个环出了问题。我们整定顺序固定为“先速度环再角速度环最后位置环”每一步都有明确目标。速度环锁定舵机不动只踏板子让车在直道上跑固定占空比调速度环的P让实际速度跟踪目标速度。速度误差稳定在±2%以内就算合格。角速度环给一个固定的期望角速度信号比如每秒1.2弧度手动推车旋转观察实际角速度是否快速跟上且无震荡。这个环节用上位机实时曲线看比看示波器直观。位置环把速度和角速度环都挂上车下地慢速跑只调位置环的P。先给一个很小的P让车能回正然后逐渐加大直到车在直道上出现轻微S形震荡退回70%左右作为工作点。最后加D用来抑制过冲和震荡。日志里我们记录得非常细包括当天温度、轮胎状态、电池电压、每个环的P值。你可以看到同一组参数上午和下午的圈速能差0.3秒原因往往是电池电压不同导致舵机响应速度变化。所以每个阶段跑完我们都会做一次完整的参数回读和记录避免“上午还能跑下午就飞出去”的尴尬。5. 调试实录跑遍场地才换来的几个关键经验5.1 电磁传感器怕的不只是金属护栏很多人把电磁干扰归结为赛道旁边的金属护栏实际上我们遇到的最隐蔽干扰源是地面以下的预埋线、大功率无线模块和旁边队伍的无线充电设备。有一次跑车电感值莫名其妙跳了20%排查半天发现是旁边工位有人在测大功率发射器。应对手段除了硬件上的屏蔽和差分采样软件上也加了“毛刺剔除”如果某一路电感的瞬时变化超过正常范围的三倍就认定是外部干扰保持上一拍的值。这个硬判断在逻辑上很简单但救了我们好几次。建议你在测试时多换几个场地跑最好故意找有干扰的环境把软件鲁棒性打出来。5.2 陀螺仪的安装与温漂处理温漂是陀螺仪绕不开的坎。开机时陀螺仪零偏可能只有每秒2度跑五分钟后变成每秒8度如果不处理角速度环的积分会慢慢把车带偏。我们的做法是每次上电后静止5秒做零偏校准并在每圈回到发车区时自动重新校准一次。同时尽量避免长时间依赖积分角度能用角速度环就绝不用角度环。安装方式上陀螺仪要用双面胶加螺丝双重固定并尽量放在整车重心附近。把它粘在车尾或者悬空车子一颠簸角速度数据就会剧烈抖动内环反馈就废了。5.3 轮胎和机械是第一位算法只能排在后面这条经验写在doc/调参手册.md的第一页如果轮胎不打理、束角倾角没调好PID调得再好也是白搭。我们有一段时间一直觉得是算法问题导致入弯甩尾天天调PID、调权重后来才发现是后轮轮胎内侧粘了一层赛道灰抓地力下降导致的。每轮测试前至少要用湿布把轮胎擦干净并晾干赛道上的灰尘也要顺手清一下。束角建议调成微小的内束车子直线稳定性会好很多外倾角不要太大否则过弯时轮胎接地面积变化明显。这些机械细节花费半小时就能让圈速提升半秒比调两天参数都管用。5.4 比赛现场的意外与后备方案比赛现场和训练场地永远不一样。光线、地面、观众区电磁环境都可能变。我们吃了现场的亏之后养成了一个习惯备三套完整的参数组分别对应强光、正常光照、弱光环境现场视情况一键切换。另外备用车模上的参数配置也保持一致一旦主力车出问题可以直接换车不换逻辑。还有一点烧录调试口一定要留出来。我们在比赛前一天发现舵机中位偏了平时用下载器在线调现场只能临时开调试口改参数如果不留这个口就麻烦了。这种细节仓库的硬件手册.md里都写了备注希望你别等到赛场才想起。6. 从零复现这份开源清单、路径与二次开发建议6.1 硬件清单与预算参考如果你想照着仓库做一台车下面是主要的硬件清单和大致预算参考不包含车模本身和工具模块选型参考大致预算主控板STM32H750核心板自制底板100~200元摄像头灰度摄像头50~150元电磁传感器工字电感运放板50~100元陀螺仪六轴IMU模块20~50元电机驱动分离MOS方案50~150元编码器电机自带或外置50~150元舵机数字舵机30~100元电池/充电器7.2V电池组150~300元车模标准竞赛车模500~1000元提示一下如果预算有限主控可以先用手头现有的STM32F4系列跑图像处理和PID不成问题只是图像分辨率和大缓存会受限。硬件的原理图、PCB和BOM表都在仓库里直接交给嘉立创打样就行但需要你自己核对封装库和器件位号毕竟我们当时的PCB版本更新过好几轮。6.2 软件环境与烧录流程软件部分基于Keil MDK工程理论上导入后直接编译就能烧录。如果你不想用Keil仓库里也提供了GCC编译链的配置说明可以用命令行完成构建。烧录方式推荐用ST-Link通过SWD接口下载速度很快而且能顺带看实时变量。第一次上电千万别急着让车跑。我们建议的流程是先把上位机工具打开确认摄像头画面正常、二值化阈值合理然后平放车身观察陀螺仪角速度输出是否平滑接着只给舵机通电手动转动前轮确认中位最后才让电机通电跑直道。每一步都确认正常再进入PID整定流程。6.3 哪些模块可以直接复用哪些必须自己改直接复用图像二值化与搜线框架、电磁差比和解算、串级PID框架、环岛状态机、上位机通信协议。这些模块与具体车辆机械结构无关只要接口匹配就能跑。必须自己改所有PID参数、舵机中位和限幅、赛道元素阈值、摄像头安装高度和角度。特别是摄像头前瞻我们用了比较激进的大前瞻这在直道和小弯上有优势但在S形弯和环岛出弯处很容易丢线。你如果机械结构、重心位置不同必须重新标定。车模的轮距和轴距直接决定了转弯半径这会影响位置环极限参数。不要尝试把我们的参数原封不动搬到你车上那是会翻车的。仓库里每个参数都有“影响说明”和“调整方向”照着规律自己调比自己瞎猜快得多。6.4 参与开源issue、PR与协议说明仓库使用的开源协议在LICENSE文件里有具体说明我们在软件和硬件文档上的期望是你可以自由使用、修改但要保留原出处说明做二开源时也要公开你的修改这样可以保证整个社区共同受益。如果你复现过程中遇到问题强烈建议先仔细看doc/下的手册很多问题都在调试日志里有记录。确认不是文档已经解释过的问题之后再提issue最好附上现场视频和关键日志。有能力的同学也可以直接提PR比如给上位机加一个曲线录制功能或者是优化图像丢线处理逻辑这类贡献对我们来说非常重要。最后说点实际的。如果你准备照着这份开源目录做车我的建议是不要直接追求“复现”而是在复现的基础上每隔一周问自己一个问题这个参数为什么是这样这个结构为什么这么设计当你能回答出来的时候进步就会非常快。开源资料摆在那里真正拉开差距的是你从中吸收了哪些思路而不是最终代码和我有多像。希望这份开源目录能帮到你也期待你在自己的车子上做出比我们更好的方案。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。