The NXP Cup National University Students Intelligent Car Race -11th.
/**************************************************************
*第十一届全国大学生“恩智浦杯”智能汽车竞赛信标组
*西北工业大学智能汽车创新实践基地
*Gungnir队:廖海兵 冯雪峰 汪强龙
*正式比赛队名为:枭龙队
**************************************************************/
/**************************************************************
*软件开发环境:
*Keil ---> MDK-ARM V5.10
**************************************************************/
/**************************************************************
*硬件部分:
*NXP 公司32 位单片机 K60DN512(ARM Cortex-M4)
*山外鹰眼——OV7725 * 1
*C车模
*欧姆龙 200 线双向编码器*2
*0.96寸 OLED 128*64 显示屏*2 + 按键 *8 + 鼠标编码器*2
**************************************************************/
/**************************************************************
*最终方案为单摄像头,即OurCar_Front_Camera项目下代码
*无避障传感器(可手动根据比赛环节设定避障参数)
*信标识别代码在Get_Beacon.c
**************************************************************/
2015年12月19日:电机舵机测试正常。
2015年12月22日:摄像头图像采集正常。
2015年12月22日:对竞速赛道进行识别。
2015年12月30日:对信标进行简单识别。
2015年12月31日:只使用核心板加入了后摄像头。
2016年01月01日:修改信标检测方法并加入超声波避障。
2016年01月05日:为后摄像头焊了主板加入相关调试模块。
2016年01月07日:加入ADNS9800实现位移测量。
2016年01月11日:加入ADNS30x30图像采集。
2016年03月23日:加入图像连通域划分、信标识别改为识别圆、去除后摄像头与ADNS9800。
2016年04月20日:新板加入CAN通信、后摄像头加入线性ccd用于避障、主控与副控配合加入速度闭环、去除超声波避障。
2016年06月15日:改变目标朝向,使车略偏离信标掠过,提前减速,从信标后方绕过。
2016年07月12日:添加根据输入的信标信息做路径控制;添加片内Flash储存参数;添加参数分页,将不重要度的参数分页;添加调试,可以设定调试时间。
2016年07月28日:实现从信标前转向,细化路径方案。
2016年08月11日:速度阈值标定,代码形式修改。
2016年08月15日:加入主动差速,目标高速度大于4.0时直接给满占空比。
- 这是一开始采用的方案,弊端太多,不想一一说明。最明显的就是经常撞信标,调车一次得修很多次信标灯,心太累。主要原因是不知道车子在距离信标多远是开始转向绕行比较好,这是一个与速度相关的量,只能凭经验调,调不好就会撞信标,而且速度也不好提上去。
- 这是在直冲后转向绕行方案上修改的,即将直冲改为故意偏离信标中心以切线方向冲,这样就避免了先转向后绕行经常撞灯的尴尬。明显,这种方案简单,不用做太多处理,只要速度调好,绕信标半径尽量小,也是可以调到一个不错的水平的。弊端在于如果左切右绕时,下一个信标出现在左后方,车将会以低速绕信标一圈才能找到下一个信标,不仅消耗时间,而且容易在看到下一个信标时撞上正在绕的这个信标。右切左绕类推即可。
- 人工设定路径即是针对全左切右绕(或全右切左绕)方案的弊端而设定的,根据信标亮的顺序人工将车子在遇到某个信标是左切右绕还是右切左绕进行设定。人工设定路径是以准确对信标计数作为基本前提的,在尝试使用人工设定路径方案之初,遇到的最大问题就是如何准确地对已经经过的信标进行计数,最开始尝试的是每次丢线次数大于最大丢线次数就计数一次,然而实际效果不是太好,容易多计几次,导致路径变乱,感觉效果不好之后差点就放弃了人工设定路径这个方案。然而在最后一门考试英语考完那天的晚上,闲着没事想着从来没有调过车子的速度,只是随意的设定了PID参数,所以我想仔细地调一调车子的速度。接上无线串口,打开虚拟示波器,说实话,车子的速度曲线简直不忍直视,由于两个信标之间距离较短,所用时间少,实际速度这这么短的时间内根本达不到设定的目标速度(如果是稍微长一点的直道速度是可以跟上的,只是所谓的调节时间比较长),设定的高速和低速曲线是方波信号,实际速度基本变成了正弦信号。调了一晚上想让速度跟上设定速度,不管怎么调,调节时间总是太长,就算加棒棒效果也不好,于是心累的放弃调速度。第二天早上一起来就想到昨晚调速度的事情,想到目标速度的曲线是完美的方波信号,而且是经过信标一次跳变一次,那我利用这个做信标计数不就可以用人工设定路径的方案了,所以立马写代码,烧进车子里,打开开关一跑,路径完全按人工设定的跑,时间14s多,历史最好成绩,之前一直在16s左右徘徊,感觉瞬间发现新大陆。
- 继续测试计数稳定性,对路径做更多优化,尝试如何跑出最佳路径。西部赛时,在下一个信标比较远时,可能由于图像畸变,y坐标问题,设定的偏离切线方向会导致车子绕一个大弧线,路径变长,可能需要做优化。还是要提高抗环境光线干扰的能力(主要是硬件方案上改动,程序上很难做到很强的抗干扰),国赛环境可能不如西部赛环境好。尝试主动差速。