搜索
bottom↓
回复: 3

红外避障 尺度变换

[复制链接]

出0入0汤圆

发表于 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)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2014-12-25 11:34:02 | 显示全部楼层

出0入0汤圆

发表于 2014-12-25 12:09:25 | 显示全部楼层
尾部数据点少,拟合的不是很好啊

出0入0汤圆

 楼主| 发表于 2014-12-25 12:48:16 | 显示全部楼层
sunbest80 发表于 2014-12-25 12:09
尾部数据点少,拟合的不是很好啊

每隔5cm采集一次数据,距离短的时候还好,距离远了,传感器读数相差不大的,没有必要那么精细。横轴是传感器读数,不是时间轴~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-12 09:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表