智能车制作

标题: 第十届飞思卡尔光电直立车(ccd检测)的直角算法,麻烦大家给点意见! [打印本页]

作者: 慕参8058    时间: 2015-6-14 10:56
标题: 第十届飞思卡尔光电直立车(ccd检测)的直角算法,麻烦大家给点意见!
本次飞思卡尔比赛的赛道元素中加入了直角,在直角转弯的前100cm处有一条10cm宽的黑线(如图所示)。我们组写的直角程序便是根据图中的黑线来写的,我们的ccd检测的是一条直线,当检测到前方全黑的时候(前提,作为if语句的条件),我们就准备检测直角处的掉线:
1,左端掉线(左端从黑变成白),右端一直是黑,则说明是左转弯的直角,一旦检测到这个左转弯的直角,就立刻控制赛车往左边90度转弯。
2,右端掉线(右端从黑变成白),左端一直是黑,则说明是右转弯的直角,一旦检测到这个右转弯的直角,就立刻控制赛车往右边90度转弯。
也就是说我们这个算法中用到了离直角100cm处的10cm全黑这个前提,因为不用这个前提的话,稍微急一点的s型弯道也会被当成直角处理。而且既然比赛要求中给出了离直角100cm处的10cm全黑,一定是可以派上用场的。
可是问题是:加上这个直角程序之后,就算是直道,赛车也会左右抖动!
不知道大家对于直角算法有没有其他想法,还望指教一下。




作者: 慕参8058    时间: 2015-6-14 10:58
C:\Users\Administrator\Desktop\直角
作者: 慕参8058    时间: 2015-6-14 10:58
发不了图
作者: 慕参8058    时间: 2015-6-14 10:59
//直角算法部分 ----右边直角:
for(i=64;i-3>0;i--)//判前方全黑(瞬间整个128个像素点全变黑,从中间,因为通常,中间都是为白的,只有前面是一条黑线的时候才会为黑)
  {
    if((imang[i]==50|imang[i+1]==50|imang[i+2]==50|imang[i+3]==50)&&(imang[i-1]==50&imang[i-2]==50&imang[i-3]==50)&&
        (imang[i+50]==50|imang[i+51]==50|imang[i+52]==50|imang[i+53]==50)&&(imang[i-50]==50&imang[i-51]==50&imang[i-52]==50))
        {g_nLeftPosition=i-1;black0=0;break;}// g_nLeftPosition和g_nRightPosition一起来计算g_fMidPosition
      else black0=1;
  }
if(black0==0)//全黑
  {   
   
            for(i=64;i-3>0;i--)//从中间向左边寻黑线
              {
               if((imang[i]==200|imang[i+1]==200|imang[i+2]==200|imang[i+3]==200)&&(imang[i-1]==50&imang[i-2]==50&imang[i-3]==50))
                { g_nLeftPosition=i-1;flag4=0;break;}
                else flag4=1;
              }
               
            if(flag4==0)//左有
                {
                  for(i=64;i+3<127;i++)//从中间向右边寻黑线
                     {
                      if((imang[i]==50&imang[i+1]==50&imang[i+2]==50&imang[i+3]==50)&&(imang[i-1]==200|imang[i-2]==200|imang[i-3]==200))
                      {g_nRightPosition=i;flag5=0;break;}
                      else flag5=1;
                     }
                  if(flag5==0) //左有右有
                    {
                      g_fMidPosition=(g_nRightPosition-g_nLeftPosition)/2+g_nLeftPosition;
                    }
                  if(flag5==1) //左有右无
                    {
                      g_fMidPosition=(127+g_nLeftPosition);
                    }  
                }      
  }


//直角算法部分 ----左边直角:
for(i=64;i-3>0;i--)//判前方全黑
{
      if
        ((imang[i]==50|imang[i+1]==50|imang[i+2]==50|imang[i+3]==50)&&(imang[i-1]==50&imang[i-2]==50&imang[i-3]==50)&&
          (imang[i+50]==50|imang[i+51]==50|imang[i+52]==50|imang[i+53]==50)&&(imang[i-50]==50&imang[i-51]==50&imang[i-52]==50))  
        {g_nLeftPosition=i-1;black1=0;break;}// g_nLeftPosition和g_nRightPosition一起来计算g_fMidPosition
      else black1=1;
}

if(black1==0)//全黑
{
    for(i=64;i+3<127;i++)//从中间向右边寻黑线
    {
        if((imang[i]==50&imang[i+1]==50&imang[i+2]==50&imang[i+3]==50)&&(imang[i-1]==200|imang[i-2]==200|imang[i-3]==200))
          {g_nRightPosition=i;flag6=0;break;}
        else flag6=1;
    }
    if(flag6==0)//右有
    {
        for(i=64;i-3>0;i--)//从中间向左边寻黑线
        {
          if((imang[i]==200|imang[i+1]==200|imang[i+2]==200|imang[i+3]==200)&&(imang[i-1]==50&imang[i-2]==50&imang[i-3]==50))
            {  g_nLeftPosition=i-1;flag7=0;break;}
          else flag7=1;
        }
    if(flag7==0) //左有右有
        {
        g_fMidPosition=(g_nRightPosition-g_nLeftPosition)/2+g_nLeftPosition;
        }
    if(flag7==1) //左无右无
        {
        g_fMidPosition=(127+g_nLeftPosition);
        }  
    }      
}

作者: 慕参8058    时间: 2015-6-14 11:03
C:\Users\Administrator\Desktop
作者: 慕参8058    时间: 2015-6-14 11:05
赛道图如上!

作者: important    时间: 2015-6-18 19:08
赞一个
作者: hi希特勒    时间: 2015-6-18 20:39
本帖最后由 hi希特勒 于 2015-6-18 20:48 编辑

我想问一下楼主 既然已经判定为全黑 设定了黑线的标志位 那是如何清空标志位呢 还有 这样识别黑线 误判会很多吧(比如扫到背景布什么的)

作者: 1200    时间: 2015-6-18 20:43
这是一百个标志位的节奏
作者: 慕参8058    时间: 2015-6-19 09:03
hi希特勒 发表于 2015-6-18 20:39
我想问一下楼主 既然已经判定为全黑 设定了黑线的标志位 那是如何清空标志位呢 还有 这样识别黑线 误判会很 ...

对的,事实证明这个程序有问题,没有清除标志位,导致很多误判。
后来改了,用时钟和延时来控制过直角,一旦检测到全黑标志位,就准备检测直角,检测到直角就转弯。从检测到全黑标志位到检测到直角,再到转弯,中间用的时间不过2s,于是设置了一个延时为3s的延时,此延时从检测到全黑开始计时,3s延时时间到了(直角应该也过了,离下次直角的时间间隔一定会大于1s的,所以延时不会导致下次的误判),则清除标志位。
然后等待检测下次全黑标志位,检测到了(改变标志位为1)继续准备检测直角,(标志位为1是直角转弯的前提)检测到直角就转弯。再延时,时间一到就清楚标志位。
如此循环。。。。。。
由于我们中途换了一辆车,所以这个算法还没有用于新车的实践上,但是我们在旧车上试了一下,直角是可以过去的,但是当遇到弯道出来就是黑色标识线的情况还是过不了直角。因为过了弯道之后车身还没摆正,在这种情况下遇到黑色标识线检测的话,还没检测到就已经过了黑色标识线。
解决办法:减速!!!(其实如果速度很慢的话,就算是不为直角设置单独的算法也是能轻松过直角的,可是比的就是速度。。。。。。)


作者: 长安    时间: 2015-6-19 10:32
。。。。不是有两条黑线吗。。。为什么你不是检测到第二条黑线之后再清除直角标志位  或者就是转过直角弯之后就清除直角标志位!
作者: 天色尚早    时间: 2015-6-19 11:18
你们遇到黑线标志时,中线是怎么处理的
作者: 浅笑无痕    时间: 2015-6-19 11:38
万一来一个弯入10cm黑色带估计就够呛了
作者: 慕参8058    时间: 2015-6-19 14:05
长安 发表于 2015-6-19 10:32
。。。。不是有两条黑线吗。。。为什么你不是检测到第二条黑线之后再清除直角标志位  或者就是转过直角弯之 ...

比赛的时候一定是一个直角配对一个全黑标识线,不会一个直角前后都有黑色标识线的。规则中有没有指明赛车的方向,只是为了让大家看的清楚才给出前后两个标识线的。所以我们是转了之后就清除的(并没有检测到第二条黑线之后再清除直角标志位的,因为不会有第二条直角标志位)。




作者: 慕参8058    时间: 2015-6-19 14:08
慕参8058 发表于 2015-6-19 14:05
比赛的时候一定是一个直角配对一个全黑标识线,不会一个直角前后都有黑色标识线的。规则中有没有指明赛车 ...

以上直角和标识线一对一也只是个人的推测,我觉得我们也应该为了直角和标识线一对二做一下测试。
如果是一对二就在转了直角之后,然后有检测到了第二条标识线之后再清除直角标志位。。。


作者: 慕参8058    时间: 2015-6-19 14:08
浅笑无痕 发表于 2015-6-19 11:38
万一来一个弯入10cm黑色带估计就够呛了

是的,


作者: 慕参8058    时间: 2015-6-19 14:23
天色尚早 发表于 2015-6-19 11:18
你们遇到黑线标志时,中线是怎么处理的

中线?不处理啊,就检测全黑,如果是全黑就把直角标志位置1,然后准备检测直角,检测到了直角就转弯啊,检测全黑没必要用到中线啊,

作者: 执子守候    时间: 2015-6-19 14:59
慕参8058 发表于 2015-6-19 09:03
对的,事实证明这个程序有问题,没有清除标志位,导致很多误判。
后来改了,用时钟和延时来控制过直角, ...

貌似你的直角明显是和弯道丢线冲突了 才会误判。

作者: hi希特勒    时间: 2015-6-19 17:53
慕参8058 发表于 2015-6-19 09:03
对的,事实证明这个程序有问题,没有清除标志位,导致很多误判。
后来改了,用时钟和延时来控制过直角, ...

敢问楼主你们延时是怎么做的

作者: 长安    时间: 2015-6-20 08:49
慕参8058 发表于 2015-6-19 14:05
比赛的时候一定是一个直角配对一个全黑标识线,不会一个直角前后都有黑色标识线的。规则中有没有指明赛车 ...

你理解错了吧  是直角前后各一个黑带的

作者: FXJ-26    时间: 2015-6-20 10:12
长安 发表于 2015-6-19 10:32
。。。。不是有两条黑线吗。。。为什么你不是检测到第二条黑线之后再清除直角标志位  或者就是转过直角弯之 ...

对于两个直角相隔较近,中间只有一条黑线,拿下一个角就挂了哦

作者: FXJ-26    时间: 2015-6-20 10:15
执子守候 发表于 2015-6-19 14:59
貌似你的直角明显是和弯道丢线冲突了 才会误判。

对的,弯道和直角很容易误判

作者: 慕参8058    时间: 2015-6-20 16:18
hi希特勒 发表于 2015-6-19 17:53
敢问楼主你们延时是怎么做的

根据程序的运行,设置标志位来延时。

作者: 慕参8058    时间: 2015-6-20 16:19
长安 发表于 2015-6-20 08:49
你理解错了吧  是直角前后各一个黑带的

好吧,可是我感觉没必要这样设置啊!!!

作者: csu心随风飞    时间: 2015-6-20 18:18
感觉好高端
作者: 执子守候    时间: 2015-6-21 16:05
FXJ-26 发表于 2015-6-20 10:15
对的,弯道和直角很容易误判

再好好看看吧  多设置标志位区分开就好了。

作者: 伤剑使者    时间: 2015-6-21 18:23
浅笑无痕 发表于 2015-6-19 11:38
万一来一个弯入10cm黑色带估计就够呛了

赛道搞了一个,打死过不去,摄像头

作者: 伤剑使者    时间: 2015-6-21 18:24
hi希特勒 发表于 2015-6-18 20:39
我想问一下楼主 既然已经判定为全黑 设定了黑线的标志位 那是如何清空标志位呢 还有 这样识别黑线 误判会很 ...

这个我想破了头也是没想到怎么解决的

作者: 长安    时间: 2015-6-28 12:14
慕参8058 发表于 2015-6-20 16:19
好吧,可是我感觉没必要这样设置啊!!!

因为要比赛的时候要正反跑啊。。。。

作者: 慕参8058    时间: 2015-6-30 02:22
长安 发表于 2015-6-28 12:14
因为要比赛的时候要正反跑啊。。。。

有道理!!!!!!!!!!!!!!!!!!!!!!!!!!!!





欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2