ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

基于英飞凌TC264的智能车竞赛实战:循迹、图像处理与调参

基于英飞凌TC264的智能车竞赛实战:循迹、图像处理与调参 去年秋天我混进英飞凌汽车电子开发者大会的时候本来想听的还是域控制器、功能安全、AURIX下一代MCU这些偏“整车”的话题。结果在展区边角看到一群学生蹲在地下调试一台巴掌大的智能车屏幕上跳着灰白相间的摄像头灰度图主机上插着一根根杜邦线。走近一看主控芯片就是英飞凌TC264。那一刻我突然意识到国内学嵌入式的大学生里有相当一批人的“第一个复杂实战项目”是在这种竞赛车模上完成的。这篇文章想聊的就是这类智能车背后的东西为什么英飞凌的芯片会成为全国大学生智能车竞赛的主力TC264这颗芯片在开发时会遇到哪些绕不开的问题摄像头循迹和电磁循迹这两条主流技术路线到底怎么选以及一个队伍从零备赛到能稳定跑完赛道的完整思路。不管你是刚准备入坑智能车的新生还是已经在调车但卡在图像处理或编译环境上的人这篇都应该有你能直接拿走的东西。1. 开发者大会展台旁的“竞赛车模”其实就是缩微的汽车电子系统1.1 为什么是英飞凌AURIX家族与那一场国民级竞赛那台小车乍一看很简陋塑料车模底盘、两个电机、一个舵机、一块电池加上叠在车头的摄像头。但你把它的电子系统拆开看实际上就是一个功能阉割过的整车电子电气架构。TC264属于英飞凌AURIX家族的TriCore架构双核200MHz带FPU浮点单元内置三组独立ADC多路PWM还有MPU内存保护、ECC纠错和硬件看门狗。这套配置放到真正的整车ECU里不算顶级但在大学生能接触到的MCU里确实属于“一步到位”的级别。全国大学生智能车竞赛使用英飞凌芯片很多年了大多数队伍最终都会集中到TC264这颗器件上。原因很简单性能足够跑摄像头图像处理例程和社区积累又多出了问题能查到别人踩过的坑。竞赛选用英飞凌这件事背后其实有更深的逻辑。AURIX系列本身是汽车电子领域的主流MCU平台从车身控制、动力总成到底盘系统大量量产车型的ECU都跑在AURIX上。学生在实验室里用TC264调车接触的是带功能安全设计理念的芯片——看门狗怎么配、内存保护怎么开、多核任务怎么分配这些在真正的汽车电子开发中都是基本功。所以很多人说智能车竞赛是“车载嵌入式的预演”这话不夸张。1.2 从TC264到整车域控竞赛里积累的其实是同一套方法论在开发者大会现场一边是给学生准备的竞赛车模另一边是英飞凌展出的面向新一代电子电气架构的域控制器方案。这两个东西放在同一个展厅里其实暗示了一条清晰的成长路径。智能车上要处理的问题拆解下来和整车开发并没有本质区别传感器的数据采集、实时控制算法、执行机构的精准输出、系统的可靠性与故障处理。摄像头相当于车载摄像头感知系统电感相当于车身周围的磁场传感器PID控制算法和整车上的横纵向控制是同一个数学逻辑看门狗和冗余设计则对应功能安全里最基础的“万一出事怎么办”。这也是我为什么建议刚接触这块的读者不要只把智能车当成“比赛工具”。你在这台小车上学的这些模块拆解能力放到以后的汽车电子、机器人、工业控制项目里都是可以直接迁移的。TC264这颗芯片的寄存器手册、iLLD库的源码、数据手册里的时序图如果真能啃下一部分后面看任何一款新MCU都会轻松很多。2. TC264开发环境从零搭建ADS下载、工程创建和第一个点灯程序2.1 ADS到底是什么为什么网上铺天盖地都是“下载”帖打开任何一个智能车相关的技术社区搜索“英飞凌”三个字排在前面的一定是“英飞凌ADS下载”相关的帖子。ADS全称AURIX Development Studio是英飞凌官方提供的免费集成开发环境底层是Eclipse。它不需要许可证也不需要破解注册一个账号就能下载。很多新手卡在第一步不是因为ADS有多难装而是因为下载入口确实藏得有点深。英飞凌官网的页面结构经常调整入口有时在“Tools Software”下面有时又跳转到专门的下载中心。搜索结果经常是十几条相关链接点进去要么是版本更新日志要么是补丁说明真正能下载安装包的按钮要往下翻半天。我在实际使用中的建议是直接搜索“AURIX Development Studio download”认准官网域名下的页面选和你操作系统匹配的版本。安装时注意两点一是安装路径不要带中文和空格二是ADS会自带一个Eclipse平台不要把它和电脑上已有的其他Eclipse混用。很多人后面编译报错根源其实就是环境变量和工具链路径被污染了。2.2 新建工程的正确姿势从官方例程改而不是从零建ADS装好之后新手最容易犯的一个错误是试图从“新建空工程”开始一个项目。我见过很多队伍花了两三个星期从零配置一个能编译能下载的工程最后发现还是跑不起来。正确的做法是在官方例程的基础上改。ADS自带相当丰富的例程库GPIO点灯、ADC采集、PWM输出、UART打印、SPI通信、DMA传输这些基础外设都有现成的代码。你打开一个LED Blinky例程编译下载到板子上确认开发环境整个链路是通的再在这个工程上面叠加自己需要的模块。这样做的好处是能排除大量环境问题因为你编译的代码是官方验证过的。从零新建工程需要自己配置的东西比较多链接脚本、启动文件、芯片型号定义、头文件搜索路径、编译选项。这些配置错了任何一个都可能出现“编译通过但下载后不运行”的诡异问题。而例程工程里这些都已经配好了你只需要关注自己的业务逻辑。2.3 编译、烧录和调试连不上芯片时先查这三件事开发环境搭好、例程工程能编译接下来就是烧录调试。这一步最常见的现象是点下载按钮然后报错“Cannot connect to target”或者直接超时。我自己排查这类问题按以下顺序来检查调试器驱动。TC264开发板主要有两种调试方式一种是Lite Kit板载的调试器一种是外接DAP调试器。无论哪种在电脑上都要有对应的驱动。插上调试器后在设备管理器里确认设备被正确识别。检查供电。TC264芯片对供电要求不算苛刻但如果开发板通过USB供电而你又同时给电机驱动模块供电容易形成地电位差导致调试器无法建立连接。我的习惯是调试阶段用USB给核心板供电电机部分单独供电并确保共地。检查看门狗。这是很多人忽略的一个细节。如果例程里启用了看门狗Safety Watchdog你在调试时停在断点上时间过长超过了喂狗周期MCU会被强制复位。表现出来就是“一进调试就重启完全没法断点调试”。解决方法是调试模式下把看门狗临时关掉或者在代码里把喂狗周期写长一点。除此之外还有几个工程上的细节值得提工程和源码文件路径不要用中文ADS的版本之间有不兼容的情况队内要统一一个版本下载器固件偶尔会掉线重新插拔或者刷新固件能解决。3. 摄像头循迹和电磁循迹的选型之争3.1 摄像头组总钻风加DMA这条经典链路智能车竞赛里最主流的方向之一就是摄像头组。摄像头的选择这几年大家基本集中到两款总钻风MT9V03x系列和山外鹰眼。它们都是灰度摄像头输出的是8位灰度图像分辨率可以配置成188x120这类比较小的尺寸帧率能跑到很高。摄像头组的数据链路我拆成四段图像采集、数据搬运、图像处理、控制输出。图像采集由摄像头完成它把光信号变成灰度值。数据搬运环节摄像头通过DMA直接丢到内存数组里不占用CPU。图像处理环节是核心CPU把灰度图二值化提取赛道边界计算中线。控制输出环节根据中线偏差计算转向量根据赛道元素判断和速度规划给出目标速度最终输出给舵机和电机。这条链路上最容易出问题的是图像采集和处理的时间竞争。摄像头每秒输出几十帧图像而单片机的处理需要时间。如果处理一帧图像的时间超过了图像采集周期就会丢帧或者出现图像撕裂。我的经验是先量好一次完整图像处理的时间再设置合理的帧率把两者错开。很多队伍用外部中断配合场中断来判断一帧图像的到来在VSYNC中断里启动DMA搬运搬运完成后立即开始处理。3.2 电磁组LC谐振感应与偏差解算相比摄像头组的“视觉方案”电磁组走的是另一条路线。赛道中心会铺一根导线通以20kHz、100mA左右的交变电流产生一个交变磁场。车上的电感通过电磁感应原理把磁场变化转换成感应电压经过放大、整流、滤波后送到单片机的ADC采集。左右电感的电压值差异就是判断车相对赛道中心位置偏移量的依据。电磁组最经典的传感器布局是水平电感加竖直电感的组合。水平电感对赛道的横向偏差比较敏感竖直电感则能感知前方的赛道走向。将几个电感按一定几何位置安装在车头通过归一化差分计算出横向偏差量再把这个偏差量喂给PD控制器输出舵机转角。电磁组相比摄像头组的一个优势是计算量小不需要处理海量图像数据因此同样的TC264跑电磁组会有大量富余算力可以用来做更复杂的控制策略和状态机。另一个优势是场景适应性好不受环境光照影响——这对比赛来说非常重要因为赛场灯光条件完全不可控。但电磁组也有自己的难题最大的坑是电磁信号容易受到电机和驱动电路的干扰。电机工作时会产生较强的电磁辐射叠加到传感器信号里。我的做法是传感器供电和电机供电隔离走线分开信号线用双绞线同时在ADC采样后加一个滑动平均或者低通滤波。如果你发现速度一上来数值就乱跳大概率就是干扰问题没处理好。两条路线怎么选我整理了一个对比表对比维度摄像头组电磁组感知信息量高能看到赛道形状和元素低只能感知磁场变化算法复杂度高需要图像处理低偏差计算简单环境适应性受光照影响较大基本不受光照影响硬件成本较高摄像头加图像处理较低电感加运放电路调车难度需要调参和反复采集图像硬件电路要细心信号容易受干扰速度上限高信息量大可以提前规划中高靠提前感知和快速控制如果你是第一次参加智能车竞赛又没人带可以优先考虑电磁组。电路简单算法相对清晰更容易在短时间内跑起来。如果在实验室有人带、或者已经有一定嵌入式基础摄像头组能学到的东西更多也更有挑战性。4. 图像处理从采集到元素识别中间隔着一整个方法论4.1 二值化不是“选个阈值”那么简单摄像头组的图像处理第一个绕不开的话题是二值化。灰度图像每个像素是0到255的灰度值二值化的目标就是把灰度图变成只有黑和白两种值的图像让程序能快速找到赛道边界。最简单的做法是固定阈值灰度值大于某个数就置为白色小于就置为黑色。但这样做的缺点非常明显——赛道的光照不均匀同一个场地不同区域的光线强度差异很大固定阈值在A段好用到B段可能就失效了。比较靠谱的方案是大津法OTSU。它的核心思想是遍历所有可能的阈值计算按该阈值分割后前景和背景之间的类间方差方差越大说明分割效果越好取使类间方差最大的那个阈值作为二值化阈值。这样阈值会随着图像内容自动调整能适应光照变化。实际使用大津法时要注意两点。第一大津法假设图像只有两个主要类别如果画面里除了赛道还有大面积噪点或复杂背景效果会变差。我在代码里通常会先对图像做一次轻微的降噪处理比如中值滤波再做大津计算。第二大津法的计算有一定耗时但TC264跑一张188x120的图像完全没问题实测毫秒级能完成。4.2 中线提取与十字、环岛的判断逻辑二值化之后就是找赛道边界。最常见的方式是逐行扫描从图像最底部开始从左往右找第一个黑色像素作为左边界从右往左找第一个黑色像素作为右边界左右边界的平均值就是这一行的中线点。这个逻辑听起来简单实际写起来全是细节。比如某一行只有左边有赛道、右边完全是指定的背景色说明这一行发生了“丢线”。丢线的处理策略是智能车摄像头算法里很经典的考校点是直接沿用上一行的中线值还是根据斜率推算还是选择置信度高的近端行做参考我的选择是从图像底部往上扫描底部是最靠近车身的区域数据置信度最高一旦发生丢线就根据已计算的近几行中线做线性外推而不是直接把这一行的边界视为有效。元素识别则是更高一层的逻辑。十字路口的特征往往是左右边界同时向外大幅扩展扫描时出现“边界突变”环岛的特征是内圈的赛道边界出现一个半径较小的圆弧坡道则表现为赛道在图像中的比例突然变化远端黑色区域变大。不同元素需要不同的状态处理和补线策略但底层的思路是相通的先判断元素再决定这一帧图像里哪些边界是可信的哪些需要特殊处理。这也是很多新手调车调了很久速度一直上不来的原因——他们写了边界提取但没写元素识别导致车在十字路口或者环岛处直接冲出赛道。处理图像时不能只看“这一行”还要结合行之间的连续性和前后帧的时序关系这就是整套方法的进阶点。5. 备赛一年攒下的坑都在这里了5.1 环境问题路径、编译器和“一晚上白调”的惨痛经历先说一个我自己踩过的坑。实验室里有一台公用电脑某天有个队员把工程放到了桌面但Windows用户名是中文。编译时一切正常下载也没问题但每次一跑起来车就在同一个地方抽搐。排查了三天最后发现是工程路径里的中文导致磁盘文件读取偶尔异常。把工程移到纯英文路径后一切恢复正常。这种细节问题特别容易让人崩溃因为它不是逻辑错误而是环境问题。ADS对路径中的中文字符兼容性一直不太好建议队伍里定一条硬性规定工程路径只能是英文字母、数字和下划线工程文件夹不要放在桌面最好放在某个固定工作目录里。另一个容易被忽略的环境问题是编译器版本。ADS更新后编译器版本跟着变有时会把一些旧代码的警告变成报错或者出现莫名其妙的优化问题。如果比赛临近最稳妥的做法是锁定一个经过验证的ADS版本队内所有人统一不要中途升级。5.2 硬件问题供电、编码器和信号干扰硬件方面最大的坑往往不在主控芯片而在供电。智能车上一堆模块TC264核心板、摄像头、舵机、电机驱动、编码器、蓝牙模块等等。电机启动瞬间电流很大如果供电设计不合理会导致电压跌落进而让MCU复位。表现就是车一加速就重启或者摄像头图像突然花掉。这种情况我优先检查电源电路用示波器看电机的电流波形和电压跌落幅度。电机驱动要单独供电或者至少加一个大容量电解电容在电机电源附近吸收瞬态冲击。编码器的安装也值得多说一句。编码器是用来测电机转速的如果编码器齿轮和电机齿轮的咬合间隙太大高速转动时会打滑导致速度反馈数值异常PID输出抖动。每过一个赛道元素编码器数值就跳一下这会让速度环完全失真。我在安装编码器后会手动转动车轮观察编码器读数是否平顺再固定位置。信号干扰主要集中在电磁组。前一章说过电磁信号容易受电机干扰。我的解决方法是传感器信号线远离电机和驱动线尽量走短而直的双绞线ADC采样前在软件上做滤波传感器供电和功率电路隔离必要时用LDO单独给传感器供电避免电机启停的纹波串进传感器。5.3 调参问题PID不是调得越快越好控制算法上智能车最核心的就是转向环和速度环两个PID。很多新手上来就把P调得很大车确实转得很快但过弯时抖动、过冲、甩尾全来了。我的调参顺序是这样的先把转向环调稳。只给定一个固定速度让车跑直线和缓弯调P让车能稳定跟随中线。然后加一点D抑制过冲。再调速度环。速度环的周期比转向环慢目标是稳定出弯速度不抖。最后调高速弯道。提高速度后重新看转向效果通常需要适当减小P加大D。另外完整跑一圈需要把赛道分成不同区段比如直道、入弯、弯心、出弯。直道可以全速弯道入口需要提前减速弯心保持稳定出弯再加速。这个“提前刹车”逻辑对圈速提升非常明显比单纯追求PID响应速度快更重要。PID参数的整定还有一个容易被忽略的细节执行机构的物理限制。舵机有转角限制电机有转速上限PID输出需要做限幅否则会陷入积分饱和。很多“车跑着跑着就失控”的现场事故其实不是参数不对而是PID输出超限后长期停在边界导致的不稳定。我建议所有PID输出都做限幅并在积分项上加上限和清零逻辑。写在后面开发者大会之外的一点体会那辆在英飞凌开发者大会上被围观的智能车后来也在赛场上跑完整圈了但没能上领奖台。调车的日子里熬过的夜、改过的代码、查过的波形远多于赛场上那几十秒的冲刺。可正是这些“跑不好”的现场逼着我养成了从现象到根因的排查习惯先确认环境再检查信号最后怀疑逻辑一步一步来不去赌运气。如果你现在也在实验室里面对一台怎么都跑不稳的智能车我的建议是别急着加新功能。先把供电、干扰这些基础问题解决了再用最简单可靠的逻辑跑通一圈再去优化速度。积累下来的这份调试能力和工程意识会比那一年的名次更持久地留在你的工具箱里。
返回列表