红外避障 尺度变换
之前在公司搞智能车的红外避障,用到了夏普的红外传感器,采用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) {:smile:} 尾部数据点少,拟合的不是很好啊
sunbest80 发表于 2014-12-25 12:09
尾部数据点少,拟合的不是很好啊
每隔5cm采集一次数据,距离短的时候还好,距离远了,传感器读数相差不大的,没有必要那么精细。横轴是传感器读数,不是时间轴~
页:
[1]