红外权值拟合

  不同的算法适应不同的场合,而好的算法都是从以前的经验中提取出来的,只有理论没有实践的算法是闭门造车,从实践中归纳出来的解决问题的办法往往具有便捷性。

  大一跟着学长做机器人省赛的时候拼的是时间,因为大一什么都不懂,而我们有的就是时间比较闲,学长做我们看,用俗话说就是跟着学长打酱油;等到大二自己真正动手做的时候,也是用的学长搭好的框架然后自己去在里面添加东西,没有太多思考自己的东西;大三回过来再看的时候突然发现就会时不时的出现一些新的想法,有时候就会产生一些思路去解决问题,这大概就是一个过程吧。

  等回过来再做的时候,还是碰到巡线这个问题,硬件还是红外,但思想却有了一个提升,大一是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	",error) ;
22         }
23     }
24 
25     return error;
26 }
27 
28 int main()
29 {
30     servoErrorThis = calcServoError();
31     printf("
%d",servoErrorThis);
32     return 0;
33 }

  

原文地址:https://www.cnblogs.com/Karma-wjc/p/4117292.html