智能车竞赛技术报告 | 节能信标组 - 兰州交通大学 - 先锋队

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了智能车竞赛技术报告 | 节能信标组 - 兰州交通大学 - 先锋队相关的知识,希望对你有一定的参考价值。

简 介: 本文以第十六届全国大学生智能车大赛为背景,介绍了兰州交通大学节能信标组在比赛中的实现方案。本次比赛采用了3D打印的自制车模,主控芯片采用了英飞凌的TC264芯片,软件平台采用的IAR。本文中主要介绍本次比赛中我们智能车控制系统软硬件结构和开发流程,本文涉及智能车设计中的车模结构设计,硬件设计,无线充电设计,摄像头图像处理,PID算法控制以及中途补电策略等许多方面。整个控制系统的工作原理是利用摄像头采集数据并处理,来判断灯的位置,然后完成灭灯。

关键词 节能信标无线充电TC264摄像头3D打印

简 介: Based on the background of the 16th National College Student Smart Car Competition, this article introduces the implementation plan of the energy-saving beacon group of Lanzhou Jiaotong University in the competition. This competition uses a 3D printed self-made car model, the main control chip uses Infineon’s TC264 chip, and the software platform uses IAR. This article mainly introduces the software and hardware structure and development process of our smart car control system in this competition. This article involves car model structure design, hardware design, wireless charging design, camera image processing, PID algorithm control, and midway charging strategy in smart car design. And many other aspects. The working principle of the entire control system is to use the camera to collect data and process it to determine the position of the light, and then turn off the light.

      
学 校:兰州交通大学
队伍名称:先锋队   
参赛队员:苟军辉   
降志文   
包熠群   
带队教师:王思明   
张金敏   

第一章


智能车是以汽车电子为背景,涵盖控制、模式识别、传感技术、电子、电气、计算机、机械等多学科的科技创意性设计,由主要路径识别、速度采集、角度控制及车速控制等模块组成。其设计与开发涉及控制、模式识别、传感技术、汽车电子、电气、计算机、机械等多个学科,可以分为三大部分:传感器检测部分,执行部分,CPU。

全国大学生“恩智浦”杯智能汽车竞赛以“立足培养,重在参与,鼓励探索,追求卓越”为指导思想,旨在促进高等学校素质教育,培养大学生的综合知识运用能力、基本工程实践能力和创新意识,激发大学生从事科学研究与探索的兴趣和潜能,倡导理论联系实际、求真务实的学风和团队协作的人文精神,为优秀人才的脱颖而出创造条件,是一项鼓励创新的科技竞赛活动。

节能信标组要求在使用英飞凌半导体公司的微控制器作为核心控制模块,通过增加道路传感器、电机驱动模块以及编写相应控制程序,制作完成一个能够自主识别信标的模型汽车。

本篇技术报告主要从机械、硬件、软件、调试工具等方面,详细的介绍了车模的设计和制作方案,以及我们做车过程积累的经验,希望对以后的参赛选手能够带来启发和帮助。

第二章 计方案


2.1系统总体方案的选定

根据竞赛规则的相关规定,智能车系统采用自制车模和LCC谐振补偿的“傻充”,以英飞凌的TC264作为核心控制器,在ADS的环境下进行开发。车模利用摄像头进行采集信息,用于车模寻找信标灯,通过4路电磁运放模块来确定停车补电的位置。通过编码器测速模块来检测车速;电机转速控制采用 PID 控制,通过 PWM 控制驱动电路调整电机的转速,完成智能车的闭环控制来寻找信标灯并且完成灭灯。

2.2系统总体方案的设计

根据以上系统方案设计,智能车一共分为七个模块,分别为主控模块、传感器模块,无线充电模块、电源模块、电机驱动模块、速度检测模块和辅助调试模块。作用分别如下:

  1. 主控模块:采用英飞凌TC264芯片,作为整个智能车的“大脑”,将采集传感器的信号,根据控制算法做出控制决策,驱动电机完成对智能车的控制。
  2. 传感器模块:感知的赛道信息,为智能车的“大脑”做出决策提供必要的依据和充足的反应时间。
  3. 无线充电模块:从信标灯上面的放射端获得能量供智能车行驶。
  4. 电源模块:为整个系统提供稳定且合适的电压。
  5. 电机驱动模块:驱动电机完成智能车的运动控制。
  6. 速度检测模块:反馈智能车的速度用于完成闭环控制。
  7. 辅助调试模块:主要用于智能车的调试与监测。

第三章 智能车的机械结构与安装

智能汽车各系统的控制都是在机械结构的基础上实现的,因此在设计整个软件架构和算法之前,一定要对整个模型车的机械结构有一个全面清晰的认识。我们在本次的节能信标比赛中采用的自制车模,选择了PLA材料进行3D打印。整体车模为三轮结构,前方的单轮为万向轮,转向方法为差速转向。

3.1智能车车模的打印

整个车模由三部分组织而成

1. 整体车架:

2. 车身:

3. 左电机外壳与右电机外壳:

3.2电机的选型与安装

由于普通的直流电机比较费电,例如RS380,所以我们针对节能选用效率更高更省电的空心杯电机。在挑选电机的过程中,我们主要对比了冯哈勃和MAXON的几款电机的参数,最终决定使用冯哈勃的2224V009SR。

3.3摄像头的安装

摄像安装在整个车模的前方,由一个碳素杆为主要支撑,两个碳素杆为辅助支撑,使摄像头牢固的固定在车模上。

3.4编码器的安装

编码器安装在电机外壳预留出的编码器的位置,由尼龙齿轮将其与电机关联起来。

3.5“轮胎”的选型与保养

本此比赛车模采用的“轮胎”材料为橡胶与海绵,在使用的过程中主要暴露出的问题有:在轮胎沾有过多的灰尘时,会出现严重的打滑现象。所以在调试过程中要经常使用湿毛巾擦拭轮胎,以避免智能车出现打滑的现象。在不调试的时候智能车一般远离地面,保证轮胎少沾灰尘。

3.6磁标的选择与安装

磁标选用的是3.9cm*1.8cm的长方体磁标,整个车模是一共有4个磁标,车头2个,车尾2个。车尾的磁标分别在线圈上面和线圈旁边,这样更有利于充电补电和灭灯。

第四章 件设计说明


可靠性是系统设计的第一要求,我们对电路设计的所有环节都进行了电磁兼容性设计,做好各部分的接地、屏蔽、滤波等工作,将高速数字电路与模拟电路分开,是本系统工作的可靠性达到了设计要求。

为了减少硬件元件的浪费,整个硬件系统由各种模块构成,保证了某一模块损坏只取换某一个模块即可,主板和两个稳压模块与超级电容拼接组装可直接构成一个整体。

4.1硬件电路整体框架

硬件电路整体框架如图所示:

4.2主控板和驱动板的硬件设计

4.2.1主控板的设计

主控芯片采用的是英飞凌的TC264芯片,我们使用的是逐飞科技的TC264核心板,直接插在主控板上。为了实现任务安装传感器和参数调节方便,我们的主控板上还包括3.3V稳压、摄像头、无线串口、蜂鸣器、ICM20602、TFT显示屏、编码器和电机等接口电路。

由于主板的PCB设计要考虑设计影响的完整性,所以需要合理的设计元器件的布局及走线,阻抗匹配。尽可能缩短高频元器件之间的连接,设法减少他们的分布多数及和相互间的电磁干扰。易受干扰的元器件不能相互离的太近,输入和输出应尽量远离。一些元器件或导线有可能有较高的电位差,应加大他们的距离,以免放电引起意外短路。高电压的元器件应尽量放在手触及不到的地方。元器件的布局要均衡,疏密有度,不能头重脚轻。一个电路板的成功,要注重内在质量,还要兼顾整体的美观。

▲ 主板原理图1

▲ 主板原理图2

4.2.2电源管理模块

电源模块对于一个控制系统来说极其重要,关系到整个系统是否能够正常工作,因此在设计控制系统时应选好合适的电源模块。我们的电源管理模块由两部分组成,一部分为5V稳压为主控板供电,一部分为8.7V稳压为电机驱动供电。电源管理模块的芯片采用的是TI公司的TPS63070升降压芯片,该芯片输入电源为2V至16V,输出电源为2.5V至9V,转换效率高,性能良好。模块电路中使用电位器使输出电源可调。

▲ TPS63070原理图

4.2.3电机驱动模块

电机驱动电路的作用指通过控制电机的旋转角度和运转速度,以此来实现对占空比的控制,来达到对电机变速控制的方式。电机驱动电路既可以通过继电器或功率晶体管控制,也可利用可控硅或功率型MOS场效应管进行驱动。我们的电机驱动采用的是DRV8701芯片构成的MOS驱动。

DRV8701门级驱动芯片无需升压,宽电压范围且体积小,驱动的方式为1路PWM信号控制转速,1路高低电平信号控制电机正反转,更加简单易用。

MOS管采用的是东芝的TPH1R403NL小体积MOS管,该MOS管内阻低,不易发热。

▲ DRV8701驱动原理图

4.2.4电磁运放模块

电磁运放模块采用的是OPA2350运放芯片构成的四路电磁运放。OPA2350为高速、低噪声运算放大器,性能优良。接收部分由1mh的工字电感与6.8nf的电容组成,由手工焊接,放置在车模的底盘上。

▲ 电磁运放原理图

4.3无线充电模块设计

4.3.1无线充电的原理

无线充电技术的应用在现今电动汽车领域、手持电子设备、人体医疗器械、通信领域也都有着非常广泛的应用,利用电磁互感现象,通过磁场耦合的两个线圈可以完成电能的传输。将感应接收线圈放在发射线圈中间,它们之间存在电磁耦合。在发射线圈通电以后,就会在接收线圈中产生感应电动势。经过整流之后,便可以形成可以充电的直流电流。从而实现对设备的充电。

▲ 无线充电示意图

4.3.2无线充电接收模块设计

本次智能车比赛采用的是150kHZ 50W的发射端,根据本次比赛的发射端和桌大的推文,我们的无线充电接收模块采用的LCC补偿的“傻充”。

根据推文内容,“傻充”是由接收线圈与高频电容构成的串联谐振部分、补偿电感和电容(并联电容)部分、整流部分和滤波部分。

▲ LCC补偿无线充电接收模块原理图

接收线圈采用的是龙邱的外径为11.2cm,感抗约13uH的接收线圈,补偿电感为自制电感,使用200股的镀银lizi线缠绕。经过计算和实验,串联电感约为110nf,并联电感约为822nf,整流二级管采用的是10A 100V的肖特基二极管SK1010。最终的接收功率为35W左右。

▲ 自制电感图

4.4其他电路设计

根据比赛要求,车模不可以有电池供电,比赛中采用超级电容组供电。我们采用的是5*50F的串联超级电容组,使用HT7027A芯片作为限流保护芯片。

▲ 超级电容原理图

4.5硬件电路部分总结

功能正确这是印制板设计最基本、最重要的要求,准确实现电原理图的连接关系,避免出现“短路”和“断路”这两个简单而致命的错误。可靠是PCB设计中较高一层的要求。连接正确的电路板不一定可靠性好,例如板材选择不合理,板厚及安装固定不正确,元器件布局布线不当等都可能导致PCB 不能可靠地工作,早期失效甚至根本不能正确工作。有些问题虽然发生在后期制作中,但却是PCB 设计中带来的。而每一个造成困难的原因都源于设计者的失误。没有绝对合理的设计,只有不断合理化的过程。它需要设计者的责任心和严谨的作风,以及实践中不断总结、提高的经验。

第五章 能车控制软件设计说明


5.1控制流程图

▲ 图5.1.1 程序流程图

5.2摄像头处理算法

我们采用总钻风摄像头来识别场地中的信标和障碍,总钻风摄像头采集回来 的图像是大小是188*120,以左上角为坐标原点向右下方为图像坐标正方向。在理想的图像中,应该只存在信标,但是由于环境光线,杂点,远处图像太小等因素干扰,图像效果难免会不理想。所以我们不仅通过调节、镜头焦距等方式来获得识别效果最佳的图像。通过图像膨胀对远处的图像进行膨胀操作;采用均值滤波,采用动态阈值二值化,忽略无效点等手段排除干扰因素,对赛场信息进行有效的识别。

5.3寻灯算法实现

由于摄像头采集到的是一个188*120的图像矩阵,首先通过均值滤波对图像进行二值化,同时对图像图像有效像素点进行计数,如果有效点数过少则对图像进行膨胀操作,之后对于信标灯进行每一个像素点横坐标及纵坐标进行累加,以及像素点的个数进行累加,之后通过横纵坐标累加和除以像素点个数,即可得到信标灯的坐标。其中纵坐标为当前车模的方向,用信标灯的纵坐标与图像画面中轴线的纵坐标做差,得到小车车头朝向与信标灯方向的偏差,用此偏差放入PD控制器来控制舵机打角即可。

5.4控制算法

5.4.1 PID算法介绍

在过程控制中,PID 控制器是一直应用最为广泛的一种控制器,也是众多控 制算法中应用最为普遍的控制算法当被控对象的结构和参数不能完全掌握,或 得不到精确的数学模型时,控制理论的其它技术难以采用时,系统控制器的结构 和参数必须依靠经验和现场调试来确定,这时应用PID控制技术最为方便。即当我们不完全了解一个系统和被控对象,或不能通过有效的测量手段来获得系统参数时,最适合用PID控制技术。PID控制,实际中也有PI和PD控制。
PID控制器是一种线性控制器,它根据给定值与实际输出值构成控制偏差。 将偏差的比例§、积分(I)和微分(D)通过线性组合构成控制量,对被控对象进行控制,故称PID控制器。

由于单片机控制是采样控制,只能根据采样时刻的偏差控制输出量,不能计 算连续输出量,所以要采用离散化的 PID算法。离散PID分为位置式和增量式 两种。位置式的输出量直接就是控制量,由于全量输出,所以每次输出均与过去 的状态有关,计算时要对过去偏差进行累加,计算机工作量大;而且因为计算机输出量对应的是执行机构的实际输出,如计算机出现故障,输出大幅度变化会引 起执行机构位置的大幅度变化,这种情况往往是生产实践中不允许的,在某些场合,还可能造成严重的生产事故。因而产生了增量式PID控制的控制算法,所谓增量式PID是指数字控制器的输出只是控制量的增量。由于计算机输出增量所以误动作时影响小算式中不需要累加。控制增量的确定仅与最近k次的采样值有关,所以较容易通过加权处理而获得比较好的控制效果。

5.4.2 PD方向控制

我们的智能车模为三轮,因此采用两轮差速的方式进行转向,要实现灭灯最快就需要智能车模直接奔向灯的中心,由此才能实现路径最短,通过摄像头采集的图像进行信标定位后,将车模车头朝向与信标灯的朝向的偏差通过PD控制器计算输出量,将其分别加到两轮上,以此实现差速,进行转向,以此保证小车的路径最优,灭灯速度最快。

5.4.3 PI增量式速度控制

由于增量式 PID 相对于位置式 PID 有明显的优势,所以我们选择增量式PID作为速度控制算法,用编码器获取速度作为反馈量,实现闭环控制,通过PI闭环,单片机得到反馈量可以计算出快速消除误差的控制输出量。
另外,我们根据灯的位置远近,采取不同的控制策略。以此来实现车模在灭完灯后可以迅速旋转找灯,并且可以在灯上实现补充电操作,以此来提高小车的续航能力;当灯的位置比较接近车时,通过三段速度来使小车上的的速度不至于太高,可以停在灯上;当信标灯距离车模较远时则将速度提高,高速运行。当灯的初始位置离车比较远时,采用三段速控制,前半段高速接近信标,中间设置缓冲速度,接近信标后再减到低速上灯。

5.5 中途补电策略

5.5.1运行途中补电

在上文介绍了通过对速度的控制使车模可以慢速的上灯,在灯上进行旋转找灯的过程中进行少量的充电。

5.5.2停车补电

在运行途中如果电容电压小于一定值后,进行停车补电操作,在灭灯之后由于磁标触发无线充电,会继续发射150KHz的交流信号,则可以通过电感进行信标灯定位,由于转向环,可以保证在灭灯前的最后一个瞬间一定是正对着灯,故采用两个电感,分别安装在车头和车尾,即可通过无线信号可以确定车模的位置,则可以通过此来停车,实现无线充电。

第六章 发工具、制作、安装、调试


6.1 开发工具

开发环境:AURIX Development Studio开发软件;
下载仿真工具:逐飞科技infineon仿真器。

6.2 调试过程

6.2.1 控制算法的参数整定

1、在整定PID控制器参数时,可以根据控制器的参数与系统动态性能和稳态性能之间的定性关系,用实验的方法来调节控制器的参数。有经验的调试人员一般可以较快地得到较为满意的调试结果。在调试中最重要的问题是在系统性能不能令人满意时,知道应该调节哪一个参数,该参数应该增大还是减小。

2、为了减少需要整定的参数,首先可以采用PI控制器。
为了保证系统的安全,在调试开始时应设置比较保守的参数,例如比例系数不要太大,积分时间不要太小,以避免出现系统不稳定或超调量过大的异常情况。

3、给出一个阶跃给定信号,根据被控量的输出波形可以获得系统性能的信息,例如超调量和调节时间。应根据PID参数与系统性能的关系,反复调节PID的参数。
如果阶跃响应的超调量太大,经过多次振荡才能稳定或者根本不稳定,应减小比例系数、增大积分时间。如果阶跃响应没有超调量,但是被控量上升过于缓慢,过渡过程时间太长,应按相反的方向调整参数。

4、如果消除误差的速度较慢,可以适当减小积分时间,增强积分作用。
反复调节比例系数和积分时间,如果超调量仍然较大,可以加入微分控制,微分时间从0逐渐增大,反复调节控制器的比例、积分和微分部分的参数。

5、总之,PID参数的调试是一个综合的、各参数互相影响的过程,实际调试过程中的多次尝试是非常重要的,也是必须的。

6.2.2 增量式与位置式的参数整定

增量式与位置式主要区别:    
1、位置式PID的积分项是以前所有的误差和,容易产生大的累积误差,而增量式仅与最近几次有关,影响小     
2、位置式PID需要进行积分限幅和输出限幅,而增量式PID只需要输出限幅。

速度环位置式与增量式调参
在调位置式速度环时我们先加大Kp值,同时令Ki、Kd为0,查看编码器值和目标值的差值,当反馈回来的编码器值在目标值上下震荡时加入Ki值即可。   通过上面的代码理解我们可以知道增量式的I就是位置式的P,因此对于增量式我们先加I,再加P,实际现象中当我们的i给很小时电机都能达到目标值。

我们通过调参要达到的效果是:可以明显看到波形趋于平滑且编码器上下震荡范围小,当我们突然改变目标速度时,编码器值能很快且平滑到达改变后的目标值。

6.3 整车机械方面的调整

首先确定整体的车模设计,确定为三轮车。前一为软质万向轮,后二为C车车轮。整体采用上下两层插拔式连接,然后绘制草图。草图绘制完成后利用SolidWorks建模,后用3D打印机打印出车模。

确定车模可以正常使用后,根据实际使用中发现的不足处进行草图修改,重新打印车模,反复多次最终确定出可以稳定使用,可靠工作的最终车模。

第七章 模的主要参数说明


7.1 智能车外形参数

  • 车长:29.5cm
  • 车宽:25.4cm
  • 车高:36.7cm
  • 车重:约1100g

7.2 电路部分参数

我们的智能车采用5个50F超级电容供电。电机驱动供电8.7V,主板供电5V。

7.3 传感器个数以及种类

我们的智能车共使用4个10mH的电感,编码器2个,摄像头一个。

7.4 除了车模原有的驱动电机、舵机之外伺服电机数量

车模为自制车模,除了车模原有的驱动电机之外没有使用伺服电机。

7.5 磁标个数以及大小

我们的智能车一共有4个磁标,大小为3.9cm*1.8cm。


自开始报名参加智能汽车竞赛以来,我们小组成员查找资料,设计机构,组装车模,编写程序,分析问题,最后终于完成了最初目标,定下了现在这个方案。

在此份技术报告中,我们主要介绍了准备比赛时的基本思路,包括机械,电路,以及最重要的控制算法的思想。
在传感器布局,由于是自制车模且没有摄像头高度限制,我们根据实际情况调整摄像头的高度与在车模上的位置,最后以三角架的结构将其固定。

在电路方面,我们以模块形式分类,几个模块分别设计,在查找资料的基础上各准备了几套方案;然后我们分别实验,最后以报告中所提到的形式决定了我们最终的电路图。

在算法方面,我们使用C语言编程,利用比赛推荐的开发工具调试程序,经过小组成员不断讨论、改进,终于设计出一套比较通用的,稳定的程序。在这套算法中,我们结合路况调整车速,保证在最短时间跑完全程。

在这几个月的备战中,在场地、经费方面都的到了学校和学院的大力支持,在此特别感谢一直支持和关注智能车比赛的学校和学院领导以及各位老师。同时也感谢比赛组委会能组织这样一项很有意义的比赛。

和智能车朝夕相处的这些日子,回想起来,很是珍惜怀念。最初,通过网上的论坛,大神的技术报告,学长的讲解。慢慢对智能车有了一个大致的了解。当把自己的车第一次搭起来的时候,第一次在赛道上跑起来的时候,很是雀跃。从当初的盲调,无数次的摸索到如今的对车的整体,每一个细节都有了深刻的认知。这辆车承载着我们这支队伍所有的心血与付出。我们对这辆车饱含了太多太多的感情。

考文献


[1]卓晴,黄开胜,邵贝贝等编.学做智能车一挑战“飞思卡尔”杯[M].北京:北京航空航天大学出版社,2007. [2]王盼宝、樊越骁、曹楠等编智能车制作[M]清华大学出版社,2018.
[3]胡寿松自动控制原理(第6版) [M]科学出版社,2013.
[4] 胡向东 传感器与检测技术[M]机械工业出版社,2013.
[5] 沈红卫.基于单片机的智能系统设计与实现[M].北京:电子工业出社,2005.
[6] 贾翔宇,季厌庸,丁芳,前馈改进PID算法在智能车控制上的应用[J].计算机与信息技术,2018年9月,(1):28-30.
[7]陈晓涛,陈明雷,熊慧.摄像头寻迹智能车的系统设计[J].科技创新与应用,2012 (30) :48-50.
[8]吴焕芹,汤家有,刘裕.飞思 卡尔摄像头智能车的设计和实验测试[J].中国科技论文,2016, 11(19) :2230 -2235.
[9]王洪军,张迪洲,李永科.基于摄像头传感器的智能车设计[J].科技信息,2012(20) :160-161.
[10]苏小红,车万翔,王甜甜. C语言程序设计学习指导[M].高等教育出版社,2011.

■ 附录 程序源代码

void Get_Bin_Image (unsigned char mode)
  {
      unsigned short i = 0, j = 0;
      unsigned long  tv = 0;
      //char txt[16];

      if (mode == 0)
      {
          Threshold = GetOSTU(mt9v03x_image);  //大津法阈值
      }
      else if (mode == 1)
      {
          //累加
          for (i = 33; i < MT9V03X_H; i++)
          {
              for (j = 0 ; j < Image_W; j++)
              {
                  tv += mt9v03x_image[i][j];   //累加
              }
          }
          Threshold =(unsigned short)(tv / 87 / 120);   //求平均值,光线越暗越小,全黑约35,对着屏幕约160,一般情况下大约100
          Threshold = Threshold + lqv;      //此处阈值设置,根据环境的光线来设定
      }
      else if (mode == 2)
      {
 //         Threshold = 110;
          //累加
                    for (i = 0; i < MT9V03X_H; i++)
                    {
                        for (j = 0; j < MT9V03X_W; j++)
                        {
                            tv += mt9v03x_image[i][j];   //累加
                        }
                    }
                    Threshold =(unsigned short)(tv / MT9V03X_H / MT9V03X_W);   //求平均值,光线越暗越小,全黑约35,对着屏幕约160,一般情况下大约100
                    Threshold = Threshold + lqv;      //此处阈值设置,根据环境的光线来设定//手动调节阈值
          lq_sobel(mt9v03x_image, Bin_Image, (unsigned char) Threshold);

          return;

      }
      else if (mode == 3)
      {
          lq_sobelAutoThreshold(mt9v03x_image, Bin_Image);  //动态调节阈值
          return;
      }
      white_1 = 0;
      /* 二值化 */
      for (i = 33; i < MT9V03X_H; i++)
      {
          for (j = 0; j < Image_W; j++)
          {
              if (mt9v03x_image[i][j] > Threshold) //数值越大,显示的内容越多,较浅的图像也能显示出来
              {
                  Bin_Image[i][j] = 255;
                  white_1++; //数出第一次二值化完后的白点数 white_1
              }
              else
                  Bin_Image[i][j] = 0;
          }
      }
  }
  
  short GetOSTU (unsigned char tmImage[MT9V03X_H][MT9V03X_W])
  {
      signed short i, j;
      unsigned long Amount = 0;
      unsigned long PixelBack = 0;
      unsigned long PixelshortegralBack = 0;
      unsigned long Pixelshortegral = 0;
      signed long PixelshortegralFore = 0;
      signed long PixelFore = 0;
      float OmegaBack, OmegaFore, MicroBack, MicroFore, SigmaB, Sigma; // 类间方差;
      signed short MinValue, MaxValue;
      signed short Threshold = 0;
      unsigned char HistoGram[256];              //

      for (j = 0; j < 256; j++)
          HistoGram[j] = 0; //初始化灰度直方图

      for (j = 0; j < MT9V03X_H; j++)
      {
          for (i = 0; i < MT9V03X_W; i++)
          {
              HistoGram[tmImage[j][i]]++; //统计灰度级中每个像素在整幅图像中的个数
          }
      }

      for (MinValue = 0; MinValue < 256 && HistoGram[MinValue] == 0; MinValue++);        //获取最小灰度的值
      for (MaxValue = 255; MaxValue > MinValue && HistoGram[MinValue] == 0; MaxValue--); //获取最大灰度的值

      if (MaxValue == MinValue)
          return MaxValue;         // 图像中只有一个颜色
      if (MinValue + 1 == MaxValue)
          return MinValue;        // 图像中只有二个颜色

      for (j = MinValue; j <= MaxValue; j++)
          Amount += HistoGram[j];        //  像素总数

      Pixelshortegral = 0;
      for (j = MinValue; j <= MaxValue; j++)
      {
          Pixelshortegral += HistoGram[j] * j;        //灰度值总数
      }
      SigmaB = -1;
      for (j = MinValue; j < MaxValue; j++)
      {
          PixelBack = PixelBack + HistoGram[j];     //前景像素点数
          PixelFore = Amount - PixelBack;           //背景像素点数
          OmegaBack = (float) PixelBack / Amount;   //前景像素百分比
          OmegaFore = (float) PixelFore / Amount;   //背景像素百分比
          PixelshortegralBack += HistoGram[j] * j;  //前景灰度值
          PixelshortegralFore = Pixelshortegral - PixelshortegralBack;  //背景灰度值
          MicroBack = (float) PixelshortegralBack / PixelBack;   //前景灰度百分比
          MicroFore = (float) PixelshortegralFore / PixelFore;   //背景灰度百分比
          Sigma = OmegaBack * OmegaFore * (MicroBack - MicroFore) * (MicroBack - MicroFore);   //计算类间方差
          if (Sigma > SigmaB)                    //遍历最大的类间方差g //找出最大类间方差以及对应的阈值
          {
              SigmaB = Sigma;
              Threshold = j;
          }
      }
      return Threshold;                        //返回最佳阈值;
  }

  /*!
   * @brief    基于soble边沿检测算子的一种边沿检测
   *
   * @param    imageIn    输入数组
   *           imageOut   输出数组      保存的二值化后的边沿信息
   *           Threshold  阈值
   *
   * @return
   *
   * @note
   *
   * @example
   *
   * @date     2020/5/15
   */
  void lq_sobel (unsigned char imageIn[MT9V03X_H][MT9V03X_W], unsigned char imageOut[MT9V03X_H][MT9V03X_W], unsigned char Threshold)
  {
      /** 卷积核大小 */
      short KERNEL_SIZE = 3;
      short xStart = KERNEL_SIZE / 2;
      short xEnd = MT9V03X_W - KERNEL_SIZE / 2;
      short yStart = KERNEL_SIZE / 2;
      short yEnd = MT9V03X_H - KERNEL_SIZE / 2;
      short i, j, k;
      short temp[4];
      for (i = yStart; i < yEnd; i++)
      {
          for (j = xStart; j < xEnd; j++)
          {
              /智能车竞赛技术报告 | 节能信标组 - 北京科技大学节能信标组

智能车竞赛技术报告 | 节能信标组 - 合肥工业大学 - 烂虾队

智能车竞赛技术报告 | 节能信标组 - 华南理工大学 - 华工雨花队

智能车竞赛技术报告 | 节能信标组-哈尔滨工业大学紫丁香五队

智能车竞赛技术报告 | 节能信标组 - 宿迁学院 - MAkkaPakka

智能车竞赛技术报告 | 节能信标组 - 浙江大学 - 浙大三队