智能车入门补充篇——元素识别

基础的赛道元素有:车库、十字、环岛、坡道。

目录

车库

十字

环岛

坡道

1.激光测距

2.电感值变化

3.角速度突增

系列文章目录

速通版

全程引导篇

详细讲解篇



车库

void Back_Into_Garage_find(void)
{
	if(P26==0 )  {BackGarage.magnetCount++;}
	if(BackGarage.magnetCount>3)
	{	
		if(BackGarage.amount==2)
		{
			BackGarage.FindFlag='T';
			BeepTick(4, 100);
			BackGarage.magnetCount=0;	
			BackGarage.amount=3;
			BackGarage.state = BackGarageForward;			
			BackGarage.runDis = Wheel.Distance;
			ICMIntegrate.TurnAngle_I=0;		
			ICMIntegrate.Yaw_I_Enable = 'T';
		}
		if(P26==1 )/*·ÀÖ¹Öظ´ÅÐ*/
		{
			if(BackGarage.amount==0)
			{
				BackGarage.amount=1;
				BackGarage.state = GarageOuting;
				BeepTick(1, 100);
			}	
			if(BackGarage.amount==1&&Forktimes==2)
			{
				BackGarage.amount=2;
				BackGarage.state = GarageOuting;
				BeepTick(1, 100);
			}	
			BackGarage.magnetCount=0;	
		}

	}
}

十字

对于电磁组,在备赛前期可以不考虑十字路口的识别。

环岛

1.中间是四根线的汇合,这一点电感值比直道大。

2.抽象地与普通直道相比,在赛道地一侧加了弯曲地铜线。

3.环岛中就是正常的弯道。

//=======================================环岛================================================//
void Island_Judge(void)
{
	if(if_go_Island == 'T')
	{
	//Found_Judge
	if(Island.FindFlag == 'F' && Island.state == IslandOut) {
		if(LNor[5] >= 135&&ELC_Sum_1234>=320&&LNor[6] >= 100
			&&((LNor[0] >= 110&&LNor[3] >= 36&&LNor[2] >= 53)\
		  ||(LNor[3] >= 110&&LNor[0] >= 38&&LNor[1] >= 52))
		  ){
			Island.state = IslandFound;
			Island.Dir = IslandDir[0]; 
			Island.FoundDis=Wheel.Distance;	
//			BeepTick(2, 100);
		}
	}
	//Center_Judge
	if(Island.state == IslandFound) {
		if(Island.FoundDis + 0.6f <= Wheel.Distance) Island.state = IslandOut;
    if(LNor[5] > Island.max5)	Island.max5 = LNor[5];
		if(LNor[6] > Island.max6)	Island.max6 = LNor[6];
		if(Island.Dir == 'L') {
		if((LNor[5] >135)){
				Island.FindFlag = 'T';
				Island.state = IslandInCenter;
			  }
		  }
	 else if(Island.Dir == 'R') {
	  if(LNor[5] >135){
				Island.FindFlag = 'T';
				Island.state = IslandInCenter;
			}
		}
	}
	//InTurn_Judge
	if(Island.state == IslandInCenter) {
	 if(LNor[5] > Island.max5)	Island.max5 = LNor[5];
		if(LNor[6] > Island.max6)	Island.max6 = LNor[6];
		if(Island.Dir == 'L') {
//			if(LNor[6] >160&&(LNor[6] <= Island.max6 - IslandInLength[Island.NowNum] ||LNor[5]<175)&&Island.max6>=180.0f){
			if(LNor[6] >130 &&((LNor[6] -LNor[5])>IslandInLength[1])&&Island.max6>=180.0f){
			Island.state = IslandInTurn;
			Island.OnDis=Wheel.Distance;
			ICMIntegrate.Yaw_I_Enable = 'T';
			}
		}
		else if('R' == Island.Dir ) {
//			if(LNor[6] >160&&(LNor[6] <= Island.max6 - IslandInLength[Island.NowNum] ||LNor[5]<180)&&Island.max6>=180.0f){
			if(LNor[6] >150&&((LNor[6] -LNor[5])>IslandInLength[0])&&Island.max6>=160.0f){
			Island.state = IslandInTurn;
			Island.OnDis=Wheel.Distance;
			ICMIntegrate.Yaw_I_Enable = 'T';
			}

		}
	}	
	//In_Judge
	if(Island.state == IslandInTurn) {
		if(Island.Dir == 'L'){
			if(myabs(ICMIntegrate.TurnAngle_I) > 30.0f){
			Island.state = IslandIn;

			}
	   }
		else if(Island.Dir == 'R'){
			if(myabs(ICMIntegrate.TurnAngle_I) > 30.0f){
				Island.state = IslandIn;
		  }
			}
		}
	//OutTurn_Judge&&Wheel.Distance >=Island.OnDis+1.8f
	if(Island.state == IslandIn) {
		if(Island.Dir == 'L'){
		 if(myabs(ICMIntegrate.TurnAngle_I ) > 240.0f){
				Island.state = IslandOutTurn;
		 }
	  }
		else if(Island.Dir == 'R'){
			if(myabs(ICMIntegrate.TurnAngle_I) >IslandAngle1){
				Island.state = IslandOutTurn;
			}
		}	
	}
	//OutCenter_Judge
	if(Island.state == IslandOutTurn) {
		if(Island.Dir == 'L'){
			if(myabs(ICMIntegrate.TurnAngle_I )> 320.0f){
				Island.state = IslandOutCenter;
				Island.MiddleDis=Wheel.Distance;
//				BeepTick(2, 100);
			}
		}
		else if(Island.Dir == 'R'){
			if(myabs(ICMIntegrate.TurnAngle_I)>IslandAngle2){
				Island.state = IslandOutCenter;
				Island.MiddleDis=Wheel.Distance;
//				BeepTick(2, 100);
			}
		}
	}
		if(Island.state == IslandOutCenter&& Wheel.Distance >=Island.MiddleDis+0.3f) {			
			Island.state = IslandOutEnd;	
      Island.EndDis=Wheel.Distance;			
		}
	//Out_Judge
	if(Island.state == IslandOutEnd) {
		if((LNor[5] < 120 && LNor[6] < 120 && Wheel.Distance >=Island.EndDis+1.0f)) {
			Island.FindFlag = 'F';
			ICMIntegrate.Yaw_I_Enable = 'F';
			ICMIntegrate.TurnAngle_I= 0.0f;
		  Island.InDis=0;
		  Island.OnDis=0;
			Island.MiddleDis=0;
			Island.EndDis=0;
		  Island.max5 = 100;
	    Island.max6 = 100;		
			Island.state = IslandOut;
		  Islandtimes++;
			if(Island.NowNum==1){Island.NowNum=0;}
		  }
	  }
	}
}

坡道

坡道我们当时想到了三个识别方案

1.激光测距

由于坡道比周围赛道以及路肩高,因此可以根据这个特性,在车模的特定高度上放激光测距,可以水平放也可斜着放。

水平放:例如当激光测距的值小于30cm时,说明即将到达坡道元素。否则说明其他障碍物离着很远

斜着放:临近坡道时,激光测距的值减少。

2.电感值变化

漆包线会铺设在坡道上。

因此相对于平地直路,电感值会突增。

3.角速度突增

在小车冲向坡道的时候,车头会抬起,此时会有向上的角速度、俯仰角会增加。

而在平路的时候,俯仰角基本不变。


//=======================================坡道================================================//          &&(LNow[5]>700&&LNow[6]>900) &&(min_ab(LNow[0],LNow[3])>500&&min_ab(LNow[4],LNow[7])>=950
void Ramp_Judge(void)
{    
//    if(if_go_Ramp == 'T')
//    {
        if(Ramp.FindFlag == 'F'&&Ramp.state == Ramp_begin)
        {Ramp_find();}

        if( (Ramp.state == Ramp_angle)||(Ramp.state == Ramp_tof)  ) 
        {Ramp_deal_middle();}
        
        if(Ramp.state == Ramp_end)
        {Ramp_deal_end();}
//    }
}

void Ramp_find(void)
{
        if( (length_val<=100)&&(length_val>=10))
        {
             Ramp.FindFlag = 'T';             
             Ramp.state =     Ramp_tof;
             Ramp.InDis = Wheel.Distance;
             BeepTick(1, 100);
        }
        if(treat_gyro_y>=110)    
        {
             Ramp.FindFlag = 'T';             
             Ramp.state =     Ramp_angle;
             Ramp.InDis = Wheel.Distance;
             BeepTick(1, 100);        
        }        
}
void Ramp_deal_middle(void)
{
    if(Wheel.Distance-Ramp.InDis>=1.0f)
    {
        Ramp.state= Ramp_end;
    }
}

void Ramp_deal_end(void)
{
    Ramp.state = Ramp_begin;
    Ramp.FindFlag = 'F';
    Ramp.InDis=0;
        Fork.state = Fork_middle;    
}

系列文章目录

文章分为三个层次

速通版

是希望通过简化的步骤搭建出寻迹小车,进而了解整个智能车是如何实现的,快速上手,为后续参与智能车竞赛做基础。

如果只是为了完成学校智能车初期培训,做出能简单循迹的小车,可以看这个速通版。

全程引导篇

是讲了做出能够完赛的智能车的整个过程,大部分文章只是简单点拨一下,但是附上了相关的文章链接,方便根据自己的情况深入了解。

全程引导篇,能够带你比较系统地了解整个智能车的制作过程,推荐备赛初期或者有车模之后学习。

详细讲解篇

是全程引导篇的补充,由于全程引导篇是引导性质,文章内容只是点拨,缺乏相应的原理或代码讲解,因此写详细讲解篇作为补充。

详细讲解篇会渗透在全程引导篇中。


速通版

智能小车速通版——手把手教程

全程引导篇

智能小车速通版——教程引导(原版)

智能小车速通版——教程引导

智能车入门——IDE安装以及库函数选用

智能车入门——编程语言(c)的学习

智能车入门——简单驱动常用模块

智能车入门——车模器件篇

智能车入门——模块化编程

智能车入门——跑车前的零碎知识

智能车入门——电磁循迹原理与实现

智能车入门——实现低速完赛

详细讲解篇

智能车入门补充篇

智能车入门补充篇——逐飞开源库介绍

智能车入门补充篇——常见宏定义和使用

智能车入门补充篇——模块化编程

智能车入门补充篇——电感值处理、转向控制与巡线

智能车入门补充篇——元素识别

智能车模块详解——按键及按键调参

智能车模块详解——数据存储与读写(eeprom/flash)

智能车入门——I/O、PWM

智能车入门——中断

智能车入门——编码器

智能车入门——陀螺仪

智能车入门——摄像头和CCD

智能车入门——舵机

(更新中)

  • 2
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_lucky_R

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

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

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

打赏作者

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

抵扣说明:

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

余额充值