写在之前的话:
1、目前我是一名在校学生,这也是我第一次写博客,不周之处,请多谅解;
2、此算法并非原创,借鉴自山东德州学院第八届白杨队(PS:个人看法,对于一些人把别人的开源东西改头换面一下就说是自己的原创行为十分鄙视);
3、对于此算法的理解和说明并非纸上谈兵,算法已经被我运用到了小车比赛中并取得好的成绩(具体就不多说了,比赛时车莫名其妙坏了,比赛前调试的速度绝对能进国赛,比较遗憾),总之这算法是我尝试过的最好的算法;
4、这一次所介绍的只是路径算法和一些知识普及,后面有时间会介绍其余部分算法及许多好的思路(舵机电机控制思路(不只是简单的PID),双车策略);
5、希望对于这方面有涉及的人能与我联系并交流或指出不足之处。
6、转载请说明出处:http://www.cnblogs.com/roc-wwp/p/4848136.html(PS:看到有人直接改成恩智浦智能车,也是醉了,这是我上学时写的,当时好自信啊,2333)
---------------------------------------------------------------分割线-----------------------------------------------------------------------------
一、没有这方面了解的可以看看
飞思卡尔智能车分为三组:摄像头、光电、电磁,我做的是电磁车,三种车队区别在于传感器的不同,所以获得路径信息的方法也不一样,摄像头和光电识别的是赛道上的黑线(白底赛道),而电磁车则是检测埋在赛道下的通入100mh电流的漆包线,摄像头和光电采用的是摄像头和ccd作为传感器,电磁则是用电感放在漆包线周围,则电感上就会产生感应电动势,且感应电动势的大小于通过线圈回路的磁通量成正比,又因为漆包线周围的磁感应强度不同,因此不同位置的电感的感应电动势就不同,因此就可以去确定电感位置;因此在车子前面设置了50cm的前瞻,电感布局如下(怎么发不了图片):分为两排,前排3个,编号0,1,2(前期还加了两个竖直电感用来帮助过直角弯,后来改为了八字电感);后排2个,编号3,4;现在车子获得了不同位置的感应电动势的大小了,但这些值是不能处理的:1、感应电动势太微弱;2、是模拟信号,信号太微弱就放大它;这就涉及到模拟电路的知识了,就不多说了(因为要把这讲完到PCB绘制的篇幅就足够写另开一号专门写这些方面来(PS:题外话(我的题外话比较多)):放大部分外围你设计的再好也抵不过一个更好的芯片,有两个例子,一个是我自己的:之前用的是NE5532,但是效果不理想,加了好多什么滤波,补偿,都用上,没用,软件里处理后面再说,后来一狠心换了AD620,感觉像是春天来了,因为它是仪用放大器,还有就是贵。。。,效果是超级赞,去掉了许多附加电路,板子简洁多了,(器件多,故障率也会提高,到后期查故障简直是恶心(能想象拿着万用表和示波器在实验室纠结的样子吗?感觉怎样处理故障还可以专门总结一下))另一个是学长的例子:他参加电子设计竞赛时,有一组(同一学校的)和他题目一样,东西做出来后基本差不多,但是他拿了一等奖,而另一组是二等奖,差别就在于当时的一个滤波,本校指导老师说可以加一个简单电容就行,而他用的则是一款新的滤波芯片,信号最后出来的波形差距挺大的),(我负责的主要是软件部分,但是硬件电路也全程涉及了,不过终究还是不太熟)。
解决完放大就是把模拟信号转换为数字信号了,我们直接用的是芯片上的AD模块,(题外话又来啦:我开始用的是K60是飞思卡尔Kinetis微控制器ARM Cortex®-M4系列,其实就是把它当成了一款高性能的单片机了,实在是浪费,(现在在学嵌入式开发,希望有高手来指导我),后来改为s12了,因为与别的组冲突,感觉K60确实比s12更容易上手,s12还要自己配置寄存器,级联,计算超频,外部时钟频率,k60别人写好了库,就是在不断调用),不过看论坛上有人说飞思卡尔的AD转换有问题,而飞思卡尔也不公开它AD模块具体细节(这貌似有点心虚了,呵呵),不过要是自己做ad模块,那对于整车布局就十分麻烦,所以只好用啦(别人都在用,一起跳坑);处理完了,接下来关门放算法。
二、核心路径算法(为致敬开源,放的是原作者算法)
1 /******************** (C) COPYRIGHT 2011 ********************* ********************2 * 文件名 :Date_analyse.c3 * 描述 :电感数据采集与分析4 *5 * 实验平台 :野火kinetis开发板6 * 库版本 :7 * 嵌入系统 :8 *9 * 作者 :oО殇のSo10 **********************************************************************************/
11 #include "include.h"
12 #define NM 3
13
14 int16 AD_valu[5],AD_V[5][NM],chazhi,chazhi_old;15 float AD[5],sensor_to_one[5];16 float Slope_AD_1; //用于坡道检测
17 int16 max_v[5],min_v[5]; //电感标定 采集值
18 int16 Position_transit[4]; //记录过渡点归一化的值
19 int16 AD_sum[5];20 int16 AD_MAX_NUM; //21 int16 position = 2,position_back = 1;22 floatmax_value,AD_0_max,AD_1_max,AD_2_max,AD_3_max;23
24
25 /*************************************************************************26 * 函数名称 SC_black_Init27 * 功能说明: 最大值采样28 * 参数说明:29 * 函数返回: 无30 * 修改时间:31 * 备 注:32 *************************************************************************/
33 void SC_black_Init(void)34 {35 uint16 i,j;36 int16 Position_tra