智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 7194|回复: 29
打印 上一主题 下一主题

第十届飞思卡尔光电直立车(ccd检测)的直角算法,麻烦大家给点意见!

[复制链接]

3

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
257
威望
145
贡献
68
兑换币
84
注册时间
2015-5-15
在线时间
22 小时
毕业学校
湖南师范大学
跳转到指定楼层
1#
发表于 2015-6-14 10:56:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本次飞思卡尔比赛的赛道元素中加入了直角,在直角转弯的前100cm处有一条10cm宽的黑线(如图所示)。我们组写的直角程序便是根据图中的黑线来写的,我们的ccd检测的是一条直线,当检测到前方全黑的时候(前提,作为if语句的条件),我们就准备检测直角处的掉线:
1,左端掉线(左端从黑变成白),右端一直是黑,则说明是左转弯的直角,一旦检测到这个左转弯的直角,就立刻控制赛车往左边90度转弯。
2,右端掉线(右端从黑变成白),左端一直是黑,则说明是右转弯的直角,一旦检测到这个右转弯的直角,就立刻控制赛车往右边90度转弯。
也就是说我们这个算法中用到了离直角100cm处的10cm全黑这个前提,因为不用这个前提的话,稍微急一点的s型弯道也会被当成直角处理。而且既然比赛要求中给出了离直角100cm处的10cm全黑,一定是可以派上用场的。
可是问题是:加上这个直角程序之后,就算是直道,赛车也会左右抖动!
不知道大家对于直角算法有没有其他想法,还望指教一下。



回复

使用道具 举报

24

主题

668

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6935
QQ
威望
3395
贡献
2136
兑换币
2241
注册时间
2014-5-12
在线时间
702 小时
推荐
发表于 2015-6-19 11:38:39 | 只看该作者
万一来一个弯入10cm黑色带估计就够呛了
回复 支持 2 反对 0

使用道具 举报

25

主题

211

帖子

1

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3041
威望
1103
贡献
1584
兑换币
661
注册时间
2015-2-20
在线时间
177 小时
推荐
发表于 2015-6-28 12:14:02 | 只看该作者
慕参8058 发表于 2015-6-20 16:19
好吧,可是我感觉没必要这样设置啊!!!

因为要比赛的时候要正反跑啊。。。。
回复 支持 1 反对 0

使用道具 举报

25

主题

211

帖子

1

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3041
威望
1103
贡献
1584
兑换币
661
注册时间
2015-2-20
在线时间
177 小时
推荐
发表于 2015-6-20 08:49:39 | 只看该作者
慕参8058 发表于 2015-6-19 14:05
比赛的时候一定是一个直角配对一个全黑标识线,不会一个直角前后都有黑色标识线的。规则中有没有指明赛车 ...

你理解错了吧  是直角前后各一个黑带的
回复 支持 1 反对 0

使用道具 举报

4

主题

29

帖子

0

精华

高级会员

Rank: 4

积分
803
威望
433
贡献
230
兑换币
270
注册时间
2014-8-7
在线时间
70 小时
推荐
发表于 2015-6-20 10:12:10 | 只看该作者
长安 发表于 2015-6-19 10:32
。。。。不是有两条黑线吗。。。为什么你不是检测到第二条黑线之后再清除直角标志位  或者就是转过直角弯之 ...

对于两个直角相隔较近,中间只有一条黑线,拿下一个角就挂了哦
回复 支持 1 反对 0

使用道具 举报

1

主题

103

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3237
威望
1557
贡献
994
兑换币
1043
注册时间
2013-9-8
在线时间
343 小时
推荐
发表于 2015-6-19 14:59:53 | 只看该作者
慕参8058 发表于 2015-6-19 09:03
对的,事实证明这个程序有问题,没有清除标志位,导致很多误判。
后来改了,用时钟和延时来控制过直角, ...

貌似你的直角明显是和弯道丢线冲突了 才会误判。
回复 支持 1 反对 0

使用道具 举报

8

主题

54

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1161
威望
676
贡献
311
兑换币
302
注册时间
2014-7-27
在线时间
87 小时
毕业学校
哈工程
推荐
发表于 2015-6-19 11:18:38 | 只看该作者
你们遇到黑线标志时,中线是怎么处理的
回复 支持 1 反对 0

使用道具 举报

25

主题

211

帖子

1

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3041
威望
1103
贡献
1584
兑换币
661
注册时间
2015-2-20
在线时间
177 小时
推荐
发表于 2015-6-19 10:32:39 | 只看该作者
。。。。不是有两条黑线吗。。。为什么你不是检测到第二条黑线之后再清除直角标志位  或者就是转过直角弯之后就清除直角标志位!
回复 支持 1 反对 0

使用道具 举报

27

主题

1517

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
11255

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章资源大师奖章

威望
4350
贡献
2795
兑换币
2704
注册时间
2013-10-16
在线时间
2055 小时
毕业学校
并没有毕业
推荐
发表于 2015-6-18 20:43:34 | 只看该作者
这是一百个标志位的节奏
回复 支持 1 反对 0

使用道具 举报

14

主题

133

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1227
威望
621
贡献
340
兑换币
393
注册时间
2014-11-16
在线时间
133 小时
毕业学校
江苏大学
推荐
发表于 2015-6-18 20:39:28 | 只看该作者
本帖最后由 hi希特勒 于 2015-6-18 20:48 编辑

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

使用道具 举报

3

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
257
威望
145
贡献
68
兑换币
84
注册时间
2015-5-15
在线时间
22 小时
毕业学校
湖南师范大学
2#
 楼主| 发表于 2015-6-14 10:58:40 | 只看该作者
C:\Users\Administrator\Desktop\直角
回复 支持 反对

使用道具 举报

3

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
257
威望
145
贡献
68
兑换币
84
注册时间
2015-5-15
在线时间
22 小时
毕业学校
湖南师范大学
3#
 楼主| 发表于 2015-6-14 10:58:59 | 只看该作者
发不了图
回复 支持 反对

使用道具 举报

3

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
257
威望
145
贡献
68
兑换币
84
注册时间
2015-5-15
在线时间
22 小时
毕业学校
湖南师范大学
4#
 楼主| 发表于 2015-6-14 10:59:45 | 只看该作者
//直角算法部分 ----右边直角:
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);
        }  
    }      
}
回复 支持 反对

使用道具 举报

3

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
257
威望
145
贡献
68
兑换币
84
注册时间
2015-5-15
在线时间
22 小时
毕业学校
湖南师范大学
5#
 楼主| 发表于 2015-6-14 11:03:02 | 只看该作者
C:\Users\Administrator\Desktop
回复 支持 反对

使用道具 举报

3

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
257
威望
145
贡献
68
兑换币
84
注册时间
2015-5-15
在线时间
22 小时
毕业学校
湖南师范大学
6#
 楼主| 发表于 2015-6-14 11:05:36 | 只看该作者
赛道图如上!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

3

主题

22

帖子

2

精华

高级会员

Rank: 4

积分
614
威望
350
贡献
170
兑换币
247
注册时间
2014-4-26
在线时间
47 小时
7#
发表于 2015-6-18 19:08:21 | 只看该作者
赞一个
回复 支持 反对

使用道具 举报

3

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
257
威望
145
贡献
68
兑换币
84
注册时间
2015-5-15
在线时间
22 小时
毕业学校
湖南师范大学
10#
 楼主| 发表于 2015-6-19 09:03:30 | 只看该作者
hi希特勒 发表于 2015-6-18 20:39
我想问一下楼主 既然已经判定为全黑 设定了黑线的标志位 那是如何清空标志位呢 还有 这样识别黑线 误判会很 ...

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

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-8 19:45 , Processed in 0.171256 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表