基础的赛道元素有:车库、十字、环岛、坡道。
目录
车库
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;
}
系列文章目录
文章分为三个层次
速通版
是希望通过简化的步骤搭建出寻迹小车,进而了解整个智能车是如何实现的,快速上手,为后续参与智能车竞赛做基础。
如果只是为了完成学校智能车初期培训,做出能简单循迹的小车,可以看这个速通版。
全程引导篇
是讲了做出能够完赛的智能车的整个过程,大部分文章只是简单点拨一下,但是附上了相关的文章链接,方便根据自己的情况深入了解。
全程引导篇,能够带你比较系统地了解整个智能车的制作过程,推荐备赛初期或者有车模之后学习。
详细讲解篇
是全程引导篇的补充,由于全程引导篇是引导性质,文章内容只是点拨,缺乏相应的原理或代码讲解,因此写详细讲解篇作为补充。
详细讲解篇会渗透在全程引导篇中。
速通版
全程引导篇
详细讲解篇
智能车模块详解——数据存储与读写(eeprom/flash)
(更新中)