智能车竞赛技术报告 | 智能车视觉 - 中南大学 - 中南大学比亚迪午马2021
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了智能车竞赛技术报告 | 智能车视觉 - 中南大学 - 中南大学比亚迪午马2021相关的知识,希望对你有一定的参考价值。
简 介: 本文设计的智能车系统以RT1064微控制器为核心控制单元,通过车体上方的灰度摄像头检测赛道信息,采用了光电编码器检测模型车的实时速度,使用PID 控制算法调节驱动左右电机的转速,实现了对车运动速度和运动方向的闭环控制。使用OpenArt Mini摄像头实现智能识别。为了提高模型车的速度和稳定性,使用QT上位机、键盘模块等调试工具,进行了大量硬件与软件测试。实验结果表明,该系统设计方案确实可行。
队伍名称:中南大学比亚迪午马2021
参赛队员:龚元昌
何泓江
丁佳宁
带队教师:王击
陈白帆
引言
全国大学生智能汽车竞赛是以“立足培养、重在参与、鼓励探索、追求卓越”为指导思想,鼓励创新的一项科技竞赛活动。竞赛要求在规定的汽车模型平台上,使用STC, Infineon, NXP系列单片机作为核心控制模块,通过增加道路传感器、电机驱动模块以及编写相应控制程序,制作完成一个能够自主识别道路的模型汽车。参赛队员的目标是模型汽车需要按照规则以最短时间完成单圈赛道。
十六届智能车的智能视觉组是智能车首次将图像识别神经网络融入比赛中的一个尝试,是一个全新的组别,对于我们更是一个全新的挑战。
在这份报告中,我们小组通过对小车设计制作整体思路、电路、算法、调试、车辆参数的介绍,详尽地阐述了我们的思想和创意,具体表现在电路的创新设计,以及算法方面的独特想法,而对单片机具体参数的调试也让我们付出了艰辛的劳动。这份报告凝聚着我们的心血和智慧,是我们共同努力后的成果。
在准备比赛的过程中,我们小组成员涉猎控制、模式识别、传感技术、汽车电子、电气、计算机、机械等多个学科。几个月来的经历,培养了我们电路设计、软件编程、系统调试等多方面的能力,锻炼了我们知识融合、实践动手的能力,最重要的是锻炼了我们的心志。在疫情的冲击下,备赛条件匮乏,面对困难,大家团结一致不退缩,遇到问题解决问题,这些对我们今后的学习、生活以及工作都有着重要的实际意义。
1. 智能车机械结构
智能汽车所有的硬件、软件程序算法都是需要一定的机械结构来执行和实现的,因此在设计整个软件架构和算法之前需要对整个车模的机械结构建立清晰的认识,从而针对具体的设计方案进行调整和优化。我们本着稳定、轻巧的原则,最大可能地降低重心,合理设计电路板的形状,安排好车的整体布局,使之既美观,又实用。
1.1 舵机安装
舵机安装直接关系到转向问题,对小车的转向角度和转向响应速度起着关键作用。舵机安装有两种方式,一种是卧式安装,另外一种为立式安装。卧式安装为车模默认安装方式,但这样安装会使左右两边轮子连杆不等长,立式舵机与卧式舵机相比,更利于保证线性关系,因此我们选择了立式安装。此外,车模的转向是通过舵机带动左右横拉杆实现。舵机的转动速度和功率是一定,要想加快转向机构的响应速度,则必须优化舵机的安装位置及其力矩延长杆的长度。因此,安装舵机时,还要综合考虑转向机构响应速度与舵机力矩之间的关系,通过优化得到最佳的转向效果。
▲ 图1-1 舵机安装
1.2 编码器安装
对于小车而言,需要通过编码器采集速度信息从而实现闭环控制,因此编码器的安装也至关重要。我们采用了逐飞1024线mini编码器,精度高,抗干扰能力强。安装编码器时要确保有合适的齿轮啮合,标准如下:传动轴和电机轴保持平行。开动电机时,若发出刺耳的声音,说明间隙过小,有卡齿;若感觉有明显的迟滞现象,则表明齿轮间隙过大。调整好的齿轮传动结构噪声很小,且不会有卡齿的声音,十分流畅。只有保证齿轮的完美啮合,才可以使得编码器返回的速度值更真实、稳定。
▲ 图1-2 编码器安装
1.3 云台安装
为完成视觉组识别任务并确保小车质量分布均匀,我们在舵机和灰度摄像头之间安装云台支架,支撑两个舵机控制OpenArt Mini与激光的转向。
▲ 图1-3 云台安装
1.4 摄像头安装
摄像头中心距离地面高度31cm,因此在小车行驶中,摄像头的杆子很容易晃动。为了减小这个晃动,我们使用两根细的碳素杆支撑主杆,这样主杆受力强度不会太大,摄像头晃动幅度大大减小了,从而确保了采集图像的质量。
▲ 图1-4 摄像头安装
1.5 前轮调整
为了保持小车直线行驶的稳定,转向时的轻便,且使转向轮自动回正,减少轮胎的磨损等,转向车轮、转向节和前轴三者与车架安装时保持一定的相对位置,转向轮定位参数有:主销后倾、主销内倾、前轮外倾、前轮前束4个参数。
1.5.1 主销后倾调节
主销后倾角是指主销的轴线相对于车轮的中心线向后倾斜的角度。前轮重心在主销的轴线上由于主销向后倾斜使前轮的重心不在车轮与地面的接触点上,于是产生了离心力,主销后倾形成的离心力可以保证汽车直线行驶的稳定性,还可以帮助车轮自动回正。主销后倾角延长线离地面实际接触越远,车速越高,离心力就越大。在中高速行驶中保持小车直线行驶的稳定性,适当加大主销后倾角可以帮助转向轮自动回正,可有效扼制转向器的摆振,可使转向轻便,单独适量调一侧主销后倾角可修理行驶跑偏。
▲ 图1-5 主销后倾
1.5.2 主销内倾调节
主销内倾角是指主销的轴线相对于车轮的中心线向内倾斜的角度。由于主销轴线向内倾斜,所以使前轴荷更接近前轮中心线。主销内倾轴线延长线在没超过前轮中心线的前提下,离前轮中心线越近,转向角越大,转向轮抬起的越高,车轮的回正力矩就越大。
▲ 图1-6 主销内倾
1.5.3 前轮外倾调节
前轮外倾是在过车轮轴线且垂直于车辆支承平面的平面内,车轮轴线与水平线之间所夹锐角,即由车前方看轮胎中心线与垂直线所成的角度,向外为正,向内为负。其角度的不同能改变轮胎与地面的接触点,直接影响轮胎的磨损状况,并改变了车重在车轴上的受力分布,避免轴承产生异常磨损。
外倾角的存在也会影响车的行进方向,因此左右轮的外倾角必须相等,在受力互相平衡的情况下不致影响车辆的直线行驶,再与车轮前束配合,使车轮直线行驶并避免轮胎磨损不均。
▲ 图1-7 前轮外倾
1.5.4 前轮前束调节
前轮前束是指前轮前端面与后端面在汽车横向方向的距离差,也可指车身前 进方向与前轮平面之间的夹角,此时也称前束角。从上往下看,两个车轮指向的方向在前端指向内称为车轮前束,指向外的则称为车轮后束。前轮前束的作用是保证汽车的行驶性能,减少轮胎的磨损。前轮在滚动时,其惯性力自然将轮胎向内偏斜,如果前束适当,轮胎滚动时的偏斜方向就会抵消,轮胎内外侧磨损的现象会减少。
▲ 图1-8 前轮前束
1.6 轮胎处理
1.6.1 轮胎打磨
车模原有的轮胎花纹比较深,为了增大轮胎与赛道的摩擦力,需要对轮胎进行打磨。我们将轮胎胎皮安装于后轮轮毂,利用电机驱动其旋转,用砂纸来进行打磨,省时省力,也能打磨得更加均匀。需要注意不能将花纹打磨消失,否则摩擦力会下降从而影响转向,也有可能违反相关规定。
1.6.2 轮胎软化处理
车模原有的轮胎材质较硬,所以需要进行软化处理。软化后的轮胎以较高速运行时,在拐弯时轮胎发生形变,接触面增大,可以确保车模的运行状态更加稳定。我们在调车结束后都会把软化剂涂抹在轮胎的表面,并用保鲜膜包裹,持续一周就能看到明显的效果。
1.6.3 涂抹硅橡胶
轮胎经过软化后易于发生形变,也会带来一些不利影响,例如车模在较高速运行时胎皮会因为离心力过大发生脱落,与轮毂的连接不再那么紧密。所以我们在轮毂和胎皮的接触处涂抹了704硅橡胶来粘合胎皮和轮毂,使胎皮在车模运行过程中与轮毂紧密连接,避免脱落情况的发生。
1.7 云台支架设计
云台由一个270度舵机DG-MG92B和一个180度舵机M3512D组成,利用SketchUp进行支架设计,分为两个部分:
第一部分:下接车模底盘,上承270度舵机DG-MG92B。
▲ 图1-9 云台第一部分
第二部分:前接激光、OpenArt Mini,后接180度舵机M3512D。
▲ 图1-10 云台第二部分
2. 硬件系统设计及实现
2.1 硬件整体设计
我们学校往届的硬件设计风格是做集成板,即将电驱板、主板、核心板、电磁板布局于一块 PCB 上,十分考验硬件设计能力,虽然轻巧,但是一旦损坏就要整块重做。所以我们队的硬件设计采用主板和电驱板分离的方案。只要保持两个PCB 板的接口一致就可以进行更新换代,更加灵活。
通过对智能视觉组的规则分析可知需要至少一个舵机来实现智能摄像头的转向和一个激光驱动电路。所以相比一般的基础四轮主板电路,我们的智能视觉主板电路额外加入了两个的舵机接口、智能摄像头通讯接口以及激光驱动电路。
2.2 电源管理
电源模块对于一个控制系统来说极其重要,关系到整个系统是否能够正常工作,因此在设计控制系统时应选好合适的电源模块。竞赛规则规定,比赛使用智能汽车竞赛统一配发的标准车模用7.2V 2000mAh Ni-cd供电或者使用锂电池(两节18650,2AH,配备保护板),由于智能视觉组相比基础四轮组任务多,负载的外设更多。我们最终选择了锂电池供电方案。采用2节18650电池串联接保护板作为总电源给主板供电。一节18650电池的规格是3000mAH,30A。电池保护板为20A限流。实物如图2-1所示:
▲ 图2-1 锂电池
2.3 主板设计
主板是智能车核心板和智能车沟通的桥梁,我们采用的核心板为逐飞科技的RT1064 V1.3核心板,排针接口,实物图如图2-2所示:
▲ 图2-2 RT1064核心板
可考虑到系统的可靠性是要求。我们对主板电路设计的所有环节做好各部分的接地、屏蔽、滤波等工作,使本系统工作的可靠性达到了设计要求。主板上有六类电源:总电源(电池电源)、核心板及智能摄像头电源(5V)、5V电源、3V3电源、摄像头电源(3V3)、舵机电源。除了3V3电源其他电源的输出都加入了磁珠进行隔离,增强了稳定性。由于我们的赛道识别采用纯摄像头方案,所以对摄像头的稳定性要求很高,专门开辟了一个3V3电源给摄像头供电。同时,核心板和智能摄像头相当于两个RT1064单片机,工作时我们可以感受到功率高带来的明显的发热,所以为了保证稳定性专门为其开辟了一个5V电源。原理图如下,5V电源稳压采用TPS76850 LDO,最高输入10V,输出电流1A,满足要。3V3电源采用5V转3V3 LDO RT9013-33GB,价格便宜且稳定。舵机芯片采用经典的AS1015。
除此之外还加入了用于上位机调试的无线串口接口以及显示屏接口。
▲ 图2-3 主板原理图
PCB仿真图以及实物图如图2-4和2-5所示:
▲ 图2-4 主板PCB仿真
2.4 电机驱动板设计
我们为了国赛准备了两套电机驱动方案:基于IR2104S的双极性型和基于DRV8701E的使能型。实际测试时发现IR2104S的电机控制要比DRV8701E更硬。所以国赛最终采用了IR2104S的方案。MOS管使用IRLR7843。电驱板上使用74LVC245 8路缓冲芯片隔离主板和电驱,使用SX1308升压芯片为IR2104
放弃的DRV8701E方案的电驱板实物图如下:
▲ 图2-9 DRV8701E电驱
2.5 智能视觉任务外设
为了完成智能视觉组的识别及打靶任务,主板上引出了两个舵机接口以控制二维云台。采用三极管电路控制激光打靶,智能摄像头通过引脚与主板相连进行供电、通讯和控制。即主板起供电作用,云台和激光的控制由智能摄像头完成。激光控制电路原理图如下:
▲ 图2-10 激光电路
激光头功率为5mw,实物图如下:
▲ 图2-11 激光头
使用的智能摄像头为逐飞科技的 OpenArt Mini 摄像头,其主控芯片为 RT1064,具有强大的神经网络部署和运行能力:
▲ 图2-12 OpenArt Mini
3. 软件系统设计及实现
3.1 软件整体设计
采用类似于操作系统的开发思路,将小车分为硬件控制和软件控制两部分分别进行初始化和控制。针对小车每个外设(电机、舵机、显示屏、按键等)编写独立的驱动文件,再将定时中断里的控制算法作为类似于线程一样处理进行打开、关闭等操作。显示屏菜单显示和赛道检测算法放在主函数里进行。
3.2 硬件外设控制
主要负责硬件控制的初始化,例如电驱控制引脚、摄像头通讯引脚、显示屏引脚的初始化。
3.3 软件参数控制
主要负责小车基本参数的初始化(例如从Flash读取数据等)以及定时器中断里的算法启停管理。
3.4 小车控制算法
电机控制采用增量式PI控制,实际速度由编码器测量得到(M法)从而控制电机,因为C车模的两个电机的电气参数可能不一致,所以将两个电机分开进行闭环控制
舵机控制采用位置式PD控制,设定打角由赛道检测算法计算出的结果给出,计算出偏差从而给出控制量。
PID控制是工程实际中应用最为广泛的调节器控制方法。问世至今70多年来,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。
PID控制原理框图如图:
▲ 图3-1 PID控制原理框图
单位反馈e代表理想输入与实际输出的误差,这个误差信号被送到控制器,控制器算出误差信号的积分值和微分值,并将它们与原误差信号进行线性组合,得到输出量u。
其中,Kp、Ki 、Kd分别称为比例系数、积分系数、微分系数。u接着被送到了执行机构,这样就获得了新的输出信号 ,这个新的输出信号被再次送到感应器以发现新的误差信号,这个过程就这样周而复始地进行。
数字控制系统中,PID控制器是通过计算机PID控制算法程序实现的。计算机直接数字控制系统大多数是采样-数据控制系统。进入计算机的连续-时间信号,必须经过采样和整量化后,变成数字量,方能进入计算机的存贮器和寄存器,而在数字计算机中的计算和处理,不论是积分还是微分,只能用数值计算去逼近。
用矩形数值积分代替上式中的积分项,对导数项用后向差分逼近,得到数字PID控制器的基本算式(位置算式):
其中T是采样时间,为三个待调参数,在实际代码实现算法时,
对位置式加以变换,可以得到PID算法的另一种实现形式(增量式):
3.5 上位机通信
为了便于调试我们专门开发了自己的一套上位机工具:
指令上位机:
▲ 图3-2 指令上位机
图像采集上位机:
▲ 图3-3 图像采集上位机
代码仿真上位机:
▲ 图3-4 代码仿真上位机
4. 赛道识别算法实现
4.1 车库
车库是赛道中特征非常明显的元素,扫描一定区域内每一行的黑白跳变点个数,正常赛道的跳变点个数必定小于某一阈值,当超过阈值时就认为识别到了斑马线。
入库过程中斑马线位置的变化会影响扫线,因此我们采用了固定打角及距离直接入库的方法,多次调试后即可精准入库。但此种方法容易受赛道摩擦系数等因素影响,稍有不慎就可能蹭到路肩,对控制方案也有较高要求。
▲ 图4-1 车库元素
4.2 环岛
环岛的识别和处理比较复杂,首先应检测到左侧或右侧有双边黑特域,再验证对边是否无岔口,且边线为向赛道内倾斜的直线,若满足即可能为环岛入口。为防止小车将出口误判为入口,需要一定的限制条件加以区分。
利用黑特域补线执行入环操作,小车驶入环岛后,切换到出环模式,利用基本控制方法过环岛。当小车看到左侧或右侧远岔口时,即可开始出环补线,这时需要适当加大控制量,以免小车冲出赛道。
▲ 图4-2 环岛元素
4.3 三岔
赛道中三角形的黑色大块区域是三岔的显著特征,首先识别到左右两侧都有远岔口,再扫描两个岔口之间黑色点个数所占比例,超过一定值即认为识别到三岔。利用三边黑特域进行补线,执行入三岔操作。同理可以方便地识别三岔出口,这时利用岔口补线,可有效避免三岔复入,且出三岔轨迹比较顺滑。
▲ 图4-3 三岔元素
4.4 十字
小车正入十字时,可以看到左右两侧都有双边黑特域,识别起来比较方便,不过一旦车身倾斜,十字特征和环岛、三岔特征都有很多相似之处,十分容易引起误判,对车身的姿态控制有很高要求,识别十字之后将两边口补线即可很好地驶过十字。
▲ 图4-4 十字元素
4.5 坡道
由于摄像头中心距离地面高度31cm,坡道对于小车而言如履平地,因此我们没有进行特殊处理,但急弯接坡道时小车有可能姿态不正,撞到路肩,也有可能飞出坡道,产生较大的冲击力,容易损坏机械部件,最好还是识别坡道,进行一定的减速处理。
4.6 二维码
二维码也属于特征比较明显的元素,首先从下向上扫描判断赛道中线是否为黑色点,若是再从该行的附近行的中线向两边扫描,记录黑白跳变点个数,大于一定值则可能是二维码。不过上述特征与斑马线完全重合,但二维码对应的赛道左右边界附近应为白色区域,无跳变,可以通过这一特征进行区别。
▲ 图4-5 二维码元素
5. AI视觉功能设计及实现
5.1 总体设计
AI视觉组的识别对象有三种:AprilTag、数字以及动物水果。我们采用的策略是除了 AprilTag 有现成的函数可以调用外,针对每一种元素设计一个识别网络。
使用的摄像头为逐飞科技的 OpenArt Mini,其性能优于 OpenMV,且支持神经网络训练。同时 OpenArt Mini 连接着两种外设:云台和激光,直接控制更有利于代码的编写
5.2 训练数据处理及识别
训练集的质量好坏直接关乎于神经网络的识别效果的准确与否。可以说再复杂,有效的神经网络结构被喂不合适的数据后部署在目标场景时效果依然会很差。一般来说,我们得预分析我们要识别的对象,将实际预测的对象作为预测集,最关键的一点就是要尽可能使训练集和预测集满足同一分布。即要识别什么就用什么训练。
当处于训练数据严重不足时(例如数字识别的10张图片),我们可以采用数据增强的方式来扩增数据集,常见的数据增强方法有旋转、平移、高斯噪声、剪裁等。我们主要采用了先加紫框后旋转的方法对训练图片进行处理。因为小车运行时智能摄像头的摇晃可能使抓取的图片有一定的倾斜,符合实际情况。
▲ 图5-1 数据增强后的图片
同时为了增强神经网络的泛化能力,我们在原本逐飞科技默认的神经网络结构中穿插了Dropout环节,在 Dropout 环节中,神经网络将每个隐藏神经元的输出设置为零(概率为 0.5)。 以这种方式“脱落”的神经元不会对前向传播做出贡献,也不会参与反向传播。因此,每次出现输入时,神经网络都会对不同的体系结构进行采样,但是所有这些体系结构都会共享权重。由于神经元不能依靠特定其他神经元的存在,因此该技术减少了神经元的复杂共适应。 因此,它被迫学习更强大的功能,这些功能可与其他神经元的许多不同随机子集结合使用。最后还有一种增强泛化能力的方法就是扩增数据集,我们尝试了编写网络爬虫脚本从网络上爬取了更多的图片扩充了数据集。
基本神经网络结构如图5-2所示:
▲ 图5-2 神经网络结构
5.3 AprilTag 识别
这个元素的识别可以调用MicroPython自带的函数 find_apriltag,该函数具有较强的鲁棒性。在输出结果中对不在0~9范围内的结果作了过滤,识别较为精确。
5.4 数字识别
数字识别神经网络采用上述的十分类神经网络,训练集使用用OpenArt Mini摄像头直接拍摄得到的图片,这样得到的训练集更加贴近真实情况。训练完后取得了较好的识别效果。
5.5 动物水果识别
动物水果识别神经网络采用上述的十分类神经网络,训练集采用经过数据增强后的官方数据集,具体增强效果如图5-1。训练完后取得了较好的识别效果。
5.6 打靶
由于激光和摄像头是固定在一块的,所以相比其他队伍激光摄像头分离的方案我们的打靶操作就简单了许多,也不需要做摄像头标定计算激光打靶的空间变换矩阵,直接摄像头检测镜头中心是否和靶子中心对准,然后向小车发送停止指令,最后打开激光打靶。实际测试效果不错,选择合适的接近阈值可以顺利完成打靶任务,且相对稳定。
5.7 针对国赛规则的应对策略
由于国赛的识别任务是采用电脑播放图片,且四个类别的图片顺序随机,这给原先利用元素标志来切换神经网络的队伍带来了困难。
我们解决这个问题的方法是将这几个类别的识别串接起来,当一个识别到负类时进入下一环节,可以看作是将多分类拆分为了多个串接起来的二分类,尽管牺牲了运行速度,但通过拆分保证了每一环节的识别准确率。
所以相比之前的神经网络结构输出加入了负类这一输出,数字识别神经网络变为11分类,负类的图片取自动物水果,AprilTag。
动物水果识别神经网络保持不变。
识别过程具体是先识别是否有 AprilTag,不是 AprilTag 则调用数字识别神经网络识别数字,不是数字则最后调用动物水果识别神经网络识别动物水果。通过神经网络输出的负类这一类别完成串接。实际测试大概300ms完成一张图片的识别,尽管速度较慢,但准确率相当高。
6. 开发工具、制作、安装、调试过程说明
6.1 Keil MDK软件
MDK-ARM软件为基于Cortex-M、Cortex-R4、ARM7、ARM9处理器设备提供了一个完整的开发环境。 MDK-ARM专为微控制器应用而设计,不仅易学易用,而且功能强大,能够满足大多数苛刻的嵌入式应用。
▲ 图6-1 Keil主界面
MDK需要对程序进行编译、下载,然后才能启动Debug对程序进行在线调试。可以对程序进行单步运行、多步运行、插入断点、观察变量等操作。
▲ 图6-2 Keil Debug
6.2 Qt软件
Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。
在应用程序输出窗口可以方便地观察感兴趣的数据,可通过串口的使用实时监测控制小车,这样就可以不用数据线也能观测小车信息。
▲ 图6-3 调试
6.3 OpenMV IDE
OpenMV IDE 是用于 OpenMV Cam 的首要集成开发环境。它具有强大的文本编辑器、调试终端和带直方图显示的帧缓冲区查看器
▲ 图6-4 OpenMV IDE
6.4 显示屏和按键
在软件中进行了菜单的编写,可通过小车上的显示屏实时显示小车当前的各类信息,并可以通过按键进行参数修改和模式转换等功能。
▲ 图6-5 显示屏
7. 模型车的主要技术参数
结束语
这是我们小队第一次参加智能车竞赛,从第一次见到车模的无从下手到日日夜夜与车模相伴,我们经历了太多。疫情断代,在缺乏学长的指导以及规则变化的情况下我们不得不从零开始,一步一步按照自己的想法去实现纯摄像头的赛道识别。虽然现在看来依然有点不稳定,但这一路走来感觉收获良多。
在这几个月的备战过程中,场地和经费方面都得到了学校和学院的支持,在此特别感谢一直支持和关注智能车比赛的王击老师以及学长们,同时也感谢比赛组委会能组织这样一项有意义的比赛。
也许我们的知识还不够丰富,考虑问题也不够全面,但是这份技术报告作为我们七个月辛勤汗水来的结晶,凝聚着我们小组每个人的心血和智慧,随着它的诞生,这份经验将永伴我们一生,成为我们最珍贵的回忆。
参考文献
[1] 邵贝贝. 单片机嵌入式应用的在线开发方法[M].北京.清华大学出版社.2004
[2] 王晓明. 电动机的单片机控制[M].北京. 北京航空航天大学出版社.2002
[3] 臧杰,阎岩. 汽车构造[M]. 北京. 机械工业出版社.2005
[4] 宗光华.机器人的创意设计与实践[M].北京. 北京航空航天大学出版社.2004
[5] 张文春. 汽车理论[M].北京.机械工业出版社.2005
[6] 周志华. 机器学习[M]. 清华大学出版社. 2016
■ 附录:程序源代码
static inline void SpeedControlCal(void)
{
float SpeedDelta; //速度偏差
/**************左轮控制计算*************/
SpeedDelta = CarInfo.SpeedSet - LeftSpeed; //计算偏差量
if (CarInfo.IsMotorDiffrientialOn == 'T')
SpeedDelta += MotorDifferential * (MotorDifferential >= 0 ? AdjustablePars.par_8 : 1);
LeftSpeedControlBais = SpeedControlPid.P * (SpeedDelta - LeftSpeedDeltaPrev); //增量式PID控制器
if (SpeedControlPid.I != 0)
{
if (SystemSettings.ChangeIEnable == 'T')
{
LeftSpeedControlBais += ChangeI(DetAbs((CarInfo.SpeedSet + MotorDifferential), LeftSpeed)) * SpeedControlPid.I * SpeedDelta;
}
else
{
LeftSpeedControlBais += SpeedControlPid.I * SpeedDelta;
}
}
if (SpeedControlPid.D != 0)
{
LeftSpeedControlBais += SpeedControlPid.D * (SpeedDelta + LeftSpeedDeltaPrevPrev - 2 * LeftSpeedDeltaPrev);
}
LeftSpeedDeltaPrevPrev = LeftSpeedDeltaPrev; //更新为上上次偏差
LeftSpeedDeltaPrev = SpeedDelta; //更新为上次偏差 //保存上一次偏差
LeftSpeedControlOut += LeftSpeedControlBais;
/**************右轮控制计算*************/
SpeedDelta = CarInfo.SpeedSet - RightSpeed; //计算偏差量
if (CarInfo.IsMotorDiffrientialOn == 'T')
SpeedDelta -= MotorDifferential * (MotorDifferential < 0 ? AdjustablePars.par_8 : 1);
RightSpeedControlBais = SpeedControlPid.P * (SpeedDelta - RightSpeedDeltaPrev); //增量式PID控制器
if (SpeedControlPid.I != 0)
{
if (SystemSettings.ChangeIEnable == 'T')
{
RightSpeedControlBais += ChangeI(DetAbs((CarInfo.SpeedSet - MotorDifferential), RightSpeed)) * SpeedControlPid.I * SpeedDelta;
}
else
{
RightSpeedControlBais += SpeedControlPid.I * SpeedDelta;
}
}
if (SpeedControlPid.D != 0)
{
RightSpeedControlBais += SpeedControlPid.D * (SpeedDelta + RightSpeedDeltaPrevPrev - 2 * RightSpeedDeltaPrev);
}
RightSpeedDeltaPrevPrev = RightSpeedDeltaPrev; //更新为上上次偏差
RightSpeedDeltaPrev = SpeedDelta; //更新为上次偏差 //保存上一次偏差
RightSpeedControlOut += RightSpeedControlBais; //增量输出
}
以上是关于智能车竞赛技术报告 | 智能车视觉 - 中南大学 - 中南大学比亚迪午马2021的主要内容,如果未能解决你的问题,请参考以下文章
智能车竞赛技术报告 | 智能车视觉 - 武汉理工大学 - WHY
智能车竞赛技术报告 | 智能车视觉 - 扬州大学 - 这辆盲车不吃水果
智能车竞赛技术报告 | 智能车视觉 - 中国计量大学 - 赛博-10
智能车竞赛技术报告 | 智能车视觉 - 中南大学 - 中南大学比亚迪午马2021