今天给大家分享一个智能车竞赛的元素方案,我们组队员都是第一次参赛,略微有些经验不足最后只拿了省二的成绩,但是还是有些不错的方案可以分享下。
下面贴一张17届的线上赛道图片
以摄像头车顺时针方向跑为例,元素顺序依次为斑马线 > 十字路口 > 左环 > 三叉 最后斑马线车辆跑完一圈,当我们吧所有元素的识别都完成之后会发现,有时候会在十字路口误判三叉,当车辆速度较快,姿态不是很稳定时,非常容易在十字掉头;
以我们之前的方案将所有元素都放在路径判断的程序中识别,识别到相应元素,这种方案很明显简单,容易实现,但出错率也高;因此我们便采用的锁元素,即给每个元素都加一个标号,程序每次路径判断只判断一种元素,元素完成之后将判断改成下一个元素的标号;
简单理解就是:小车从车库出发,此时元素只判断十字路口,跑完两个十字之后开启左环的判断关闭十字的判断(每次只判断一种元素),依次左环出环之后开启三叉的判断,第二次出三叉之后开启斑马线的判断;
这种方案的优势就是相对比较稳定,元素的识别比较准确,当然前提肯定要元素本身识别准确,而锁元素的目的时节省资源和元素识别之间不冲突。
//元素锁
void Lock_road()
{
if(road_lock==0)
{
if(element==5&&element_data==0)
{
road_lock=1;
}
}
else if(road_lock==1)
{
if(element==6&&element_data==0&&(fork_time_flag_1==2||fork_time_flag_1==0))
{
road_lock=2;
}
}
else if(road_lock==2)
{
if(element==8&&element_data==0)
{
road_lock=0;
}
}
}
/*
* 道路元素判断
* 0 直道
* 1 左弯道
* 2 右弯道
* 4 右环
* 5 左环
* 6 三岔口
* 7 十字
* 8 斑马线
* 9 坡道
*/
void Road_judgment()
{
static uint8_t zebra_flag_1 = 0;
//出赛道检测
if(Out_Threshold<=80)
{
mode = 0;
mode_flag=1;
}
Lock_road();//根据赛道解锁元素
Star();//起步固定角度-只执行一次 尾车在斑马线前发车使用
if(element_data==0)//特殊元素时不进行道路判断
{
if(Dynamic_value>=20||(loss_left_line>=5||loss_right_line>=5||loss_all_line>=5))//利用前瞻和ADC的值对弯道进行判断
{
if(loss_left_line>=5||loss_right_line>=5)
{
//对动态前瞻点进行判断
if((loss_left_line>15&&loss_right_line<=5))
{
element = 1;//左弯
}
else if((loss_left_line<5&&loss_right_line>=15))
{
element = 2;//右弯
}
else
{
element = 3;
}
}
}
else element = 0; // 直道
}
//十字判断
if((element_data==0||element==7))
{
if(Cross())
{
element = 7;
element_data=1;
}
else element_data=0;
}
//斑马线检测
if((element_data==0||element==8)
&&road_lock==2&&(Encoder_stop==1||fork_time_flag_1==2)//第二圈不开启斑马线检测,防止误判
)
{
if(Zebra())
{
zebra_flag=1;
element = 8;
element_data=1;
}
else
{
if(zebra_flag==1)
{
zebra_flag_1++;
zebra_flag=0;
}
element_data=0;
}
}
//三岔口判断
if((element_data==0||element==6)
&&road_lock==1
)
{
if(Fork_lookup(90,20,left_l,right_l,midline))
{
element = 6;
element_data=1;
}
else element_data=0;
}
//圆环判断
// if((element_data==0||element==4)&&road_lock==0)
// {
// if(Ring_lookup_right(60,40,left_l,right_l,midline))//判断是否是右圆环
// {
// element = 4;
// element_data=1;
// }
// else element_data=0;
// }
if((element_data==0||element==5)
&&road_lock==0
)
{
if(Ring_lookup_left(60,40,left_l,right_l,midline)) //判断是否是左圆环
{
element = 5;
element_data=1;
}
else element_data=0;
}
Beep_set(element,1);
}
本次内容主要是提供一种方案,不包括具体元素内容,有需要的伙伴可以私聊交流
智能车多车组
后面有时间会发布下元素识别和电机舵机控制,可以留言交流