标题: 第七届“飞思卡尔”杯 软件技术报告 [打印本页]

作者: a119    时间: 2014-10-21 01:24
标题: 第七届“飞思卡尔”杯 软件技术报告
第七届“飞思卡尔”杯全国大学生
智能汽车竞赛
湖北文理学院摄像头组
软 件 类 技 术 报 告
队伍名称:黎明破浪号
  参赛队员:周      奇  
          胡  志  强
          周  成  成
带队教师:程      昊
          叶  建  明
目录
第一章  写在开始之前……………………………………………………………
1.1 第七届团队展示...........................................
1.2 自我介绍.............................................
1.3 必做的准备工作.........................................
1.4 工具介绍.........................................
第二章  图像采集……………………………………………………
2.1 图像采集原理..............................................
2.2 图像处理...........................................
第三章  舵机电机测试……………………………………………………
3.1 参数测试………………………………………………
3.2 整体测试………………………………………………………….
第四章  软件整体设计…………………………………………………
4.1 编程思想…………………………………………………………..
4.2 多使用LED排查BUG………………………………………………….
4.3 图像中心线的提取………………………………………………..
4.4 液晶12864的使用…………………………………………………..
4.5 舵机PD控制…………………………………………………………..
4.6 电机PID和起始线识别……………………………………………..
第五章  结论…………………………………………………
5.1 心得…………………………………………………………..
第五章  参考资料…………………………………………………
一、写在开始之前
1.1  第七届团队展示

上面左起分别是程昊老师和王宏达老师。
下面左起分别是光电二组的张润、王辉。摄像头组的周奇、胡志强。光电一组的汪稳、熊梦杰。
1.2  自我介绍
同学你好,很高兴你报名参加了全国大学生“飞思卡尔杯”智能汽车竞赛的摄像头组,我是来自09级机械与汽车工程学院的周奇,是第七届摄像头组‘黎明破浪号’的队长,也是‘黎明破浪号’的软件主要负责人。首先,我以一个‘过来人’的身份代表‘黎明破浪号’,对你们本次的参赛表示热烈的欢迎。其次,我希望你能认真的把我写的报告读完,虽然说黎明破浪号在竞赛中没有取得好的成绩,可能是我使用的算法在我一个人的思路下已经进入死胡同,不足之处还希望指正后留给下一届的同学。下面都是我就软件这块所做的总结,或多或少会对你们有些帮助。最后,预祝你们在本次竞赛中取得好成绩。
在第七届“飞思卡尔杯”中,我们组所使用的有野火K60核心板(如果你使用32位的K60,我推荐购买野火的核心板,这家的核心板面积小,性能稳定,最主要的是他们提供有好的教程,好的底层驱动代码,技术支持也非常到位),ov7620数字摄像头,12864液晶等。采用的接线如下

1.3  必做的准备工作
A:拒绝酱油
我说这句话态度是很强硬的,比赛一起是3名队员,最好的搭配是1个硬件2个软件。硬件搭好后全部工作都靠软件了,而算法这一块是非常难的,一个人写就非常容易陷入死胡同,而智能车的质量直接影响因素就是算法。
所以,如果你是酱油,就请你主动退出。原因很简单。1:参加主要目的还是学习,我不敢保证你参加了就会有全国名次,因为摄像头组本来就是非常难的一个组,但是我可以保证你会学习到很多很多。2:就算获得了一个奖章,你去企业里面别人问一句比赛的问题马上就原形毕露,不仅不能增加就业机会,放而带来不诚信。3:这里也是很重要的,可能因为你是酱油,占了一个本应该做事的位置,那么也会大大削弱你们组的实力,拖后腿就成为必然。
B:准备好试车环境
作为摄像头组过来人,我这里讲一个有趣的事情。第七届的比赛湖北文理学院一共派出3支队伍参赛。分别是光电一组,光电二组和摄像头组的黎明破浪号。在学校试车的时候,光电一组最稳定,光电二组不是很稳定,因为经常出现问题。而我们摄像头组速度最快,稳定性介于两个光电组之间。当时我们的速度为两档,慢速和中速。其中慢速的最稳定,不夸张的说黎明破浪号夜间在学校赛道上正反跑20圈两个轮子同时出界才一两次,白天拉开窗帘效果则比较差。后来去了厦门(第七届在厦门大学嘉庚学院比赛)试车的时候我发现我的车在学校速度为慢速的居然在赛道上面动都动不起来,当时以为是电池没电了,于是马上换电池,结果发现还是动不起来。没办法,把速度提高到中速,车才开始缓缓前行,并且车前轮有明显跳动,稳定性非常差。显然,这是因为我们在学校试车时候的环境和比赛时候环境出入太大,赛道摩擦明显大了很多。在试车完毕后,我们和三峡大学共用一个赛道,由于试车时候没有背景,得到赛道后我们给背景加上了黑色背景,车的稳定性也比较差,后来才发现直接原因是阈值的问题,我们在实验室时候阈值为180,经过修改,最后确定为130,整整一个晚上的调试,车速可以达到2米了,稳定性也非常不错。结果第二题比赛时候背景为蓝色,稳定性又下降了,连续几次都是在同一个地方出去了。
差距怎么来的,从细微之处来的。上面提到的光电二组,在学校调试的时候一直出现问题,稳定性比较差,还一度因此而去不了厦门。两支光电组都没有使用算法,但是在加上背景后两支光电组都表现除了非凡的稳定性。我这样说不是夸张,光电二组的稳定性一下子和光电一组可以媲美了,速度也一下子提升了很多,只留下我们摄像头组经常冲出赛道。所以,作为摄像头组的你,一定要切记购买好的赛道和铺上正确的背景颜色,不然你所调出的参数全是白调的。
这里附上两张图片,我们学校和别人学校的赛道上面差距就很明显了
我校的赛道

PS:图中最上面的是用纸贴在地上的赛道,下面的是用KT板铺的,但是没有背景颜色,于是找来一些木板作为背景。木板的高低不平给调试带来了很大困难。
别人的赛道
PS:标准的赛道,KT板看上去和比赛用赛道一模一样
最终比赛的赛道
PS:比赛前有60秒的试车时间,图中在赛道上试车的正是本人。
所以,我这里建议,从一开始铺赛道就按照组委会的标准来,包括赛道样式,背景颜色等等,这样就不会在后来走太多弯路。
C:坚持不懈
这句话可能是废话,不过在写代码的时候出现大大小小的问题也是在所难免的,这时候就需要一股坚持不懈的干劲,有句话说:既然选择了远方,便只顾风雨兼程。当你选择了“飞思卡尔杯”,就证明你比别人优秀了,不让困难打败你。加把劲,多付出,谁都会累,待到你获得成功了,对你,对你家庭,对学校都是无上的荣光。
1.4  工具介绍
这里我介绍两款除了编译环境IAR外我常用的工具,一款Source Insight(简称SI),另外一款是UltraEdit(简称UE)。结合source insight使用教程和UE配合SI的使用方法(附加代码移植教程)这两个PDF文档的教程都是我写的,内容稍微有些简洁,但主要方法还是已经提及,这两款软件在我学习飞思卡尔和ARM中确实有很大的帮助。没有该教程的同学可以向你们指导老师要,关于所有的资料,我们都会上交给指导老师,这里,我希望它能对大家有所帮助。


二、图像采集
2.1  图像采集原理
图像采集不需要硬件平台的支持,所以当你的主控板没有成型之前,用杜邦线连接,就可以开始图像采集了。采集部分请自己查找相关资料,我们使用的是32位的K60系列,因为芯片的不一样,代码自然会有差别,不过万变不离其宗,摄像头也是一个传感器,控制原理都是一样的,所以最好还是看下摄像头的原理后再根据别人写的采集程序写自己的,那样就事半功倍。此处附上黎明破浪号的图像采集代码
场采集

行采集

DMA处理

2.2  图像处理
A:前期
在得到图像后,先从编译环境的watch里面看图像是否采集到了,如果采集到了图像,那么可以发送到上位机观看图像,也可使用液晶等显示器之间观看。这里推荐一款上位机
这款上位机打开后

使用过程中可以直接实时观察,功能非常强大。在使用的时候注意起始信号的识别问题。

在使用时候请仔细阅读该上位机的使用手册,如果不阅读readme,将会出现采集不到图像等等问题。
采集到图像后要对图像进行校正,梯形校正和对称性校正。可能摄像头的正中间不在图像的正中间,那么就需要修改代码。这一步要在上位机的辅助下完成,在调整好最佳图像后方可进行下一步。
B:中期
在上位机里面观察到正确的图像后,我们就要对图像进行处理了,图像处理的时候就不能使用这款上位机了,只能通过串口或者液晶来查看了。鉴于进度,第一时间液晶写不出来的同学可以先尝试使用串口打印图像,将所得到的图像打印出来,并且描绘出中心线。

如果有能力的,可以将图像处理后所得到的数据全部打印出来。其实这个不难(只是我没有保存图片,无法给与直观图)。
C:末期
在串口里面观察到正常数据后,我们就需要使用液晶了,液晶在摄像头组中是必不可少的。黎明破浪号使用了12864液晶,用来实时显示赛道和PWM值,后期用来显示其他需要观察的重要信息。不过12864体积有些庞大,速度也有点慢,所以还是推荐使用高速液晶。
液晶在摄像头组的调试和观察中起着不可磨灭作用。做硬件的同学一定要在主控板上面加上液晶的引脚,液晶在正式比赛之前都会一直使用到。
下面附上我所使用液晶的代码,可以自行找老师要到我的代码后用我介绍的两款软件仔细阅读。

三、舵机和电机测试
3.1  参数测试
在舵机和电机控制前首先要测得各种参数,比如舵机的中间值和左右最大的打角等等,正确的参数对于控制的准确性有很大的影响,另外,如果不测试,直接给与舵机值,有可能超出允许范围,舵机则会打死并且烧毁。第七届光电组就因为这个情况烧毁了两个舵机。关于参数测试各院校的报告里面对于测试必要性和方法都有提及,故这里就不详细说明。
这里附上我们舵机和电机测试代码

电机测试

3.2  整体测试
整体测试在开始控制之前也非常的重要,首先要确定前轮直线,外八还是内八,根据个人情况而异。然后给与舵机中间值,电机给与一定速度,看车模能否正常的走直线。如果车模不能正常走直线,则要手动调节传动机构。
四、软件整体设计
4.1  编程思想
编程的时候尽量用模块化编程,少用全局变量,这样可以减少BUG的产生。每个需要使用的变量需要简单易懂,便于他人阅读代码。每个模块之间用注释隔开
例如:



使用模块化编程简单易懂,而且便于BUG的查找。
4.2  多使用LED排查BUG
写代码的时候出现BUG是难免的,有时候可能因为一个小小的错误,整个语句都进入不了,那么就需要查找BUG了,查找BUG有两种办法,一种是单步调试,另外一种是使用直观的现象查看。我经常使用的就是LED了,在可能出现问题的地方加入LED闪烁,如果LED不闪烁则说明语前面出问题了。野火的核心板上带4个LED,写好函数后多次调用,可以用来显示很多信息了。

4.3  图像中心线的提取
中心线提取根据论坛里面的资源,或者看我的代码就可以理解,比较简单。
4.4  液晶12864的使用
我的12864液晶是根据以前写的51驱动直接移植过来的,上面还有明显的移植痕迹

对应的的51上面则是

根据我的模块,则可以非常简单的使用12864了。
4.5  舵机PD控制
PD控制顾名思义,即比例、微分控制。
比例控制:就是对偏差进行控制,偏差一旦产生,控制器立即就发生作用即调节控制输出,使被控量朝着减小偏差的方向变化,偏差减小的速度取决于比例系数Kp, Kp越大偏差减小的越快,但是很容易引起振荡,尤其是在迟滞环节比较大的情况下,Kp减小,发生振荡的可能性减小但是调节速度变慢。但单纯的比例控制存在静差不能消除的缺点,这里就需要积分控制。
积分控制:实质上就是对偏差累积进行控制,直至偏差为零。积分控制作用始终施加指向给定值的作用力,有利于消除静差,其效果不仅与偏差大小有关,而且还与偏差持续的时间有关。简单来说就是把偏差积累起来,一起进行运算。
微分控制:它能敏感出误差的变化趋势,可在误差信号出现之前就起到修正误差的作用,有利于提高输出响应的快速性,减小被控量的超调和增加系统的稳定性。但微分作用很容易放大高频噪声,降低系统的信噪比,从而使系统抑制干扰的能力下降。因此,在实际应用中,应慎用微分控制。
在实际中,我们组采用的是模糊PD控制,也就是对于不同的情况采用了多组PD参数进行调节。此处附上我们部分舵机PD控制代码

代码中Ki不是积分的Ki,而是赛道边界对舵机的影响因素,也就是说如果车模在直道上,车模又太靠右边了,那么采集到的中心线也是直线的,而这样对于突如其来的转弯则是致命的。此时则赛道边界Ki则起到一定控制作用,它使舵机左打一定角度,让车模回到赛道正中间。
此处的参数最难调节,据三峡大学的朋友说,他们调节这几个参数就花了4个月,而我们因为时间关系,调节时间半个月不到。参数调节有一定技巧,不能盲目赋值。这里我举个简单例子。上副图像所得到PWM为正中间720,车跑直道。本次突来大S右转,PWM为900。通过PD参数的调节,最终要得到的turn打角必须介于720和900之间。那么Kp和Kd就有了一定范围。根据公式
turn=steer_middle+(int)((steer_value-steer_middle)*Kp+(turn1-steer_value)*Kd);
Turn假如为800,那么就可以得到二元一次方程,再多给几次值,便可得到最佳的Kp和Kd了。
我们就得到的turn进行分析。1:如果本次采集是正确的,那么舵机有一定打角,但是没有打到那么大,下次如果还是大S右偏,PWM仍为900,那么在此经过算法所得到的turn则介于800和900之间了。很明显,如果图像正常,那么只需两幅图像的时间就打到正常角度,对正常的打角不会有太大影响。2:如果本次采集为错误,那么经过算法则对本次打角有一定缓冲,并没有让舵机一次性打到错误最大角度。这个就是算法的实现。
在算法实现后,切记一定要对turn进行校正,因为经过算法后的PWM有可能因为你参数的错误而变的超过舵机的正常范围。防止舵机烧毁,则需要加上
if((turn<530))
turn=530; //左边最大打角
if((turn>910))
turn=910; //右边最大打角
4.6  电机PID控制和起始线识别
因为我们准备时间较晚,所以这两个东西我都没有用,对电机进行的开环控制,起始线则是直接延时3s后启动,终点线则是直接冲过去了。这里就不能为你提供多大的帮助,你可以阅读别人的技术报告,从中学取。
五、结论
5.1  心得
自报名参加“飞思卡尔杯”智能汽车竞赛以来,我们小组成员从查找资料、设计机构、组装车模、编写程序一步一步的进行,最后终于完成了最初目标,定下了现在这个设计方案。在刚制作的初期我们遇到了很多困难,在选择系统板时候,因为另外一个组选择了xs128,而今年又新出规定,可以使用K60这款32位的单片机,以为自己学过一段时间的ARM就可以征服它,结果差点撞的头破血流。在编写软件的时候,完全没有上届留下的资料,没有老师的指导,全部靠自己一字一句的编写。在最小系统、主板、电机驱动等模块分别设计,经过不断实验,最后决定了我们最终的电路图。在软件设计方面,如摄像头的采集数据,在寝室调节好的代码放到实验室里面总是不采集图像,用手挡住或者用帽子盖住才采集,后来历经很久才发现是干扰问题。此类的问题层出不穷,就像我们说的,动则得咎,只要你在向前进,就会犯错误。这时候就要坚持不懈的客服,而不是放弃。本次小车作为我们组辛勤汗水的结晶,凝聚着我们小组每个人的心血和智慧,随着它的诞生,这份经验将永伴我们一生,成为我们最珍贵的回忆。
在这几个月的备战过程中,特别感谢叶建明老师给我的帮助,同样,也感谢一直支持和关注智能车比赛的学院领导老师们。
现在,比赛结束了。历时近四个月的准备,虽然我们没有取得优异的成绩,没有给学校带来光荣。但是我们也努力了。也许我们的知识还不够丰富,考虑问题也不够全面,但是这份技术报告凝聚了我们组所有的知识总结。希望对下届的“飞思卡尔杯”摄像头组有所帮助。同时,我们也希望下届的你,在比赛完后写下和我一样的报告,作为资源留给你的下届同学。
六、参考资料
三天入门M4——Kinetis(V2)————野火编写
source insight使用教程————周奇编写
UE配合SI的使用方法(附加代码移植教程)————周奇编写

当然还有很多有用的书籍,这里一时半会也想不起来具体信息了。更多的阅读他人的报告,对你会有很大帮助。






欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1