本帖最后由 freescaler 于 2015-1-9 01:44 编辑
飞思卡尔备忘录(摄像头直立组) 飞思卡尔智能汽车这样一个平台,使我得到了很大的锻炼,还要感谢我们的指导老师,感谢这一年给予的大力支持,最后还要感谢我的队友,是我们的精诚合作,才取得了今天的成绩。 经历了将近一年的奋战,期待的飞思卡尔比赛结束了,虽然留下了些许的遗憾,但是现在回头去看这一年走过的路,现在的我真是要感谢当初的自己。记得大二下学期报名参加迷宫鼠比赛,当时是对于电路,程序还没有一点概念。看到学长制作的一个光点传感器,感觉好神奇,而现在的我对基本的电子设计以及工程项目的开发,都有了初步的认识。仔细想想,这一年真是学到了很多的东西。 当然,任何的成长都要付出努力, 对于这一年的辛苦我想只有自己才清楚,不论寒署昼夜,都有我们团队的身影。有时候,面对一个难题,要纠结几天甚至半月。现在想想,如果当时能够得到些许的点播,或许我们就可以少走很多的弯路,特别是技术难度比较大的摄像头直立组,每一次的难题都是在头破血流的摸索后突破的。 现在反思为什么我们学校很多时候都差一步冲进国赛。我想其中一个原因就是没有很好的继承性,很多时候是在做重复的工作。特此,我花了两天时间把脑中尚存的一点东西整理了一下,也是我在做车过程中遇到的一些关键问题以及重要的算法和思想和大家分享,希望各位学弟学妹能够站在我们的肩膀上走的更远。下面我就针对摄像头直立组提纲挈领的把要点列出: 一.硬件方面 1. 芯片的选型:摄像头直立组数据量大,运算量大,建议直接用K60。超频到200M,我们既然编写不出来高效率的代码,就尽可能的提高单片机的运算速度。 2. 摄像头的选型:我们队今年用的是野火的鹰眼,个人对它评价相当高,他的优势很明显:硬件二值化,一次可以采集八个像素点,最高可以达到150帧图像每秒。建议更换一个视角更大的镜头,说到镜头,镜头的焦距十分关键,受到灯光影响,调好的焦距可能会拍不出清晰的图像,建议整一个大的液晶或者上位机,把图像显示出来,调节焦距直到拍出清晰的图像为止。在比赛现场很有可能需要调焦距,今年我们就被焦距问题坑了。 3. 编码器的选型:红树伟业的500线的编码器不错,就是有点大,可以考虑用一下有一种很小的编码器,最好使用500线的。 4. 车模的选型:车模很关键,我们选的是E型车模,实践证明,这个选择是正确的,众观省赛和西部赛区的比赛,跑的牛逼的车都是采用的E车模,第一他的轮距大,转弯时稳当些,当然避障要困难一点,第二他的电机给力,出力大,第三,他的轮子大,对于上坡有好处。 5. 陀螺仪的选型:建议采用龙邱的一款陀螺仪,单轴足够了,由于规定不能用带有硬件合成角度输出的,我们是采用单轴的陀螺仪和Z轴的加速度计进行软件合成角度的。效果还不错。 6. 电机驱动:直接用BTN7971,大电流,就是n贵,注意他的逻辑电路部分,不然会烧了他的控制回路的,建议直接用他的典型应用。前置加高速光耦或者缓冲器隔离,防止烧掉单片机。 7. 电池的选型:尽量选白色的那款,容量大,充满电电压高,注意不要买到假的。 8. 蓝牙通讯模块选型:建议两块HC-05,另外还有一种USB的电平转换模块,对于发图像,发数据十分方便。 9. OLED:调试的时候很有帮助。 10. 下载/仿真器:我们用的是JLINK.整体还好用,就是固件容易被冲,重新刷一下固件就可以了。 11. 板子的制作:原理图一定要检查正确了,尽量找队友检查错误,布线时要注意电源线,电机线尽量粗而且长度对称。 12. 整车的搭建:这个工作很重要,一般要考虑的就是重心位置,转动惯量,电池的位置和固定方式,主板的位置,陀螺仪的位置,摄像头的高度。所有这些对算法,程序,参数的影响非常大。我们的理念就是尽量采用螺钉连接,少用胶枪连接。反正最后搭建的小车应该做到:重心低,重量小,转向灵活,稳定,结实牢固,美观。
二.软件的注意事项: 1.底层驱动:要想入门快,建议用野火的K60的底层驱动,函数丰富,用到的模块驱动函数都有,函数接口十分标准,调用很方便,格式很工整。 2.编译软件:看了一下IAR是最好的开发环境,编译,下载,调试速度快。操作界面简单。 3.程序管理:一定要养成程序随改随存,简单准确的注释,程序版本升级了要记得做好备注。另外,程序的管理很重要,不要把全部程序都放在一个group下,同一硬件模块的函数,变量定义在一个(.C)文件中,另外建一个同名的(.h)把需要外部引用的变量,函数声明一下。程序分成driver文件和header文件以及其他的应用文件,driver文件夹存放(.c)文件,header文件夹存放(.h)文件。这样分别添加,分别管理,就可以保证再编写大型程序时有条不紊。 4.上位机:有一款红树伟业的上位机很好用,串口,示波器,CCD,摄像头,功能强大,协议简单,UART就可以搞定。 5.软件编写:a.好的程序移植性很好,逻辑性强,要做到这两点,就要学会程序的分层,由于我们还不是基于操作系统的编程,所以就要更加注意的程序分层,先是硬件驱动层,只对硬件操作,其上是硬件隔离层,再往上我们就可以编写应用程序,实现我们的算法。层与层之间留有函数接口,层层的调用。自己编写的应用函数要尽量做到函数的移植性好,而且接口好用。b.软件建模方法:我最常用的的就是有限状态机,利用外部事件触发状态状态转移,然后执行相应的动作。c.前后台程序的设计,程序中重要紧急的事情作为前台程序,放在中断中执行,比如数据的采集,控制的实施。而后台程序只是进行如数据的处理,显示,等时间可以延迟的事情。程序一定要注意不要形成阻塞。 6.在线调试:好的程序不是一下就可以写出来的,而是在不断的查错,修改,调试中结晶的。所以,在线仿真可以说是最好的程序调试手段。 三.算法程序 程序和算法,我按照我们开发过程中依次遇见的一些关键问题, 1.FTM模块:我们用了本模块的两个功能, a.一个是PWM波输出,频率是10~20k,注意PWM的精度是1/1000. b.另一个是正交解码功能,把编码器的A,B相输入到本模块的正交解码输入口,就可以读出小车的速度和方向。注意:正交解码一定要使能他的输入引脚的数字滤波功能,不然测得的数字跳变很大,根本不是真实的编码器的输出。 c.测速的话可以测量多次的瞬时速度,作为此时小车的平均速度,用做小车的速度反馈,去控制小车的速度。 2.ADC模块: a. ad连续采集10次取均值或中值再去使用. b.采集陀螺仪和加速度计的输出。 3.UART模块:蓝牙,串口线,都可以连接。发波形,发图像,发数据,必用。 4.DMA:摄像头数据的转运,非常适合用于数据量大的场合。 5.SCCB协议:ov系列摄像头寄存器初始化时用于写摄像头的寄存器。协议基本和IIC一样。 6.中断:中断最重要的是设置各个中断的优先级,行>场>PIT中断。 7.卡尔曼滤波:函数是我们在网上搜的,看懂他需要一点概率论的知识,适用于含有高斯噪声的数据滤波,大概意思是利用先验估计和后验估计更新协方差矩阵,不断迭代,使得输出与测量的协方差最小。我们调试时,测出的角度波形会出现滞后和过冲,关键的就是修改积分时间dt。 8.均值滤波:可以用于AD,编码器测速,图像处理..... 9.中值滤波:用于AD,去除图像的椒盐噪点..... 10.PID算法及其改进: 11.模糊控制: 12.双闭环控制: 13.直立控制: 14.速度控制: 15.转向控制: 16.赛道中线拟合: 17.赛道中线斜率: 18.循迹: 19.坡道: 20.人字: 21.障碍: (继续更新929168503)
|