hz770495569 发表于 2014-12-25 11:20:12

红外避障 尺度变换

之前在公司搞智能车的红外避障,用到了夏普的红外传感器,采用Arduino Due开发板读取Sharp 2Y3A003数据。
只采用LED3通道。采用多项式拟合方式,在matlab中,将实验采集的数据导入,进行仪器标定,将传感器读数换算成距离值。代码以及说明见附件。
采用Arduino Due开发板读取Sharp 2Y3A003数据。
只采用LED3通道。
进行仪器标定,采用多项式拟合方式。

定义各个通道端口


函数名称:average_value
函数功能:对原始数据进行滤波处理。取10次数据进行求平均,使得原始数据稳定下来。由于读取一个数据大概35ms,因此1s大概输出3个数据,实时性可根据要求改善。
入口参数:无
出口参数:平均值


函数名称:Get_value
函数功能:按照时序,读取通道值。
入口参数:无
出口参数:val

主循环

3阶参数在260cm内准确测量,精度在10cm内,40-100cm内误差接近10cm。

4阶参数在270cm内准确测量,精度在5cm内。
只读取单通道数值,对其进行滤波处理,传感器数据较为稳定。
         
采用4阶拟合算法,data06是40-300cm测量取出。测试环境良好,数据较为稳定。


/*******************************************
*采用Arduino Due开发板读取Sharp 2Y3A003数据。
*只采用LED3通道。
*进行仪器标定,采用多项式拟合方式。
*******************************************/
//定义各个通道端口
int led_1 = 36;
int led_2 = 37;
int led_3 = 38;
int led_4 = 39;
int led_5 = 40;
int vin = 41;
int sensorPort = 0;

/**********************************************
*函数名称:average_value
*函数功能:对原始数据进行滤波处理。取10次数据进行求平均,使得原始数据稳定下来。由于读取一个数据大概35ms,因此1s大概输出3个数据,实时性可根据要求改善。
*入口参数:无
*出口参数:average_value
************************************************/
int average_value()//算术平均滤波法
{
    int i;
    int filter_sum=0;
    for(i=0;i<10;i++)
    {
      filter_sum += Get_value();
    }
    return (int)(filter_sum/10);
}

/**********************************************
*函数名称:Get_value
*函数功能:按照时序,读取通道值。
*入口参数:无
*出口参数:val
************************************************/
int Get_value()
{
    int val;
    digitalWrite(vin, HIGH);
    digitalWrite(38, HIGH);
    delay(30);
    val = analogRead(sensorPort);
    digitalWrite(vin, LOW);
    digitalWrite(38, LOW);
    delay(5);   
    return val;
}

// 初始化各个引脚和串口,将数字引脚设置为输出,串口波特率为9600 bps
void setup() {
   int i ;
   for (i=36; i <= 41; i++)
   {
      pinMode(i,OUTPUT);
   }
   Serial.begin(9600);
}

//主循环
void loop() {
    int senor_value=average_value();
    //double distance=-0.000005103269*x*x*x+0.007641876120*x*x-3.792620704413*x+691.860882203486;//3阶参数在260cm内准确测量,精度在10cm内,40-100cm内误差接近10cm。
    double distance=0.00000001922*senor_value*senor_value*senor_value*senor_value-0.00003651532*senor_value*senor_value*senor_value
    +0.02538267613*senor_value*senor_value-7.84523683224*senor_value+1006.19414627161;//4阶参数在270cm内准确测量,精度在5cm内。
    Serial.println(distance);
}


matlab代码:

xdata=data06(:,1);
ydata=data06(:,2);
a=polyfit(xdata,ydata,4)
x=100:700;
y=polyval(a,x);
plot(xdata,ydata,'-o',x,y)

q16312610 发表于 2014-12-25 11:34:02

{:smile:}

sunbest80 发表于 2014-12-25 12:09:25

尾部数据点少,拟合的不是很好啊

hz770495569 发表于 2014-12-25 12:48:16

sunbest80 发表于 2014-12-25 12:09
尾部数据点少,拟合的不是很好啊

每隔5cm采集一次数据,距离短的时候还好,距离远了,传感器读数相差不大的,没有必要那么精细。横轴是传感器读数,不是时间轴~
页: [1]
查看完整版本: 红外避障 尺度变换