标签:style blog io ar color sp for 数据 on
不同的算法适应不同的场合,而好的算法都是从以前的经验中提取出来的,只有理论没有实践的算法是闭门造车,从实践中归纳出来的解决问题的办法往往具有便捷性。
大一跟着学长做机器人省赛的时候拼的是时间,因为大一什么都不懂,而我们有的就是时间比较闲,学长做我们看,用俗话说就是跟着学长打酱油;等到大二自己真正动手做的时候,也是用的学长搭好的框架然后自己去在里面添加东西,没有太多思考自己的东西;大三会过来再看的时候突然发现就会时不时的出现一些新的想法,有时候就会产生一些思路去解决问题,这大概就是一个过程吧。
等回过来再做的时候,还是碰到巡线这个问题,硬件还是红外,但思想却有了一个提升,大一是if...else机械式的判断,而现在想到的是我能够通过传感器采集到什么数据,这些数据的准确性如何,我能够利用的是什么数据以及我怎么利用这些数据,如何利用这些数据就涉及到算法的东西了,下面介绍的是我想到的一个算法--红外权值拟合,其实也很简单。
红外权值拟合,思想很简单就是将用于巡线检测的红外赋予不同的权值,中间为零,越往两侧的权值绝对值越大,而左边为正,右边为负,通过求得权值的累加和来算和中线的偏差error作为pid调节的输入来调节舵机的打脚,程序是在codeblocks上模拟的一段代码,具体代码如下:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 unsigned short int infrValue = 0x09 ; 5 signed short int servoErrorThis = 0 ; 6 7 signed short int calcServoError() 8 { 9 unsigned char i ; 10 signed short int error; 11 for (i = 0,error = 0 ;i < 8;i++) 12 { 13 if(infrValue&(0x01<<i)) 14 { 15 //构造偏差函数servoError = (x-4)^2 16 //新函数 (x-2)^2 红外分布为内5外2 17 if(i > 2) //红外左5,符号为正 18 error += i*i-(i<<2)+4 ; 19 else //右2,符号为负 20 error -= i*i-(i<<2)+4 ; 21 printf("%d\t",error) ; 22 } 23 } 24 25 return error; 26 } 27 28 int main() 29 { 30 servoErrorThis = calcServoError(); 31 printf("\n%d",servoErrorThis); 32 return 0; 33 }
标签:style blog io ar color sp for 数据 on
原文地址:http://www.cnblogs.com/Karma-wjc/p/4117292.html