智能车PID循迹与电磁循迹的切换

最近在参加18届智能车竞赛时调试遇到如何准确识别断路以及在断路和基于PID算法的摄像头循迹之间的切换之间遇到了些许问题,总是会出现识别错误,误识别的问题,这里记载以下我的处理,以便与我之后的问题参考。

问题描述

智能小车循迹时在断路区会丢失赛道,而断路又分为直断路与弯道断路:

这里是直道断路,由于上位机还有部分问题,导致传输上来的中线有些错乱,

直断路的判断非常简单,我这里是直接用一个截止行判断

如图红线部分便是我的截止行,此行的标准是:当分析图像时到截止行时,随着小车的前进,截止行会越来越高(屏幕左上角为(0,0)),当截止行超过某一阈值时,表示摄像头丢失严重,此时通过TFT激光测距检测前方是否有障碍物,如果有就进入避障处理,若没有则逐渐转换为电感循迹,当然,这里使用比例值算法是最优解,即小车循迹采用摄像头+电感利用比例算法循迹。 

 先看断路处理:

/*断路图像处理*/
void DuLuID()
{
    int wetyq=0;
    int gt=1;
    while(1)
    {
    Get_image(mt9v03x_image);
    turn_to_bin();
    /*提取赛道边界*/
    image_draw_rectan(original_image);
    /*将采集的图像绘画在屏幕上*/
   tft180_displayimage03x((const uint8 *)original_image, 158, 126);
   tft180_show_int(5,70,stachange,2);
   tft180_draw_line(30,30,100,30,RGB565_WHITE);
   judgment();
   if(wetyq<3)
   {
       wetyq++;
       motor_go(4);
   }
   else{
       wetyq=0;
       motor_go(8);
   }
       for(int qwb=5;qwb<130;qwb++)
       {
       if(original_image[100][qwb]==255)
       {
          gt++;
       }
           if(gt>10)
           {
              stachange=0;
              return;//强制退出
           }
       tft180_show_int(5,35,gt,2);
       }
   gt=0;
  }
}

当我们进入断路时,用while循环卡住程序,这样可以最大程度上提高断路循迹的运行速率,避免不必要的程序(TFT激光测距识别障碍物等)干扰运行速率,在循环中不断检测摄像头采集的图像,如果原始图像中的某几行出现的白色像素大于一定阈值,则判断为识别到赛道,此时可以退出循环返回摄像头寻迹。

#define USE_num 300 //定义找点的数组成员个数按理说300个点能放下,但是有些特殊情况确实难顶,多定义了一点

uint8 original_image[image_h][image_w];// 原始图像存放数组
 //存放点的x,y坐标
uint8 points_l[(uint16)USE_num][2] = { {  0 } };   //左边界
uint8 points_r[(uint16)USE_num][2] = { {  0 } };   //右边界
uint8 center_line[image_h];                        //中线数组
int ye=0;                                          //用于绘画上边线,避免重复绘画

/***** 避免赛道出界,画上边线  ******/

   if(ye==0&&y<110)                                //边界只会出现在屏幕上半部分,避免误差
    {
       if(original_image[y-1][center_line[y]]==0&&original_image[y-2][center_line[y]]==0&&original_image[y-3][center_line[y]]==0)
        {
            points_t=y;                            //顶点Y坐标存下来
            ye=1;
            if(points_t<120&&points_t>80&&points_l[y+2][0]<80&&points_r[y+2][0]>80)
            {
                stachange=1;
                DuLuID();

            }

        }
    }
   if(y<points_t)                                  //超过上边线部分的左右边线归零
   {
       points_l[y][0]=0;
       points_r[y][0]=0;
   }
    }

由于我采用的是迭代循线的方法,所以这里判断上顶线的逻辑是当中线数组识别到的当前中线点往上三行(可以连续也可以不连续)像素值皆为零,就判断该行为截止行,以上部分判断为赛道丢失,若截止行处于80到120行之间(图像下端部分),切换为电感循迹。

即然电磁循迹已经完成了,那么应该怎么结束循迹呢,首先,在电磁循迹的过程中,我们使用的while循环将程序卡住,但在此循环当中摄像头的图像捕捉和识别任然在进行,这就意味着如果摄像头再次捕捉到赛道,则结束电磁循迹,进入摄像头循迹。为了使判断更加准确,根据情况可以加上陀螺仪模块,当达到一定角度之后捕捉赛道情况。

以上就实现了智能车简单的电磁循迹。

VID


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值