轨迹处理系列:轨迹中寻找波峰波谷
在角度轨迹中寻找角度最大的值,即为第一个波峰或者第一个波谷,笛卡尔坐标系中,通过atan2获取的角度最大并不一定是在拐弯,直线上的轻微抖动都会形成一个类似拐弯的角度,比如行驶的角度为 【160°,162°,167°,170°,168°,166°】,其实这是一条只想,波峰出现在170°的位置,
//窗口滤波寻找峰值 峰谷 char findPeaksAndTroughs(int p,int *out_p) { int start = 1; // Starting index to search //0123 4 5678 const unsigned char cnt =0; static int flag_first=0; static int _buff[5]; int sum; const int _buff_max=5; if(flag_first==0)//如果是第一次进来 { flag_first=1; for(int i=0, sum =0;i< _buff_max;i++)//认为所有的元素都是一样的值 { _buff[i]= p; } return -1; }else if(flag_first++ < 5) { for(int i=0;i<(_buff_max-1);i++) { _buff[i]= _buff[i+1];//buff[1]变成buff[0],buff[2]变成buff[1],依次类推 } _buff[4]= p;//将最新值赋值给buff[9] return -1; }else { flag_first =6; for(int i=0;i<(_buff_max-1);i++) { _buff[i]= _buff[i+1];//buff[1]变成buff[0],buff[2]变成buff[1],依次类推 } _buff[4]= p;//将最新值赋值给buff[8] int middle = _buff[2]; int lastAverage = (_buff[0] +_buff[1])/2; int nextAverage = (_buff[3] +_buff[4])/2; static char _flg_signal = 0;//互斥信号量 if(middle > lastAverage && middle > nextAverage && middle > 0 && lastAverage>0 &&nextAverage>0)//peak 波峰 { if( _flg_signal == 1)_flg_signal =0;//互斥信号量 只运行一次 _flg_signal -- ; if( _flg_signal < -1){ _flg_signal =-1; return -1; } *out_p = middle; return 1; } else if(middle < lastAverage && middle < nextAverage && middle < 0 && lastAverage<0 &&nextAverage<0)//throughs 波菇 { if( _flg_signal == -1)_flg_signal =0; _flg_signal ++ ; if( _flg_signal > 1){ _flg_signal =1; return -1; } *out_p = middle; return 0; } } return -1; }