电感寻迹及元素判断
一、元素判断(重难点问题)
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;
}
}