智能车基础车型-电磁车的硬件介绍和操作系统(2)

                                                     电感寻迹及元素判断

                                

一、元素判断(重难点问题)

1、理论分析

从此图可以看出理论上小车在经过三叉、环岛和十字时,左右两个电感的电感值都会接近磁感线,检测这个特征就可以识别到了,为了防止误判还可以增加一个中间电感或者斜放置电感来辅助判断。电感只有线圈切割磁场时才能产生感应电动势,线圈和磁场平行时是没有感应电动势的,但是在这些特殊元素是,原本没有切割磁场的电感可能突然就切割了磁感线,这里留给大家自己去发挥。

此处提供一个思路,直接看图:

弯道:L-R>0/<0

2、代码实现

元素判断是智能车能够正确运行的重中之重,如果想让智能车全部沿着正确的元素快速运行,那你的元素判断这部分代码一定要正确!准确!实用!快速反应!元素判断主要包括的元素为:直线、环岛、路障、坡道以及其他的操作系统如:倒车、出库、停车等。那么接下来我们将一起探索元素判断的代码的神奇世界........

(1)完整代码实现

/赛道位置偏差判断及元素识别
//                                                                           //
//                                                                           //
//                                                                           //
///
 
#include "math.h"
#include "elec_tracking.h"
#include "elec_sensor.h"
#include "SEEKFREE_WIRELESS.h"
#include "motor.h"
#include "pid.h"
#include "headfile.h"
static uint8 pst_count = 9;
struct position pst = {0,0,0,0,0,0,0,0,0,0};
struct type roadtype = {0,0,0,0,0,0};
int16 bizhang_f = 1;
int16 stamp_f = 1;
int16 block_flag = 0;
int16 block_count = 0;
int16 stop_f = 1;
int16 stop_count = 0;
int16 stop_count_2 = 0;
int16 chuku_flag = 0;
int16 chuku_f = 1;
int16 roundabout_flag_l = 0;
int16 roundabout_flag_r = 0;
 
int16 roundabout_speed = 230; //环岛初始速度
 
uint8 block_sum = 1; //路障或者坡道的总的个数
int16 exit = -1;  //  -1为右边出库,1为左边出库
int16 block_dir = -1;   //-1为从右边过避障,1为从左边过避障  
 
 
uint8 block1 = 0;
uint8 block2 = 0;
uint8 block3 = 0;
uint8 block4 = 0;
uint8 block5 = 0;
uint8 block6 = 0;
uint8 block7 = 0;
 
int16 block_distance1 = 300;
int16 block_distance2 = 160;
int16 block_distance3 = 350;
int16 block_distance4 = 180;
 
int16 huang_distance = 700;
int16 block_mm = 980;
int16 daoche_distance = 130;
uint8 roundabout_off = 0;
 
int16 count = 0;
int16 stop_off = 0;
int block_arrange[7]={0,0,0,0,0,0,0};
 
void block_sort()  //路障坡道排序函数
{
	block_arrange[0] = block1;
	block_arrange[1] = block2;
	block_arrange[2] = block3;
	block_arrange[3] = block4;
	block_arrange[4] = block5;
	block_arrange[5] = block6;
	block_arrange[6] = block7;
}
 
uint8 roundabout_on = 0;  //环岛开关
uint8 block_on = 0;       //路障开关
uint8 chuku_on = 0;    //出库开关 
uint8 stop_on = 0; 
uint8 stop_on_2 = 0; 
 
uint8 stop_flag_on = 0;   //停车开关
uint8 stop_flag_on_2 = 0;
 
bit stop_flag = 0;
bit stop_flag_2 = 0;
bit stop_status = 1;
bit stop_status_1 = 0;
bit stop_status_2 = 0;
//上一次开关状态变量
bit stop_last_status = 1;
bit stop_last_status_1 = 0;
bit stop_last_status_2 = 0;
 
 
//-------------------------------------------------------------------------------------------------------------------
//  @brief      计算位置偏差
//  @param      struct position *pst,struct buff *value_buff,struct type *roadtype    
//  @return     void
//  Sample usage:           
//-------------------------------------------------------------------------------------------------------------------	
void pst_judgment(struct position *pst,struct buff *value_buff,struct type *roadtype) 
{	
    uint8 i,max;
	max = value_buff->value[0];
	pst->maxnum = 0;
//	if (value_buff->value[0]>=5||value_buff->value[4]>=5)
//	{
//		wangdao_flag = 0;
//	}
//	else
//	{
//			wangdao_flag = 1;
//	}
	if (roadtype->type == 6 || roadtype->type == 5)   //圆环  左环岛或者右环岛
	{
		max = value_buff->value[1];
		value_buff->value[2] = 0.72*value_buff->value[2];  //模拟正常循迹中间电感大小
		if (value_buff->value[1]>=10||value_buff->value[3]>=10)
		{			
			
			for (i=1;i<4;i+=1)
			{
				if (value_buff->value[i] > max)//0=3   4=1
				{
					pst->maxnum = i;
					max = value_buff->value[i];
				}
			}				
			if(((pst->last_maxnum==2)&&(pst->maxnum==3))&&abs(value_buff->value[3]-value_buff->value[2])<=3)  //车身右偏
			{
				if(pst->maxnum==3||(abs(value_buff->value[3]-value_buff->value[2])<=3))
					pst->L12=(value_buff->value[3]+value_buff->value[2])>>1;//40左右  偏离电磁线的位置数据 车身右偏即偏离左电磁线
				if(pst->L12>=60) pst->L12=60;   
				if(pst->L12<=35) pst->L12=35;   
			}
		
		
			if(((pst->last_maxnum==2)&&(pst->maxnum==1))&&abs(value_buff->value[1]-value_buff->value[2])<=3)//车身左偏
			{
				if(pst->maxnum==1||(abs(value_buff->value[1]-value_buff->value[2])<=3))
					pst->R12=(value_buff->value[2]+value_buff->value[1])>>1; //40左右  偏离电磁线的位置数据 车身左偏即偏离右电磁线
				if(pst->R12>=60) pst->R12=60; 
				if(pst->R12<=35) pst->R12=35; 
			}		
	
//=====================pst0计算===========================//
			if(pst->maxnum==2)//中间电感2最大 
			{
 
					pst->E_pst0=(int16)(value_buff->value[3]-value_buff->value[1])>>2;          //pst0:-8~8    
				
				if(pst->E_pst0<=-pst_count)    pst->E_pst0=-pst_count;            
				if(pst->E_pst0>= pst_count)    pst->E_pst0= pst_count;
				
			}
			else if(pst->maxnum==3)//左边电感0最大    ?  
			{				
				pst->E_pst0=(int16)(pst_count+(pst->L12 - value_buff->value[2])>>1);   //pst0:9~18
				if(pst->E_pst0<=pst_count)   pst->E_pst0=pst_count; 
				
			}
			
			else //右边电感4最大
			{				
				pst->E_pst0=(int16)(0-(pst_count+(pst->R12-value_buff->value[2])>>1));
				if(pst->E_pst0 >= -pst_count)  pst->E_pst0 = -pst_count;  
			}
							
	}
		else
		{
			pst->E_pst0=pst->E_last_pst0;
 
      pst->maxnum=pst->last_maxnum;
		}
 
	pst->llast_maxnum = pst->last_maxnum;
	pst->last_maxnum = pst->maxnum;  
	pst->E_llast_pst0=pst->E_last_pst0;
	pst->E_last_pst0=pst->E_pst0;
		//P75 = 1;
	}		
 
	else  //非圆环
	{
		if (value_buff->value[0]>=2||value_buff->value[4]>=2)
		{			
			for (i=0;i<5;i+=2)
			{
				if (value_buff->value[i] > max)
				{
					pst->maxnum = i;
					max = value_buff->value[i];
				}
			}				
			if(((pst->last_maxnum==2)&&(pst->maxnum==0))&&abs(value_buff->value[0]-value_buff->value[2])<=3)  //车身右偏
			{
				if(pst->maxnum==0||(abs(value_buff->value[0]-value_buff->value[2])<=1))
					pst->L12=(value_buff->value[0]+value_buff->value[2])>>1;//40左右
				if(pst->L12>=60) pst->L12=60;   
				if(pst->L12<=40) pst->L12=40;   
			}
		
		
			if(((pst->last_maxnum==2)&&(pst->maxnum==4))&&abs(value_buff->value[4]-value_buff->value[2])<=3)//车身左偏
			{
				if(pst->maxnum==4||(abs(value_buff->value[4]-value_buff->value[2])<=1))
					pst->R12=(value_buff->value[2]+value_buff->value[4])>>1;
				if(pst->R12>=60) pst->R12=60; 
				if(pst->R12<=40) pst->R12=40; 
			}		
	
//=====================pst0计算===========================//
			if(pst->maxnum==2)//中间电感2最大 
			{
 
					pst->E_pst0=(int16)(value_buff->value[0]-value_buff->value[4])>>2;          //pst0:-8~8    
				
				if(pst->E_pst0<=-pst_count)    pst->E_pst0=-pst_count;            
				if(pst->E_pst0>= pst_count)    pst->E_pst0= pst_count;
				
			}
			else if(pst->maxnum==0)//左边电感0最大      
			{				
				pst->E_pst0=(int16)(pst_count+(pst->L12-value_buff->value[2])>>1);   //pst0:9~18
				if(pst->E_pst0<=pst_count)   pst->E_pst0=pst_count; 
				
			}
			
			else //右边电感4最大
			{				
				pst->E_pst0=(int16)(0-(pst_count+(pst->R12-value_buff->value[2])>>1));
				if(pst->E_pst0 >= -pst_count)  pst->E_pst0 = -pst_count;  
			}
							
	}
		else
		{
			pst->E_pst0=pst->E_last_pst0;
 
      pst->maxnum=pst->last_maxnum;
		}
	if(pst->E_pst0>=30)     
	{
		pst->E_pst0=30; 
	}		
    if(pst->E_pst0<=-30)    
	{
		pst->E_pst0=-30;
	}
		if(pst->L12<=40)
	{		
		pst->L12=40; 
	}
	if(pst->R12<=40)
	{		
		pst->R12=40; 
	}
	pst->llast_maxnum = pst->last_maxnum;
	pst->last_maxnum = pst->maxnum;  
	pst->E_llast_pst0=pst->E_last_pst0;
	pst->E_last_pst0=pst->E_pst0;
  }
}
//-------------------------------------------------------------------------------------------------------------------
//  @brief      判断环岛
//  @param      struct buff *value_buff,struct type *roadtype,uint16 distance
//  @return     void
//  Sample usage:           
//-------------------------------------------------------------------------------------------------------------------	 
void roundabout_identification(struct buff *value_buff,struct type *roadtype,int16 *distance)
{
	if (roadtype->roundabout_flag == 1 && (value_buff->value[0]>=60 || value_buff->value[4]>=60 || value_buff->value[2]>=70) && roadtype->roundabout_count == 1)    //清环岛标志位
	{
			   
			roadtype->roundabout_flag = 0;
			roadtype->roundabout_count = 0;
			roundabout_off = 1;
			set_speed = flag_speed;  //把速度标志位赋值给设定速度
			P75 = 1;	
	}
 
	if (roadtype->roundabout_flag ==0 && value_buff->value[2]>=80 && block_flag ==0 && roundabout_off == 0)
	{
		set_speed = roundabout_speed; //将环岛的速度赋值给设定速度
		roadtype->roundabout_flag = 1; //判别为环岛
		P75 = 0;
		roadtype->type = 6;
	}
	if(*distance >= huang_distance && roadtype->roundabout_flag == 1)  //入环后
		{
			roadtype->type = 0;
			roadtype->roundabout_count = 1;
			set_speed = 450;   //快速加速恢复直道时的速度  
			
			*distance = 0;
		}
	if(*distance >=1000 && roundabout_off == 1)
	{
		roundabout_off = 0;
		*distance = 0;
	}
}
 
//-------------------------------------------------------------------------------------------------------------------
//  @brief      判断路障或坡道
//  @param      int16 distance
//  @return     void
//  Sample usage:           
//-------------------------------------------------------------------------------------------------------------------	
void block_judge(int16 distance) 
{
	if((distance < block_mm)&&(distance>300)&&(abs(pst.E_pst0)<9) && chuku_on == 0)
//		block_count ++;
//	else if(distance>800||distance<800)
//		block_count=0;
//	if(block_count>0)  //此处的判断条件可用于 延时处理
	{
		block_flag = 1;
//		//block_count = 0;
//		//set_speed = 250;
		P75 = 0;
	}
}	
 
//-------------------------------------------------------------------------------------------------------------------
//  @brief      停车检测
//  @param      stop_judge()
//  @return     void
//  Sample usage:           
//-------------------------------------------------------------------------------------------------------------------	
void stop_judge(int16 *distance)
{
		if(stop_count == 1 &&	stop_flag == 1)
		{
			roadtype.type = 0;
			*distance = 0;
			set_speed = -500;
			stop_flag_on = 1;
			dir.p = 100;
			pst.E_pst0 = 30*exit;
			brushless_buty = 3200;
			P75 = 1;
			stop_count = 0;
		}
	  if( P76 == 1 && chuku_on == 0 && (abs(pst.E_pst0)<8) && stop_flag == 0 && stop_off == 0)    
	 {
		 P75 = 0;
		stop_flag = 1;
		 roadtype.type = 5;
	 }
 	 if (stop_flag == 1 && stop_count < 1)
		{
			if(*distance > 50 && P76 == 1)
			{
				P75 = 1;
				set_speed = flag_speed;
				stop_flag = 0;
				roadtype.type = 0;
				*distance = 0;
				stop_off = 1; 
			}
			if(*distance > 50&& P76 == 0)
			{
				roadtype.type = 0;
				stop_flag = 0;
				*distance = 0;
			}
		}
		if(stop_off == 1  && P76 == 0)
		{
			stop_count = 1;
			stop_off = 0;
		}	
}
 
//-------------------------------------------------------------------------------------------------------------------
//  @brief      倒车函数
//  @param      NULL
//  @return     void
//  Sample usage:  exit表示打角的方向,-1为右边,1为左边           
//-------------------------------------------------------------------------------------------------------------------
void back_off(int16 *distance)//入库函数
{		
			if(stop_f ==1 && (l_cur_speed < 70 || r_cur_speed < 70))
			{
				//
				set_speed = 60;
				pst.E_pst0 = 30*exit;//
				if(*distance>300)
				{
//				brushless_on = 0;
//				motor_on = 0;
//				set_speed = 0;
				*distance = 0;
				//stop_flag_on = 0;
				stop_f = 2;
				}			
			}
			if(stop_f == 2)
			{
				set_speed = 50;
				pst.E_pst0 = 0;
				if(*distance > 30)
				{
					brushless_on = 0;
					motor_on = 0;
					set_speed = 0;
					*distance = 0;
					stop_flag_on = 0;
					//stop_count = 1;
					stop_f = 0;
				}			
			}
			if(stop_f ==3)
			{			
				set_speed = -100;
				pst.E_pst0 = 20*exit;
				//set_speed = 0;
				if(*distance<-230)
				{
					*distance = 0;
					stop_f = 4;
					//P75 = 1;					
				}
			}
			if(stop_f ==4)
			{						
				dir_ctrl(&dir,0);
			}
}
 
 
 
//-------------------------------------------------------------------------------------------------------------------
//  @brief      路障函数
//  @param      NULL 
//  @return     void
//  Sample usage:   block_dir表示避障的方向,-1为右边,1为左边       
//-------------------------------------------------------------------------------------------------------------------	
void barrier(int16 *distance) //路障
{
	if(bizhang_f == 1)
	{	
		set_speed = 300;
		pst.E_pst0 =block_dir*25;
		if(*distance > block_distance1)
		{
			bizhang_f = 2;
			*distance = 0;
		}
	}
	if(bizhang_f == 2)
	{
		pst.E_pst0 =-block_dir*12;
		if(*distance > block_distance2)
		{
			bizhang_f = 3;
			*distance = 0;
		}
	}
	if(bizhang_f == 3)
	{
		pst.E_pst0=-block_dir*25;
		if(*distance > block_distance3)
		{
			bizhang_f = 4;
			*distance = 0;
		}
	}	
	if(bizhang_f == 4)
	{
		pst.E_pst0=block_dir*15;
		if(*distance > block_distance4)
		{
			//set_speed = 0;
			block_flag = 0;
			count ++;
			//block_on = 0;
			set_speed = flag_speed;
			P75 = 1;
			*distance = 0;
			bizhang_f = 1;
		}	
	}
}
 
//-------------------------------------------------------------------------------------------------------------------
//  @brief      坡道函数
//  @param      NULL
//  @return     void
//  Sample usage:  上坡做减速处理         
//-------------------------------------------------------------------------------------------------------------------	
void ramp_sign(int16 *distance) //坡道函数
{
	if(stamp_f == 1)
	{	
		set_speed = 280;
		if(*distance>300)
		{
			stamp_f = 2;
			*distance = 0;
		}
	}
//	if(stamp_f == 2)
//	{
//		set_speed = 300;
//		if(*distance>700)
//		{
//			stamp_f = 3;
//			*distance = 0;
//		}
//	}	
	if(stamp_f == 2)
	{
		set_speed = 320;
		if(*distance>1400 )
		{
			set_speed = flag_speed;
			count ++;
			P75 = 1;
			*distance = 0;
			block_flag = 0;
			stamp_f = 1;
		}	
	}
}
 
//-------------------------------------------------------------------------------------------------------------------
//  @brief      将坡道和路障分开
//  @param      NULL
//  @return     void
//  Sample usage:  0执行坡道函数,1执行避障函数         
//-------------------------------------------------------------------------------------------------------------------	
void block()  //将坡道和路障分开   
{
		if(block_arrange[count]==0)
		{
			ramp_sign(&distance);
		}
		else
		{
			barrier(&distance);
		}	
 
}
 
//-------------------------------------------------------------------------------------------------------------------
//  @brief      出库函数
//  @param      NULL
//  @return     void
//  Sample usage:  打一定的角度出库         
//-------------------------------------------------------------------------------------------------------------------
void exit_off(int16 *distance) // 出库函数
{
	if(chuku_f == 1 && chuku_on == 1)
	{	
		pst.E_pst0=15*exit;
		set_speed = 100;
		if(*distance>30)
		{
			chuku_f = 2;
			*distance = 0;
		}
	}
	if(chuku_f == 2)
	{
		pst.E_pst0=20*exit;
		set_speed = 200;
		if(*distance>175)
		{
			
			*distance = 0;
			chuku_f = 3;
		}
	}	
	if(chuku_f == 3)
	{
		set_speed = 300;
		if(*distance>100)
		{
			
			*distance = 0;
			chuku_f = 0;
			set_speed = flag_speed ;
			chuku_on = 0;
		}
	}	
}
 
void stop_judge_2()//霍尔检测停车模块  磁铁
{
	//读取上一次状态
	  stop_last_status = stop_status;
	
   //读取当前按键状态
    stop_status = STOP_PIN;
	  if(!stop_status && stop_last_status && stop_count_2 == 0 && chuku_on == 0)    
	 {
		 stop_flag_on_2 = 1;
		 set_speed = -100;
		 stop_flag_2 = 1;		 	 
	 }
 	 if (stop_flag_2 == 1)
		{		
			stop_count_2 = 1;			
			stop_flag_2 = 0;
		}	
		
}
 
//-------------------------------------------------------------------------------------------------------------------
//  @brief      倒车函数
//  @param      NULL
//  @return     void
//  Sample usage:  exit表示打角的方向,-1为右边,1为左边           
//-------------------------------------------------------------------------------------------------------------------
void back_off_2(int16 *distance)//倒车函数
{		
			if(stop_f == 1 && (l_cur_speed < 60 || r_cur_speed < 60))
			{
				//pst.E_pst0 = 0;
				set_speed = 40;
				pst.E_pst0 = 0;
				if(*distance>50)
				{
					*distance = 0;
					//stop_count = 1;
					stop_f = 2;
				}			
			}
			if(stop_f == 2)
			{
				//pst.E_pst0 = 0;
				set_speed = -50;
				pst.E_pst0 = 0;
				if(*distance < -200)
				{
					*distance = 0;
					stop_f = 3;
				}			
			}
			if(stop_f ==3)
			{			
				set_speed = -200;
				pst.E_pst0 = 20*exit;
				if(*distance<-180)
				{
					*distance = 0;
					stop_f = 4;					
				}
			}
			if(stop_f ==4)
			{			
				set_speed = -250;
				pst.E_pst0 = 10*exit;
				if(*distance<-220)
				{
					brushless_on = 0;
					motor_on = 0;
					stop_flag_on = 0;
					set_speed = 0;
					*distance = 0;
					stop_f = 0;
					//P75 = 1;					
				}
			}
}

(2)计算位置偏差

//-------------------------------------------------------------------------------------------------------------------
//  @brief      计算位置偏差
//  @param      struct position *pst,struct buff *value_buff,struct type *roadtype    
//  @return     void
//  Sample usage:           
//-------------------------------------------------------------------------------------------------------------------	
void pst_judgment(struct position *pst,struct buff *value_buff,struct type *roadtype) 
{	
    uint8 i,max;
	max = value_buff->value[0];
	pst->maxnum = 0;
//	if (value_buff->value[0]>=5||value_buff->value[4]>=5)
//	{
//		wangdao_flag = 0;
//	}
//	else
//	{
//			wangdao_flag = 1;
//	}
	if (roadtype->type == 6 || roadtype->type == 5)   //圆环  左环岛或者右环岛
	{
		max = value_buff->value[1];
		value_buff->value[2] = 0.72*value_buff->value[2];  //模拟正常循迹中间电感大小
		if (value_buff->value[1]>=10||value_buff->value[3]>=10)
		{			
			
			for (i=1;i<4;i+=1)
			{
				if (value_buff->value[i] > max)//0=3   4=1
				{
					pst->maxnum = i;
					max = value_buff->value[i];
				}
			}				
			if(((pst->last_maxnum==2)&&(pst->maxnum==3))&&abs(value_buff->value[3]-value_buff->value[2])<=3)  //车身右偏
			{
				if(pst->maxnum==3||(abs(value_buff->value[3]-value_buff->value[2])<=3))
					pst->L12=(value_buff->value[3]+value_buff->value[2])>>1;//40左右  偏离电磁线的位置数据 车身右偏即偏离左电磁线
				if(pst->L12>=60) pst->L12=60;   
				if(pst->L12<=35) pst->L12=35;   
			}
		
		
			if(((pst->last_maxnum==2)&&(pst->maxnum==1))&&abs(value_buff->value[1]-value_buff->value[2])<=3)//车身左偏
			{
				if(pst->maxnum==1||(abs(value_buff->value[1]-value_buff->value[2])<=3))
					pst->R12=(value_buff->value[2]+value_buff->value[1])>>1; //40左右  偏离电磁线的位置数据 车身左偏即偏离右电磁线
				if(pst->R12>=60) pst->R12=60; 
				if(pst->R12<=35) pst->R12=35; 
			}		
	
//=====================pst0计算===========================//
			if(pst->maxnum==2)//中间电感2最大 
			{
 
					pst->E_pst0=(int16)(value_buff->value[3]-value_buff->value[1])>>2;          //pst0:-8~8    
				
				if(pst->E_pst0<=-pst_count)    pst->E_pst0=-pst_count;            
				if(pst->E_pst0>= pst_count)    pst->E_pst0= pst_count;
				
			}
			else if(pst->maxnum==3)//左边电感0最大    ?  
			{				
				pst->E_pst0=(int16)(pst_count+(pst->L12 - value_buff->value[2])>>1);   //pst0:9~18
				if(pst->E_pst0<=pst_count)   pst->E_pst0=pst_count; 
				
			}
			
			else //右边电感4最大
			{				
				pst->E_pst0=(int16)(0-(pst_count+(pst->R12-value_buff->value[2])>>1));
				if(pst->E_pst0 >= -pst_count)  pst->E_pst0 = -pst_count;  
			}
							
	}
		else
		{
			pst->E_pst0=pst->E_last_pst0;
 
      pst->maxnum=pst->last_maxnum;
		}
 
	pst->llast_maxnum = pst->last_maxnum;
	pst->last_maxnum = pst->maxnum;  
	pst->E_llast_pst0=pst->E_last_pst0;
	pst->E_last_pst0=pst->E_pst0;
		//P75 = 1;
	}		
 
	else  //非圆环
	{
		if (value_buff->value[0]>=2||value_buff->value[4]>=2)
		{			
			for (i=0;i<5;i+=2)
			{
				if (value_buff->value[i] > max)
				{
					pst->maxnum = i;
					max = value_buff->value[i];
				}
			}				
			if(((pst->last_maxnum==2)&&(pst->maxnum==0))&&abs(value_buff->value[0]-value_buff->value[2])<=3)  //车身右偏
			{
				if(pst->maxnum==0||(abs(value_buff->value[0]-value_buff->value[2])<=1))
					pst->L12=(value_buff->value[0]+value_buff->value[2])>>1;//40左右
				if(pst->L12>=60) pst->L12=60;   
				if(pst->L12<=40) pst->L12=40;   
			}
		
		
			if(((pst->last_maxnum==2)&&(pst->maxnum==4))&&abs(value_buff->value[4]-value_buff->value[2])<=3)//车身左偏
			{
				if(pst->maxnum==4||(abs(value_buff->value[4]-value_buff->value[2])<=1))
					pst->R12=(value_buff->value[2]+value_buff->value[4])>>1;
				if(pst->R12>=60) pst->R12=60; 
				if(pst->R12<=40) pst->R12=40; 
			}		
	
//=====================pst0计算===========================//
			if(pst->maxnum==2)//中间电感2最大 
			{
 
					pst->E_pst0=(int16)(value_buff->value[0]-value_buff->value[4])>>2;          //pst0:-8~8    
				
				if(pst->E_pst0<=-pst_count)    pst->E_pst0=-pst_count;            
				if(pst->E_pst0>= pst_count)    pst->E_pst0= pst_count;
				
			}
			else if(pst->maxnum==0)//左边电感0最大      
			{				
				pst->E_pst0=(int16)(pst_count+(pst->L12-value_buff->value[2])>>1);   //pst0:9~18
				if(pst->E_pst0<=pst_count)   pst->E_pst0=pst_count; 
				
			}
			
			else //右边电感4最大
			{				
				pst->E_pst0=(int16)(0-(pst_count+(pst->R12-value_buff->value[2])>>1));
				if(pst->E_pst0 >= -pst_count)  pst->E_pst0 = -pst_count;  
			}
							
	}
		else
		{
			pst->E_pst0=pst->E_last_pst0;
 
      pst->maxnum=pst->last_maxnum;
		}
	if(pst->E_pst0>=30)     
	{
		pst->E_pst0=30; 
	}		
    if(pst->E_pst0<=-30)    
	{
		pst->E_pst0=-30;
	}
		if(pst->L12<=40)
	{		
		pst->L12=40; 
	}
	if(pst->R12<=40)
	{		
		pst->R12=40; 
	}
	pst->llast_maxnum = pst->last_maxnum;
	pst->last_maxnum = pst->maxnum;  
	pst->E_llast_pst0=pst->E_last_pst0;
	pst->E_last_pst0=pst->E_pst0;
  }
}

 (3)判断环岛

//-------------------------------------------------------------------------------------------------------------------
//  @brief      判断环岛
//  @param      struct buff *value_buff,struct type *roadtype,uint16 distance
//  @return     void
//  Sample usage:           
//-------------------------------------------------------------------------------------------------------------------	 
void roundabout_identification(struct buff *value_buff,struct type *roadtype,int16 *distance)
{
	if (roadtype->roundabout_flag == 1 && (value_buff->value[0]>=60 || value_buff->value[4]>=60 || value_buff->value[2]>=70) && roadtype->roundabout_count == 1)    //清环岛标志位
	{
			   
			roadtype->roundabout_flag = 0;
			roadtype->roundabout_count = 0;
			roundabout_off = 1;
			set_speed = flag_speed;  //把速度标志位赋值给设定速度
			P75 = 1;	
	}
 
	if (roadtype->roundabout_flag ==0 && value_buff->value[2]>=80 && block_flag ==0 && roundabout_off == 0)
	{
		set_speed = roundabout_speed; //将环岛的速度赋值给设定速度
		roadtype->roundabout_flag = 1; //判别为环岛
		P75 = 0;
		roadtype->type = 6;
	}
	if(*distance >= huang_distance && roadtype->roundabout_flag == 1)  //入环后
		{
			roadtype->type = 0;
			roadtype->roundabout_count = 1;
			set_speed = 450;   //快速加速恢复直道时的速度  
			
			*distance = 0;
		}
	if(*distance >=1000 && roundabout_off == 1)
	{
		roundabout_off = 0;
		*distance = 0;
	}
}

(4)判断路障

//-------------------------------------------------------------------------------------------------------------------
//  @brief      路障函数
//  @param      NULL 
//  @return     void
//  Sample usage:   block_dir表示避障的方向,-1为右边,1为左边       
//-------------------------------------------------------------------------------------------------------------------	
void barrier(int16 *distance) //路障
{
	if(bizhang_f == 1)
	{	
		set_speed = 300;
		pst.E_pst0 =block_dir*25;
		if(*distance > block_distance1)
		{
			bizhang_f = 2;
			*distance = 0;
		}
	}
	if(bizhang_f == 2)
	{
		pst.E_pst0 =-block_dir*12;
		if(*distance > block_distance2)
		{
			bizhang_f = 3;
			*distance = 0;
		}
	}
	if(bizhang_f == 3)
	{
		pst.E_pst0=-block_dir*25;
		if(*distance > block_distance3)
		{
			bizhang_f = 4;
			*distance = 0;
		}
	}	
	if(bizhang_f == 4)
	{
		pst.E_pst0=block_dir*15;
		if(*distance > block_distance4)
		{
			//set_speed = 0;
			block_flag = 0;
			count ++;
			//block_on = 0;
			set_speed = flag_speed;
			P75 = 1;
			*distance = 0;
			bizhang_f = 1;
		}	
	}
}

(4) 判断坡道

//-------------------------------------------------------------------------------------------------------------------
//  @brief      坡道函数
//  @param      NULL
//  @return     void
//  Sample usage:  上坡做减速处理         
//-------------------------------------------------------------------------------------------------------------------	
void ramp_sign(int16 *distance) //坡道函数
{
	if(stamp_f == 1)
	{	
		set_speed = 280;
		if(*distance>300)
		{
			stamp_f = 2;
			*distance = 0;
		}
	}
//	if(stamp_f == 2)
//	{
//		set_speed = 300;
//		if(*distance>700)
//		{
//			stamp_f = 3;
//			*distance = 0;
//		}
//	}	
	if(stamp_f == 2)
	{
		set_speed = 320;
		if(*distance>1400 )
		{
			set_speed = flag_speed;
			count ++;
			P75 = 1;
			*distance = 0;
			block_flag = 0;
			stamp_f = 1;
		}	
	}
}

(5)倒车

//-------------------------------------------------------------------------------------------------------------------
//  @brief      倒车函数
//  @param      NULL
//  @return     void
//  Sample usage:  exit表示打角的方向,-1为右边,1为左边           
//-------------------------------------------------------------------------------------------------------------------
void back_off(int16 *distance)//入库函数
{		
			if(stop_f ==1 && (l_cur_speed < 70 || r_cur_speed < 70))
			{
				//
				set_speed = 60;
				pst.E_pst0 = 30*exit;//
				if(*distance>300)
				{
//				brushless_on = 0;
//				motor_on = 0;
//				set_speed = 0;
				*distance = 0;
				//stop_flag_on = 0;
				stop_f = 2;
				}			
			}
			if(stop_f == 2)
			{
				set_speed = 50;
				pst.E_pst0 = 0;
				if(*distance > 30)
				{
					brushless_on = 0;
					motor_on = 0;
					set_speed = 0;
					*distance = 0;
					stop_flag_on = 0;
					//stop_count = 1;
					stop_f = 0;
				}			
			}
			if(stop_f ==3)
			{			
				set_speed = -100;
				pst.E_pst0 = 20*exit;
				//set_speed = 0;
				if(*distance<-230)
				{
					*distance = 0;
					stop_f = 4;
					//P75 = 1;					
				}
			}
			if(stop_f ==4)
			{						
				dir_ctrl(&dir,0);
			}
}

(6)出库

//-------------------------------------------------------------------------------------------------------------------
//  @brief      出库函数
//  @param      NULL
//  @return     void
//  Sample usage:  打一定的角度出库         
//-------------------------------------------------------------------------------------------------------------------
void exit_off(int16 *distance) // 出库函数
{
	if(chuku_f == 1 && chuku_on == 1)
	{	
		pst.E_pst0=15*exit;
		set_speed = 100;
		if(*distance>30)
		{
			chuku_f = 2;
			*distance = 0;
		}
	}
	if(chuku_f == 2)
	{
		pst.E_pst0=20*exit;
		set_speed = 200;
		if(*distance>175)
		{
			
			*distance = 0;
			chuku_f = 3;
		}
	}	
	if(chuku_f == 3)
	{
		set_speed = 300;
		if(*distance>100)
		{
			
			*distance = 0;
			chuku_f = 0;
			set_speed = flag_speed ;
			chuku_on = 0;
		}
	}	
}

(7) 停车

oid stop_judge_2()//霍尔检测停车模块  磁铁
{
	//读取上一次状态
	  stop_last_status = stop_status;
	
   //读取当前按键状态
    stop_status = STOP_PIN;
	  if(!stop_status && stop_last_status && stop_count_2 == 0 && chuku_on == 0)    
	 {
		 stop_flag_on_2 = 1;
		 set_speed = -100;
		 stop_flag_2 = 1;		 	 
	 }
 	 if (stop_flag_2 == 1)
		{		
			stop_count_2 = 1;			
			stop_flag_2 = 0;
		}	
		
}

 以上为元素判断的相关代码,内容属实比较多,这点也确实没办法。因为智能车需要走的轨迹和现实生活中的汽车的轨迹是一样的,都是存在很多元素的。还请各位感兴趣的同学能够耐下心来,慢慢品味。

如果您有任何疑问,请在评论区提出问题,看到即会回复,谢谢!!

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单车漫游中国

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值