系列链接:
- 十三届智能汽车竞赛 信标对抗组 思路参考 程序参考(一)模块初始化
- 十三届智能汽车竞赛 信标对抗组 思路参考 程序参考(二)图像处理
- 十三届智能汽车竞赛 信标对抗组 思路参考 程序参考(三)寻灯策略Part.①
- 十三届智能汽车竞赛 信标对抗组 思路参考 程序参考(四)寻灯策略Part.②
- 十三届智能汽车竞赛 信标对抗组 思路参考 程序参考(五)分段控速
- 十三届智能汽车竞赛 信标对抗组 思路参考 程序参考(六)避障
正文开始:
调车过程中,同学们一定会发现一个问题,就是有时候小车与点亮的信标灯之间隔着一个或多个未点亮的信标灯,小车前往灭灯的途中势必会撞到这些未点亮的信标灯,影响成绩不说,如果车速比较快会撞毁信标灯,甚至撞毁小车,这一问题不得不处理。
我们的方案是在车头处并排安装三个不同朝向的E18-D80NK红外光电管,E18-D80NK红外光电管会发射红外光并检测红外光碰到物体而反射回来的时间,以时间长短来判断物体距离。E18-D80NK待机时返回信号为高电平,在检测到一定距离内存在物体的时候返回低电平,这个检测物体距离可以由E18-D80NK红外光电管管体上的机械旋钮调节。位于正中央的光电管朝向车头正前方,左右两个光电管则向两外侧稍微偏转。以此来达到检测障碍物的目的。
有了这三个返回信号就可以通过条件逻辑判断来实现小车拐弯避障了。然而预想与现实有差距,实际使用的时候,我们发现这款红外光电管的检测效果会受到信标灯发出的红外光影响,距离信标灯越近影响就越大。
- 为了解决这个问题,我们把小车-亮起信标灯之间的距离(也就是画面中信标灯的纵坐标)也作为判断条件之一,将红外光电管的返回信号跟距离进行挂钩,共同决策小车是否避障。
void zhangai_PWM(char DENGWEI) /避障打角//
{
if((PTE6_INT==1)||(y_MID>=32)) ///中无///
{
zhongPWM=0;
}
else zhongPWM=DENGWEI*100; ///中有
if((PTE8_INT==1)||(y_MID>=32)) ///左无///
{
youPWM=0;
zuozhangai=0;
}
else ///左有
{
zuozhangai=1;
if(zhongPWM!=0)
{
youPWM=170-zhongPWM;
zuozhong=1;
}
else
{
youPWM=40;
zuozhong=0;
}
}
if((PTE7_INT==1)||(y_MID>=32)) ///右无///
{
zuoPWM=0;
}
else ///右有
{
if(zhongPWM!=0) zuoPWM=-170-zhongPWM;
else zuoPWM=-40;
if(zuozhong==1) zuoPWM=DENGWEI*500;
}
}
- 进行避障决策之后,并没有直接让小车打固定角度实现避障。我们一定程度上综合考虑了当前亮起信标灯的位置和障碍位置得出最终小车避障时的舵机打角。具体来讲就是:通过三个光电管信号条件判断之后得到一个固定的舵机打角,将此打角与小车正常寻灯计算出的打角相加,结果就是最终小车避障时的舵机打角。
void duoji_PWM()
{
if(x_MID>0) //看见有灯
{
jieshouwu=0;
SHANSHUO=0;
PWM_P=y_MID/4-4;
suduyiY=27.385-Speed_test*6/65;
suduyiX=6.615-Speed_test*6.5/65;
if((x_MID<40)&&(panK==0))
{
panK=1;
k=1;
}
else if((x_MID>=40)&&(panK==0))
{
panK=1;
k=-1;
}
if(y_MID<38) NewPWMValue=(int)((x_MID-40)*2);
else if(y_MID<57) NewPWMValue=(int)((x_MID-((-0.12)*pow((y_MID-suduyiY),2)*k + 1.814*(y_MID-suduyiY)*k + 40-suduyiX*k))*PWM_P);
else NewPWMValue=k*99;
if((NewPWMValue>0)&&(PTE12_INT==1)) NewPWMValue=-80;
if((NewPWMValue<0)&&(PTE11_INT==1)) NewPWMValue=80;
zhangai_PWM(k);
nicePWM=NewPWMValue+youPWM+zuoPWM+zhongPWM; //将红外条件判断的固定打角与小车正常寻灯计算出的打角相加,得出最终打角
}
else //无灯//
{
SHANSHUO++;
if(SHANSHUO>4)
{
zhangai_PWM(k);
panK=0;
if(((PTE10_INT==0)||(PTE11_INT==0)||(PTE12_INT==0))&&(jieshouwu==0)) ///看不见但是红外有接收/
{
jieshouwu=1;
if((PTE9_INT==0)||(PTE12_INT==0)) k=-1;
if((PTE10_INT==0)||(PTE11_INT==0)) k=1;
}
if(SHANSHUO<7) nicePWM=youPWM+zuoPWM+zhongPWM+k*99; //将红外条件判断的固定打角与小车正常寻灯计算出的打角相加,得出最终打角
else nicePWM=youPWM+zuoPWM+zhongPWM+(k*(Speed_test<<2)); //绕障碍 速度大打角大
}
}
if(nicePWM>99) nicePWM=99; //打角限幅
else if(nicePWM<-99) nicePWM=-99;
}
这次的分享就是“十三届智能汽车竞赛 信标对抗组 思路参考 程序参考”系列的最后一篇了,这里面包含了我们队几个月的备赛时间摸爬滚打完成比赛的经验汗水,希望我的分享能给做智能车的各位同学提供一些思路。毫无疑问,我们的方案不是最好的,欢迎大家评论讨论补充。如果发现问题也请指出,我会虚心学习。