简 介: 本文设计的智能车系统以LPC54606J512微控制器为核心控制单元,基于MT9V034摄像头的图像采样获取赛道图像信息,提取赛道中心线,计算出小车与黑线间的位置偏差,采用PD方式对舵机转向进行反馈控制。使用PID控制算法调节驱动电机的转速,结合特定算法分析出前方赛道信息,实现对模型车运动速度的闭环控制。采用OPEN ART mini模块识别动物、水果、数字、AprilTag码。并且采用串口通信实现LPC54606J512微控制器与OPEN ART mini模块的信息交换。为了提高模型车的速度和稳定性,采用虚拟示波器、蓝牙串口模块、蜂鸣器模块、按键液晶模块、拨码开关等调试工具,通过一系列的调试,证明该系统设计方案是确实可行的。
关键词
: LPC54606J512,MT90V034摄像头,PID控制,虚拟示波器,串口通信,OPEN ART mini
学 校:青岛工学院
队伍名称:青工战斗
参赛队员:王英汇 郭 钰 刘光富
带队教师:张 波 李 秀
第一章 引 言
本文以十六届全国大学生智能汽车竞赛为背景。该比赛是从2006开始,由教育部高等教育司委托高等学校自动化类教学指导委员会举办的旨在加强学生实践、创新能力和培养团队精神的一项创意性科技竞赛。以“立足培养,重在参与,鼓励探索,追求卓越”为指导思想。希望通过竞赛,加强大学生的创新意识、合作精神、实践能力。进一步促进高等学校加强对学生创新精神、协作精神和工程实践能力的培养,提高学生解决实际问题的能力,充分利用面向大学生的群众性科技活动,为优秀人才的脱颖而出创造条件,不断提高人才培养质量。
该竞赛融科学性、趣味性和观赏性为一体,是以迅猛发展、前景广阔的汽车电子为背景,涵盖自动控制、模式识别、传感技术、电子、电气、计算机、机械与汽车等多学科专业的创意性比赛。该竞赛规则透明,评价标准客观,坚持公开、公平、公正的原则,保证竞赛向健康、普及,持续的方向发展。
本次比赛中,本组使用大赛组委会统一提供的竞赛车模,采用恩智浦公司生产的LPC54606J512作为核心控制单元,自主构思控制方案及系统设计,包括传感器信号采集处理、控制算法及执行、动力电机驱动、舵机控制等,最终实现一套能够自主识别路线,并且可以实时输出车体状态的智能车控制硬件系统。
在该技术报告中,详细介绍了智能车系统的软硬件结构、设计开发过程及创新之处。在整个过程,培养了对电路的设计、软件的编程、系统的调试等个方面的能力,锻炼了知识融合、实践动手、创新的能力,对于今后的学习工作都有着积极的影响。
第二章 系统总体设计
2.1系统分析
该系统以LPC54606J512作为系统控制处理器,采用CMOS摄像头获取赛道图像信息,以PD方式对舵机转向进行反馈控制,电机转速控制采用PID控制。本组虽为竞速组,但是有别于传统的四轮竞速组,因为需要识别动物、水果等元素。所以在保证能够识别所有元素的前提下,不再单一的追求速度,而是追求系统的稳定性。采用UART通信实现LPC54606J512与OPEN ART mini视觉模块的通信。因为要保证LPC54606J512为核心,所以通信在开始时是关闭的,只有在特定的元素才会打开通信。
系统总体方案设计图:
▲ 图2.1系统总体框架
2.2车模整体布局
(1)为保证整车质量尽量轻,整车配件都用最小最轻的。
(2)为降低赛车重心,主板电池低位放置。
(3)采用高强度轻质量的碳素杆作摄像头支架。
(4)为保证检测动物和水果,OPEN ART mini放置在车前高度10cm左右,激光笔放置在高度15cm处。
下图为整车的详细布局:
图2.2.3车模侧视图
2.3本章小结
车模的机械结构是车模的基础,在一定程度上影响车模的速度上限,所以一个良好的机械结构是成功的前提,机械安装、重心的位置、传感器位置、这都是成功的一部分。在车模组装的时候,都要把任何有可能影响车模稳定的原因考虑到。使得车模不仅稳定性高,并且看起来也更加漂亮。
第三章 系统机械设计及实现
3.1编码器安装
本组使用的是龙邱512线迷你编码器,因为此款编码器比较小巧轻便,并且兼容正交解码,性价比非常高。安装的原则是不能过紧,也不能过松,在齿轮咬合太紧的情况下,电机转动会有非常大的声音,并且也会增大转动阻力。如果安装过松,则容易损坏齿轮。在安装完成后,先用手转动轮胎,感受是否一边转动阻力大,而另一边转动阻力小,如果存在则重新安装。直到转动非常顺滑,而且噪音非常小的时候,让电机空转,听是否有卡齿轮的情况。在保证这些情况都没有的时候,在齿轮间涂抹润滑油,并且慢慢转动轮胎,使得润滑油均匀涂抹在电机齿轮与编码器齿轮之间。这样,可以使得车模在赛道上跑的时候,声音非常小,并且对速度的测量也会更加准确。安装好的样子如下所示:
图3.1编码器安装
3.2舵机安装
目前舵机安装主要为卧式和立式这两种方式,C型车模舵机默认为立式安装方式,立式安装方式具有负载力矩大,响应区间广,控制精度高的特点。舵机卧式安装,舵机平放于底板上,质心很低,但由于舵盘位置不再底盘中心轴上,所以左右拉杆长度不一样,导致转向力量不对称,后期调试难度较高。所以本组经过讨论,最终确定为立式安装方式。
对舵机摆杆的一系列参数分析计算得出的较精确高效的工作参数,舵
机摆杆是将舵机的旋转运动转换成横摆运动的一种机构。在智能车比赛里,通过它将舵机转矩传递到连接轮子上面的横拉杆,实现轮子的左右转动,从而实现转向。转向在智能车比赛中是至关重要,而摆杆的设计直接关系到智能车转向灵敏度。
设舵机转矩=x,舵机摆杆作用力=f,摆杆长度=l,则:
x=f*l (公式1)
通过公式可以得出:拉杆作用力越大,反应越灵敏,转向速度越快。转矩一定时,摆杆越长,作用力就越小,所以摆杆又不能太长。同时最终的转向机构还应该尽量满足符合阿克曼转向理论,依据阿克曼转向几何设计的车辆,沿着弯道转弯时,利用四连杆的相等曲柄使内侧轮的转向角比外侧轮大约2~4度,使四个轮子路径的圆心大致上交会于后轴的延长线上瞬时转向中心,这样可以使车辆在过弯时转向轮处于纯滚动状态,减少过弯时的阻力,减小轮胎的磨损。
图3.2车模舵机安装
3.3摄像头安装
摄像头是车的“眼睛”,正是靠着摄像头,才能够对赛道精确感知。所有软件上的实现都是基于摄像头采集的图像而来的。可以说图像的好坏决定着一个车速度的上限。所以对摄像头的选取,到安装都十分小心,尽可能的保证摄像头图像达到最优。经过实验发现,大津法动态阈值比传统的硬件二值化的效果更好,于是采用了MT9V034摄像头,并且通过大津法对图像进行二值化。本组发现,不同广角的镜头对图像也有着很大的影响,在分别采集90度,100度、110度、130度、140度、170度广角下的图像之后,发现140度图像可视最远行与可视最近行都非常好。于是最终决定采用140度广角镜头。
图3.3.1摄像头采集图像
由于摄像头放置在高约40cm处,所以导致摄像头在跑起来容易晃动,于是在安装的时候尽可能的把摄像头底座固定牢固。并且为了使摄像头不会受到而改变图像,在把摄像头标定完成后,使用热熔胶把摄像头稳稳的粘牢,使得不受到影响。防止因外部因素导致摄像头位置发生变化进而影响到图像。实验发现,偏振镜会导致图像整体偏暗,其效果和动态阈值效果类似,并且使用软件的方式可操作性更大,因此本组经过讨论,最终决定不使用偏振镜。
图3.3.2摄像头底座固定
图3.3.3摄像头固定
3.4底盘高度调整
实验发现车模底盘低,重心更低,车模跑起来就更稳,特别是对于高速状态下,底盘低更有利于车模的稳定性。所以决定在不影响通过坡道的情况下,尽可能降低车模底盘。同时,把电池放在电机前方,使用轧带与地盘固定在一起,这样使得车模的重心变得更低。使车有更高的极限过弯速度。
图3.5底盘
3.5本章小结
本章介绍了本组在组车时的经验和想法,特别是摄像头这一方面,一定要小心细致。本队伍刚开始没有注意到这一方面,吃了很多的亏。比如车子撞了一下坡道导致摄像头歪了,然后就得重新标定,耗费了很多的精力和时间。在车辆组装的时候还需要多尝试,可能突发奇想的一个想法便可以解决很多的问题。使得车子变更加合理。
第四章 硬件电路系统设计及实现
4.1硬件设计方案
硬件设计是在可靠的基础上使其简单化。电源管理模块需要提供稳定的波纹较小的电压电流,驱动电路需要具备强悍的驱动能力和散热能力。
整个系统由摄像头模块、LPC54606J512最小系统、主板电路、驱动电路。通过查看四轮技术报告发现很多强队驱动电路和主板电路都是分开的。所以本组在开始画板时就把驱动电路和主板电路分开。
图4.1.1驱动PCB
图4.1.2驱动PCB
图4.1.3主板PCB
4.2主板电路
主板电路包括电源模块、摄像头模块、蓝牙插口、按键、播码开关、TFT液晶屏插口。
车模的电路电源是由可充电镍镉电池提供(7.2V、2000mAh)。但是系统中的各个电路模块所需要的工作电压和工作电流有所差别,以至于设计了多种稳压电路,将电池电压转换成各个模块所需要的电压。在设计时使用了5V稳压芯片LM1117-5.0V,3.3V稳压为LM1117-3.3V,舵机稳压芯片AS1015,进而对主板的各个部件进行保护。
使用LM1117芯片的原因主要是LM1117的性能好,电路简单明了,芯片较小巧,而且具有输出电压恒定,压降更低,提高系统工作稳定性的优点。在画板时对其的耐热性能和稳压性能进行了测试,发现两项性能都较稳定。
图4.2.1 LM1117电路图
AS1015芯片的可调式稳压输出的电流较大,发热量较小,更加具有舵机性能进而来调节其输出电压。
图4.2.2 舵机控制电路图
简 介: 本文设计的智能车系统以LPC54606J512微控制器为核心控制单元,基于MT9V034摄像头的图像采样获取赛道图像信息,提取赛道中心线,计算出小车与黑线间的位置偏差,采用PD方式对舵机转向进行反馈控制。使用PID控制算法调节驱动电机的转速,结合特定算法分析出前方赛道信息,实现对模型车运动速度的闭环控制。采用OPEN ART mini模块识别动物、水果、数字、AprilTag码。并且采用串口通信实现LPC54606J512微控制器与OPEN ART mini模块的信息交换。为了提高模型车的速度和稳定性,采用虚拟示波器、蓝牙串口模块、蜂鸣器模块、按键液晶模块、拨码开关等调试工具,通过一系列的调试,证明该系统设计方案是确实可行的。
关键词
: LPC54606J512,MT90V034摄像头,PID控制,虚拟示波器,串口通信,OPEN ART mini
学 校:青岛工学院
队伍名称:青工战斗
参赛队员:王英汇 郭 钰 刘光富
带队教师:张 波 李 秀
第一章 引 言
本文以十六届全国大学生智能汽车竞赛为背景。该比赛是从2006开始,由教育部高等教育司委托高等学校自动化类教学指导委员会举办的旨在加强学生实践、创新能力和培养团队精神的一项创意性科技竞赛。以“立足培养,重在参与,鼓励探索,追求卓越”为指导思想。希望通过竞赛,加强大学生的创新意识、合作精神、实践能力。进一步促进高等学校加强对学生创新精神、协作精神和工程实践能力的培养,提高学生解决实际问题的能力,充分利用面向大学生的群众性科技活动,为优秀人才的脱颖而出创造条件,不断提高人才培养质量。
该竞赛融科学性、趣味性和观赏性为一体,是以迅猛发展、前景广阔的汽车电子为背景,涵盖自动控制、模式识别、传感技术、电子、电气、计算机、机械与汽车等多学科专业的创意性比赛。该竞赛规则透明,评价标准客观,坚持公开、公平、公正的原则,保证竞赛向健康、普及,持续的方向发展。
本次比赛中,本组使用大赛组委会统一提供的竞赛车模,采用恩智浦公司生产的LPC54606J512作为核心控制单元,自主构思控制方案及系统设计,包括传感器信号采集处理、控制算法及执行、动力电机驱动、舵机控制等,最终实现一套能够自主识别路线,并且可以实时输出车体状态的智能车控制硬件系统。
在该技术报告中,详细介绍了智能车系统的软硬件结构、设计开发过程及创新之处。在整个过程,培养了对电路的设计、软件的编程、系统的调试等个方面的能力,锻炼了知识融合、实践动手、创新的能力,对于今后的学习工作都有着积极的影响。
第二章 系统总体设计
2.1系统分析
该系统以LPC54606J512作为系统控制处理器,采用CMOS摄像头获取赛道图像信息,以PD方式对舵机转向进行反馈控制,电机转速控制采用PID控制。本组虽为竞速组,但是有别于传统的四轮竞速组,因为需要识别动物、水果等元素。所以在保证能够识别所有元素的前提下,不再单一的追求速度,而是追求系统的稳定性。采用UART通信实现LPC54606J512与OPEN ART mini视觉模块的通信。因为要保证LPC54606J512为核心,所以通信在开始时是关闭的,只有在特定的元素才会打开通信。
系统总体方案设计图:
▲ 图2.1系统总体框架
2.2车模整体布局
(1)为保证整车质量尽量轻,整车配件都用最小最轻的。
(2)为降低赛车重心,主板电池低位放置。
(3)采用高强度轻质量的碳素杆作摄像头支架。
(4)为保证检测动物和水果,OPEN ART mini放置在车前高度10cm左右,激光笔放置在高度15cm处。
下图为整车的详细布局:
▲ 图2.2.3车模侧视图
2.3本章小结
车模的机械结构是车模的基础,在一定程度上影响车模的速度上限,所以一个良好的机械结构是成功的前提,机械安装、重心的位置、传感器位置、这都是成功的一部分。在车模组装的时候,都要把任何有可能影响车模稳定的原因考虑到。使得车模不仅稳定性高,并且看起来也更加漂亮。
第三章 系统机械设计及实现
3.1编码器安装
本组使用的是龙邱512线迷你编码器,因为此款编码器比较小巧轻便,并且兼容正交解码,性价比非常高。安装的原则是不能过紧,也不能过松,在齿轮咬合太紧的情况下,电机转动会有非常大的声音,并且也会增大转动阻力。如果安装过松,则容易损坏齿轮。在安装完成后,先用手转动轮胎,感受是否一边转动阻力大,而另一边转动阻力小,如果存在则重新安装。直到转动非常顺滑,而且噪音非常小的时候,让电机空转,听是否有卡齿轮的情况。在保证这些情况都没有的时候,在齿轮间涂抹润滑油,并且慢慢转动轮胎,使得润滑油均匀涂抹在电机齿轮与编码器齿轮之间。这样,可以使得车模在赛道上跑的时候,声音非常小,并且对速度的测量也会更加准确。安装好的样子如下所示:
▲ 图3.1编码器安装
3.2舵机安装
目前舵机安装主要为卧式和立式这两种方式,C型车模舵机默认为立式安装方式,立式安装方式具有负载力矩大,响应区间广,控制精度高的特点。舵机卧式安装,舵机平放于底板上,质心很低,但由于舵盘位置不再底盘中心轴上,所以左右拉杆长度不一样,导致转向力量不对称,后期调试难度较高。所以本组经过讨论,最终确定为立式安装方式。
对舵机摆杆的一系列参数分析计算得出的较精确高效的工作参数,舵
机摆杆是将舵机的旋转运动转换成横摆运动的一种机构。在智能车比赛里,通过它将舵机转矩传递到连接轮子上面的横拉杆,实现轮子的左右转动,从而实现转向。转向在智能车比赛中是至关重要,而摆杆的设计直接关系到智能车转向灵敏度。
设舵机转矩=x,舵机摆杆作用力=f,摆杆长度=l,则:
x=f*l (公式1)
通过公式可以得出:拉杆作用力越大,反应越灵敏,转向速度越快。转矩一定时,摆杆越长,作用力就越小,所以摆杆又不能太长。同时最终的转向机构还应该尽量满足符合阿克曼转向理论,依据阿克曼转向几何设计的车辆,沿着弯道转弯时,利用四连杆的相等曲柄使内侧轮的转向角比外侧轮大约2~4度,使四个轮子路径的圆心大致上交会于后轴的延长线上瞬时转向中心,这样可以使车辆在过弯时转向轮处于纯滚动状态,减少过弯时的阻力,减小轮胎的磨损。
▲ 图3.2车模舵机安装
3.3摄像头安装
摄像头是车的“眼睛”,正是靠着摄像头,才能够对赛道精确感知。所有软件上的实现都是基于摄像头采集的图像而来的。可以说图像的好坏决定着一个车速度的上限。所以对摄像头的选取,到安装都十分小心,尽可能的保证摄像头图像达到最优。经过实验发现,大津法动态阈值比传统的硬件二值化的效果更好,于是采用了MT9V034摄像头,并且通过大津法对图像进行二值化。本组发现,不同广角的镜头对图像也有着很大的影响,在分别采集90度,100度、110度、130度、140度、170度广角下的图像之后,发现140度图像可视最远行与可视最近行都非常好。于是最终决定采用140度广角镜头。
▲ 图3.3.1摄像头采集图像
由于摄像头放置在高约40cm处,所以导致摄像头在跑起来容易晃动,于是在安装的时候尽可能的把摄像头底座固定牢固。并且为了使摄像头不会受到而改变图像,在把摄像头标定完成后,使用热熔胶把摄像头稳稳的粘牢,使得不受到影响。防止因外部因素导致摄像头位置发生变化进而影响到图像。实验发现,偏振镜会导致图像整体偏暗,其效果和动态阈值效果类似,并且使用软件的方式可操作性更大,因此本组经过讨论,最终决定不使用偏振镜。
▲ 图3.3.2摄像头底座固定
▲ 图3.3.3摄像头固定
3.4底盘高度调整
实验发现车模底盘低,重心更低,车模跑起来就更稳,特别是对于高速状态下,底盘低更有利于车模的稳定性。所以决定在不影响通过坡道的情况下,尽可能降低车模底盘。同时,把电池放在电机前方,使用轧带与地盘固定在一起,这样使得车模的重心变得更低。使车有更高的极限过弯速度。
▲ 图3.5底盘
3.5本章小结
本章介绍了本组在组车时的经验和想法,特别是摄像头这一方面,一定要小心细致。本队伍刚开始没有注意到这一方面,吃了很多的亏。比如车子撞了一下坡道导致摄像头歪了,然后就得重新标定,耗费了很多的精力和时间。在车辆组装的时候还需要多尝试,可能突发奇想的一个想法便可以解决很多的问题。使得车子变更加合理。
第四章 硬件电路系统设计及实现
4.1硬件设计方案
硬件设计是在可靠的基础上使其简单化。电源管理模块需要提供稳定的波纹较小的电压电流,驱动电路需要具备强悍的驱动能力和散热能力。
整个系统由摄像头模块、LPC54606J512最小系统、主板电路、驱动电路。通过查看四轮技术报告发现很多强队驱动电路和主板电路都是分开的。所以本组在开始画板时就把驱动电路和主板电路分开。
▲ 图4.1.1驱动PCB
▲ 图4.1.2驱动PCB
▲ 图4.1.3主板PCB
4.2主板电路
主板电路包括电源模块、摄像头模块、蓝牙插口、按键、播码开关、TFT液晶屏插口。
车模的电路电源是由可充电镍镉电池提供(7.2V、2000mAh)。但是系统中的各个电路模块所需要的工作电压和工作电流有所差别,以至于设计了多种稳压电路,将电池电压转换成各个模块所需要的电压。在设计时使用了5V稳压芯片LM1117-5.0V,3.3V稳压为LM1117-3.3V,舵机稳压芯片AS1015,进而对主板的各个部件进行保护。
使用LM1117芯片的原因主要是LM1117的性能好,电路简单明了,芯片较小巧,而且具有输出电压恒定,压降更低,提高系统工作稳定性的优点。在画板时对其的耐热性能和稳压性能进行了测试,发现两项性能都较稳定。
▲ 图4.2.1 LM1117电路图
AS1015芯片的可调式稳压输出的电流较大,发热量较小,更加具有舵机性能进而来调节其输出电压。
舵机控制电路图
在综合学长的建议和自己的查询之后决定将LM1117-5.0V稳压出5V之后加上LM1117-3.3V进而稳压得到3.3V。这样可以使得输出的电压更加稳定,对电压电流精度要求高的器件的伤害减小。
舵机决定了车模转向的稳定性,舵机自身是一个耗电量大且具有一定干扰的模块。通过互联网了解到舵机和控制器之间需要隔离。通过查询,了解到光耦具有隔离作用,所以在主板上加上了光耦。
在设计主板的时候本组考虑到之后如果遇到难以处理的元素,可能会添加一些别的传感器。所以在设计主板的时候预留了一些口并且加上了一些新的模块。
4.3电机驱动
本组使用的C车模电机是380电机,其工作电压为7.2V,最大功率62.75W。电机空转的转速能达到23400RPM±10%,所以选择了MOS管驱动电路。MOS管的制动很明显,耐热效果好,产热量少。
4.4本章小结
整个系统正常工作的基础源于硬件电路的可靠支撑,本章主要介绍了整个系统中如何设计的电路板。在设计电路板时我和我的队友充分阅读芯片手册和历年来的技术报告并且向以前的学长咨询选出了效果较好并且适合本组的各种芯片,进而组装了本次参赛车模。
第五章 系统软件设计
5.1软件流程
▲ 图5.1.2中断流程图
5.2舵机控制
通过大量的实验发现,50HZ的舵机能够较快的响应赛道,并且舵机工作很稳定。
舵机控制采用位置式PID,通过实验发现积分项I,不适用于对舵机的控制,于是就舍去积分I,采用PD控制。并且取得了挺好的效果。
在跑车时发现,一套PD会使得车模在直道和弯道的行进效果不同,并且特别是元素里面,容易造成车模的不稳定。所以对于不同的赛道类型,使用不同的PD,也就是将PD分段化。对元素处理以及车模运行起到了很大的帮助。
5.3电机控制
电机闭环输出采用增量式PID控制,将摄像头偏差放入电机输出内,进而实现了弯道车辆降速和直道加速。并且实现了弯道差速控制,更有利于车辆的过弯,并且使得过弯时的路径变得优美。
使用虚拟示波器调节电机PID,实现稳定的闭环电机输出
▲ 图5.3虚拟示波器
5.4本章小结
本章节介绍了程序上的整体框架,以及电机输出和舵机输出的方法。
第六章 循迹元素处理
6.1出库
对于出库,本组一直没有找到好的办法,没能够通过图像处理来解决这一元素。进而直接使用了上电舵机打角的方式来实现出库这一元素。如此就使得出库不太稳定,容易在出库的过程中压到路肩。在出库一元素方面,还需努力,希望能够在不久的将来以图像处理的方式来解决这一元素。
十字路口的处理,分为正十字,斜十字,正在入十字。
6.2十字
6.2.1正十字路口的处理
首先搜索两边丢线数量,在两边丢线满足一定要求后,进而搜索十字路口的两个拐点。在两个条件同时满足的情况下,根据这两个拐点通过斜率向下补线,补出两边赛道边线。
6.2.2斜入十字处理
此时车身不正,一方会丢线严重,并且能够搜索到一个拐点。此时,使用斜率进行补线。
6.2.3正在进入十字的处理
正在进入十字之前一定是先经过了左入十字和斜入十字,在这两个情况满足的情况下,一直补线,直到搜不到十字路口的拐点截至补线,此时补线完成后,车模基本上已经经过了十字路口。
▲ 图6.2.3正在入十字处理
在十字处理结束完成之后,清除掉十字路口的标志位,等待着下一个十字路口的到来。
6.3环岛
环岛是赛道中比较难以处理的一个元素,队伍花费了大量的时间去处理环岛这一元素。在一边丢线,但是另一边没有丢线,并且在丢线一方存在着拐点的情况下,可以认为到达了环岛入口处,以前队伍尝试过使用补线来解决环岛这一元素,可是后来发现,使用补线与拉动中线的效果类似,并且拉动中线更容易实现。于是当车模到达环岛入口处并且判断出其环岛特征之后,直接拉动中线,把中线向环岛入口内拉动,使得车模直接巡线进入环岛。环岛内相当于一个弯道,可以使用正常赛道搜线完成,为了使得环岛内部路径优美,加入环岛PD控制,使得车模能够优美的在环岛内巡线。在出环岛时,观察环岛出口处的图像,发现环岛出口处两边丢线严重,在满足环岛入口处的条件后,当发现双边丢线严重时,直接强行拉动赛道中线,使得车模直接循迹出环岛,其效果和补线类似。并且发现,运用这种方式,即使当车模达到一定的速度时,这种方式依然很稳定,不会出现不稳定的效果。
▲ 图6.3环岛
6.4三叉
在总结了环岛处理的经验之后,队伍对三叉路口的处理更有信心了,由于三叉路口是今年的一个新的赛道元素,队伍观察了大量的三叉路口的图像。发现,由于赛道图像存在着畸变,即在正常赛道上,每一行图像的赛道宽度是逐渐递减的,但是三叉路虽然存在畸变,但是仍然具有明显的每一行图像变宽的特点。因此,这一特点就可以称为三叉路口的判断条件。当发现赛道宽度慢慢递减,又慢慢递增的时候,此时便判断到达了三岔路口。这个时候,首先会刹车,打开与OPEN ART mini的通信。因为不能够保证刹车一定刹到能够识别三叉路口的数字,于是让车模在打开通信之后一点点往前走,当检测到数字后,根据返回的奇数或偶数拉动赛道中线,使得车模能够顺利进入三叉路口。出三叉路口的图像和入三叉图像类似,根据之前检测到的奇数或偶数,再一次拉动赛道中线,使得车模能够顺利出三岔路口。
▲ 图6.4三叉
6.5坡道
队伍决定在车上安装了MPU-6050来检测坡道这一元素,在经过坡道时,陀螺仪的值会有明显的变化,当捕捉到这一明显变化时,会把摄像头的PD降的很低,从而使其在坡道处不会发生晃动和意外情况的发生。
6.6斑马线
仔细观察斑马线的图像,发现斑马线的黑白间隔很多。于是,通过搜寻一行的黑白跳变。程序基本思想为:
if((image[j][i]==black&&image[j][i+1]==white)||(image[j][i]==white&&image[j][i+1]==black))
{tiaobian++;
}
6.7入库
由于车库前放置的是斑马线。因此,当看到斑马线时,直接将赛道中线往车库里拉动,从而实现入库效果。
6.8本章小结
本章主要介绍了本组处理循迹元素的思想,处理思想是本组的集体智慧。当然,本队伍的处理思想肯定有很多不好的地方,但是也能够为处理循迹任务增加一种新的解决思路。
第七章 识别元素处理
7.1 OpenART mini介绍
对于识别元素处理使用的是OpenART mini视觉模块。AI视觉,其AI主要体现在识别上。OpenART mini是基于NXP的OpenART套件所制作的迷你版,可以完成OpenMV所不能完成的机器视觉应用,还可以完成OpenMV所不能完成的神经网络模型的部署和训练。OpenART mini采用RT-Thread内核,驱动,软件组件,开发环境。采用高性能处理器MIMXRT1064芯片,主频达到600MHZ,拥有1M片内SRAM、4M片内FLASH以及32M外置SDRAMType-c接口以及SD卡槽:插上SD卡之后,OpenART mini连接到电脑之后会出现COM端口和一个U盘;一个高速的SPI总线,两个UART串口总线(TX/RX)Micropython环境,可用于二次开发和AI教学;OpenMV机器视觉库,可运行OpenMV IDE,自带视觉处理脚本,使用OV7725传感器。
▲ 图:7.1 OpenART mini 规格丝印图
7.2 OpenART mini引脚说明
▲ 图7.2 OpenART mini外形图
- RST Reset引脚 B1 SPI3_MOSI/GPIO
- BOOT/BOT BOOT引脚 B2 SPI3_MOSO/GPIO
- C6 PWM2_M0_A/GPIO B0 SPI3_SCK/GPIO
- C7 PWM2_M0_B/GPIO B3 SPI_CS0/GPIO
- C8 PWM2_M1_A/DEBUG_UART_TX/GPIO B12 UART1_TXD/GPIO
- C9 PWM2_M1_B/DEBUG_UART_RX/GPIO B13 UART1_RXD/GPIO
- 5V 5V电源(输入) B16 GPIO
7.3图像识别的总体流程的概述
赛题中一共出现了三种需要进行识别的要素,分别是动物水果,数字,Apriltag码。由于灰度模式下可以提高摄像头的帧率,可以使识别速度更快。而三岔路口的数字识别是需要提速的关键部位,所以队伍成员经过讨论后决定。在识别数字时采用Grayscale灰度图模式,而在识别动物水果以及Apriltag码时采取RGB565彩色图模式。
在PC机上查看OpenART mini程序运行情况使用的是OpenMV IDE,所以首先在其中运行OpenART mini内置的Save image.py文件进行动物、水果、数字图像的采集。
▲ 图 7.3.1 save image.py的代码及其注释
将采集到的图片进行分类安放之后,进行数据集和模型的制作。首先通过自己编写的数据集制作程序将分类好的图片打上标签,转化成numpy数组类型的.npy文件。Grayscale灰度化为1个通道,阈值范围(0255)。RGB565彩色图为3个通道,阈值范围(0255)。反应在.npy文件中的内容,也是不同的。
之后在pycharm中运行由编写的神经网络训练文件,将.npy文件放入神经网络中进行训练,得到.h5 神经网络模型文件。此处.h5文件不可过大,虽然之后会进行nncu模型的转换。但由于OpenART mini采用的MIMXRT1064的闪存只有4MB,所以一旦模型过大,在识别调用模型之时会给予使用者内存溢出的报错。
得到.h5模型文件后,使用NNCU模型转换器将.h5文件转换为三种文件.nncu .c 以及.csv文件。将.nncu后缀的文件放入OpenART mini所使用的内存卡中。
在程序中定义好模型文件,模型标签文本的路径。导入识别所需要的nncu,os,pyb,sensor,image,math库。通过调用OpenART mini的find_rects函数来进行每一帧图像中所找到的矩形框内部图像的保存,并将其保存的图像变为numpy数组通过nncu.classify函数放入.nncu模型文件中进行遍历,并输出与模型中数值相似度最大的结果。即模型文本文件中所输入的内容,也就是一开始制作数据集时给图片分类打上的标签。
▲ 图 7.3.2 第三方库、模型文件、文本文件的导入和定义
▲ 图 7.3.3 寻找矩形函数与识别函数
注意,由于主控MCU的闪存flash较小为4MB,模型在NNCU转换后的大小最好不超过3MB。如果模型的大小接近3MB,通过本组大量的试验。在QQVGA分辨率下,模型可以正常运行。但是如果你想通过提高图像的分辨率来提高识别的精准度而选择了QVGA的分辨率,那么仍然会报内存溢出的错误,模型无法正常运行。
7.4 依据识别结果进行元素处理过程的概述
在得到识别结果之后,根据赛题要求。①根据Apriltag码奇偶性来控制云台舵机的左转右转。②识别结果为水果,驱动激光笔打出频率为125hz的激光,击中靶标中心的灯,保持1s。③识别结果为动物,则使车模在原地停留3s。
针对赛题,本组遇到了以下问题,并做出了以下问题的解决方案:
通过循迹摄像头将赛道元素进行提前识别,通过UART串口将信息发送给OpenART mini,后者通过接收程序获得的结果有选择性的执行数字,Apriltag码识别。OpenART mini得到识别结果后,再通过UART串口将结果发送给单片机,由单片机对车的电机,舵机进行控制,完成循迹上的要求。激光笔频率需要调制,本组没有选择逐飞给出的三极管激光调制电路,使用OpenART mini的PWM来进行激光频率的调制,试验后效果良好。由于本队伍采用的单片机是LPC546,无法在主板上引出第二个舵机口,所以队伍采用的是一个自由度的云台,由主板上的5V为云台上的舵机供电,由OpenART mini输出PWM信号控制云台舵机的旋转,且OpenART mini与舵机共地。可以保证OpenART mini对舵机正常的输出PWM。在OpenART mini上选择了C6、C8分别作为激光笔,舵机的PWM输出引脚,通过将其与激光笔的输入端和舵机的信号输入端相连,实现对其的控制。OpenART mini上需要调用其内置的PWM UART模块,并对对应的通道进行初始化才可使用。
▲ 图 7.4.1 内置的PWM模块使用方法
▲ 图 7.4.2内置的UART模块的使用方法
本组认为,识别任务最难的部分就是在对于水果的激光打靶上。因为循迹摄像头需要提前识别到Apritag码并刹车,在刹车的过程中会出现很多很多的问题。对于刹车遇到的问题,本队伍最后的解决方案是,通过多次刹车使车模最后稳稳的停在Apriltag码之上,并进行一段距离的倒车。在倒车后切换电磁循迹来规整车模的运行路径,保证识别的精确度。
OpenART mini需要控制动物水果识别所寻找的矩形框的大小。由于水果需要打靶,所以还需要控制识别到图像中心的x和y的坐标。由于使用的是一个自由度的舵机,所以对x和y的坐标要求非常高,只要有一点点的偏差。就容易打靶打偏。通过对图像ROI感兴趣的选取,以及对find_rects函数所找到的矩形框宽和高的返回值便可以很轻松的清理掉一部分多余的矩形框,保证识别的准确度。
▲ 图 7.4.3 规定范围去除多余矩形框的实现
▲ 图 7.4.4 ROI感兴趣的选取方法
7.5识别注意事项
Apriltag码的识别程序有一定的问题,当图像中没有出现Apriltag码时。有时会出现一定程度上的误判,但这种误判识别解决很方便。经过大量的测试,发现这种误判第一次的识别结果和第二次的识别结果是完全不一样的。可以利用两者的不同轻松地解决这个问题。
动物水果和数字的识别程序仅仅只是在调用模型上的区别,在调用时要注意各自对应的路径。
如果内存卡中没有程序中所定义的模型文件,模型文本文件,程序便无法正常运行,会报Oserror0的错误。
7.6本章小结
本章主要介绍了对于识别任务的解决方案。使用OPENART mini模块来作为识别模块。在识别过程中遇到了很多的问题,都在上面一一列举出来了。识别任务需要和循迹任务结合起来,通过串口,实现LPC与OPENART mini的通信,通过相互通信使得循迹任务和识别任务结合起来。识别任务是AI视觉组的一个重要的任务,在解决问题过程中遇到了很多问题,也解决了很多问题,锻炼了成员解决问题的能力,也增加了队伍成员的知识。
第八章 系统开发与调试
8.1开发工具
LPC54606程序的编写、编译在IAR上进行:
▲ 图 8.1.1 IAR界面
OPENART mini程序的编写在OpenMV IDE上进行。
▲ 图 8.1.2 OpenMV IDE界面
神经网络的训练在PyCharm上进行。
▲ 图 8.2.3 PyCharm界面
8.2调试工具
通过TFT屏幕不仅能够看到摄像头图像,还有利于调节车辆参数,通过TFT屏幕加上按键和拨码开关,可以更好的方便调节车辆的参数。
▲ 图 8.2.1 TFT
通过这两个上位机能够很好的观看摄像头的图像和补线,在刚开始放置摄像头的时候,需要用到这两款上位机来标定摄像头,因为TFT看到的图像太小,不利于精确安装摄像头。
▲ 图 8.2.2 逐飞科技上位机
▲ 图 8.2.3 山外上位机
8.3本章小结
本章介绍了本组使用的各种软件以及一些模块,通过这些工具,能够方便的去编写程序和调试车辆。一个顺手的上位机或者一款开发工具,能够减少调试的困难,使得开发变得简单、快捷。
第九章 模型车技术参数
- 项目 参数
- 组别 智能视觉组
- 车模总重量(加电池) 1.7kg
- 车模尺寸 长:32cm
- 宽:18cm
- 高:36cm
- 电路电容总容量 约1500uf
- 传感器种类和数目 摄像头:MT9V034,OV7725(两个)
- 编码器:mini512(两个)
- 新加伺服舵机 1
- 新加电机 0
- 赛道检测精度 188×120
- 赛道检测频率 50 Hz
第10章 总 结
本文介绍了队伍对于车辆的制作思路,车辆组装、电路设计、循迹元素处理以及识别元素的处理。这个过程中,本队伍阅读了很多的技术报告,希望能够从中学到解决问题的思路和方法。并且与学长进行交流,总结他们的经验和教训,以求在一开始就能够朝着正确方向努力。
回想起当时刚加入智能车的时候,怀着一腔热血和激情,参加了学校的每一轮考核,最终通过了学校的校内选拔,获取了参加本次大赛的资格。每天重复着教室、实验室、食堂这三点一线的生活,到后期更是直接住在了实验室里。以保证把自己所有的精力全部投入到此次比赛中。这其中的每一步都包含了本队伍的汗水和心血。对于一个问题,队伍每时每刻都想着如何去解决,甚至睡觉的时候都会梦到自己采用一些方法解决了这个问题,更神奇的是第二天用这个方法试了一下还真的能够解决。
智能车锻炼了专业技能,磨练了意志力,我们的青春因智能车而充满精彩!
参考文献
[1] 谭浩强著.C程序设计[M].北京:清华大学出版社,2003.
[2] 卓晴,黄开胜,邵贝贝.学做智能车——挑战“ 飞思卡尔” 杯[M].北京: 北京航空航天大学出版社,2007.
[3] OpenART mini说明书——逐飞科技.
[4] 黄旭东,李阳,任帅.北京科技大学_北京科技大学四轮组_基础四轮.[J].2020
[5] 余灿键,程东成,李伟强.PID算法在智能汽车设计上的应用.《学做智能车——挑战“飞思卡尔”杯》[C].北京:北京航空航天大学出版社,2007.133~135.
附录B:核心算法子程序
#include "headfile.h"
void init_ALL()
{get_clk();lcd_init(); //初始化TFT屏幕 横屏模式,可以修改ctimer_pwm_init(TIMER4_PWMCH0_A6, 50, 0);//舵机初始化uart_init(USART_0,115200,UART0_TX_A25,UART0_RX_A24);set_irq_priority(FLEXCOMM0_IRQn ,0);uart_rx_irq(USART_0,0);BMKG_init();//初始化拨码开关pit_init_ms(1);//初始化pit 周期设置为1ms set_irq_priority(RIT_IRQn,0); //设置pit优先级enable_irq(RIT_IRQn); //开启pit中断ctimer_count_init(TIMER0_COUNT1_A2);//对A2引脚输入的脉冲进行计数 A2接编码器LSB gpio_pull_set(A2,PULLUP); //IO上拉ctimer_count_init(TIMER3_COUNT0_A4);//对A4引脚输入的脉冲进行计数 A4接编码器LSBgpio_pull_set(A4,PULLUP); //IO上拉 ctimer_pwm_init(TIMER1_PWMCH0_A18, 15000, 0);//电机初始化 频率15000ctimer_pwm_init(TIMER1_PWMCH1_A20, 15000, 0);ctimer_pwm_init(TIMER2_PWMCH1_B4, 15000, 0);//电机初始化ctimer_pwm_init(TIMER2_PWMCH0_B5, 15000, 0);BMKG_tiaojie();//拨码开关调参上电后把调参的变量初始化,可以直接使用,但注意,每次拨动拨码开关后都需要再次上电,以保证初始化程序再次执行gpio_init (B11,GPO,0,NOPULL); //蜂鸣器//gpio_init (A26,GPO,0,NOPULL); // gpio_init (A27,GPO,0,NOPULL); //gpio_init (B18,GPI,0,NOPULL); //激光漫反射camera_init(); //初始化摄像头adc_init(ADC_CH4_A16); //左1 adc_init(ADC_CH0_A10); //右1adc_init(ADC_CH5_A31); //左2adc_init(ADC_CH6_B0); //右2IncPIDInit();EnableInterrupts;
}/*************************主函数设计*******************************/#include "headfile.h"
int main(void)
{ init_ALL(); //初始化函数while(1){if(mt9v032_finish_flag) //摄像头采集完成标志位{ mt9v032_finish_flag = 0; //当数据处理完毕之后再清零标志位,标志位清零之后才能继续采集图像Gate = OSG_GetThreshold(image);//动态阈值算法OSG_GetBinaryImage(image, image_buf, Gate);//二值化图像camera_draw_line_error(); //图像处理Direction_control(); //舵机控制} }
}
● 相关图表链接:
- 图2.1系统总体框架
- 图2.1系统总体框架
- 图2.2.3车模侧视图
- 图3.1编码器安装
- 图3.2车模舵机安装
- 图3.3.1摄像头采集图像
- 图3.3.2摄像头底座固定
- 图3.3.3摄像头固定
- 图3.5底盘
- 图4.1.1驱动PCB
- 图4.1.2驱动PCB
- 图4.1.3主板PCB
- 图4.2.1 LM1117电路图
- 图5.1.2中断流程图
- 图5.3虚拟示波器
- 图6.2.3正在入十字处理
- 图6.3环岛
- 图6.4三叉
- 图:7.1 OpenART mini 规格丝印图
- 图7.2 OpenART mini外形图
- 图 7.3.1 save image.py的代码及其注释
- 图 7.3.2 第三方库、模型文件、文本文件的导入和定义
- 图 7.3.3 寻找矩形函数与识别函数
- 图 7.4.1 内置的PWM模块使用方法
- 图 7.4.2内置的UART模块的使用方法
- 图 7.4.3 规定范围去除多余矩形框的实现
- 图 7.4.4 ROI感兴趣的选取方法
- 图 8.1.1 IAR界面
- 图 8.1.2 OpenMV IDE界面
- 图 8.2.3 PyCharm界面
- 图 8.2.1 TFT
- 图 8.2.2 逐飞科技上位机
- 图 8.2.3 山外上位机