本帖最后由 lemon~cmc 于 2012-7-28 13:44 编辑
自己的飞思卡尔也告一段落了,不再太去在意结果了,还是很享受这其中的过程。 一直在论坛潜水,也没有贡献些什么,一直在学习,也是忙于调车,所以很少发帖子。技术这东西就应该在大家一起探讨下,才能取得更快得进步。曾经很长一段时间都纠结在十字上的。也不大清楚大家是否有和我遇到同样的情况。这里发表一点自己的想法。希望对大家有一点启发,仅供参考,切入正题吧。 最让人纠心的情况:斜入十字 (说明)如果是时间充裕的话,可以考虑,通过比赛,才发现,其实曾经的担心是多余的,因为比赛的赛道基本进十字有一段直线,可以让车摆正的。当然如果想做到万无一失,精力又充足的情况下,就可以试着想想。 不废话了,看下情况吧。 (图1)斜入十字看到的情况 不做处理的时候,提取中心
(图2)中心提取 当然这也和大家的中心提取算法有关,我是通过寻找两边的黑线来计算中心。 显然在这里有一段中心是错误的,在没有处理的时候,我的车跑到这里,常当小S在跑了,直接跑左边了,进不了十字。 我想到的处理方式: 跳变+拐点 也就是跑道的边线应该是连续的。不应该出现跳变的情况,即使是一边丢线了,那么丢掉的边线出来的地方也应该是从左右极限的位置出来,而不是直接出现在中间或者其它的地方。出现跳变应该就在十字的地方了,当然寻找跳变大家要小心一点,左右边线要找对。其实在比赛的时候,干扰会更少一些,其实是更有利的。 (图3)左右边线提取 在记录下左右边线的位置时,再通过计算如果边线相邻位置相差大于20我就认定为跳变了,我是采了145列(正常情况下,相邻行边线位置差也就1到3左右)。当然为了抗干扰,当发现跳变时,从跳变位置向上跳几行取边线值,向下跳几行取边线值,相减如果依然满足条件,就认定为跳变了,否则认定为杂点干扰。
(图4)提取边线跳变 如果赛道不存在太大干扰的话,基本是可以找准确的,再寻找拐点。拐点依然是根据边线,边线的变化趋势。比如说某点之前的左边趋势是向左的,而该点之后的趋势是向右的,那么就认定为一拐点(我这里用了比较简单的方式,就是用差相乘的方法,比如说该点是左拐点,该点左线位置减上一行左边线位置得到正值(即趋势向右),该拐点后一行左边线位置减该点左线位置得到负值(趋势向左),相乘得到就是负值)。这里同样做一些抗干扰处理,和跳变的处理差不多。 (图5)提取边线拐点 在跳变和拐点都找到的情况下,就可以认为是十字了,这个时候就只需要把错误的中心给补出来就可以了,车子就能走对了。 (图6)提取后的中心 我们可以看到处理后的中心基本就是正确的了,这里偷了一点懒,其实可以补的更漂亮一些。但是只是为了看到效果,没有浪费算法时间了,直接将跳变行后的中心,直接补下来,一直补到拐点行。因为实际中,我们采集一幅图像,用到的数据只需要一两行而已,只要中心都是对的了,用一两行就可以了。 斜入十字到这里也就能正确进入了。如果想让车跑的更正一些,大家可以再把中心计算的更准确些。
更重要的:可能对大家更有意义的,以上的情况,其实是我们自己为难自己,比赛中基本是不会遇到这么斜入十字的。通常是有一小段直线。看下面更正常的情况.
这是车子进十字的时候还有一点点不正。其实这处理起来应该就比较容易了。有拐点,并且拐点以上存在两边丢线的情况。如果两边丢线行数达到一定数量,就认定为十字。那么就利用拐点以内的中心值来控制舵机,让车子摆正。 (注)一般情况下,存在两边都丢线只有十字的地方,不过是保证在正确赛道以内,不要在赛道以外了,还去做这样的处理。顺便提一下,我保证有效赛道的方法,是首先用三条纵向扫描线纵向扫来确定有效行,其实也就是动态前瞻的意思了。如下图:
最中间的是图像的中心,也理解成车子的中间值,左右两条线实际是左右轮的位置。因为没有对图像进行梯形校正,所以左右轮扫描线也以失真的方式扫上去,车子如果直跑的话,两轮走过的位置也就是这左右两对红线的位置了。这样可以保证车是一直在赛道内的。
(2)当不存在拐点的情况:
近端左右均丢线,连续丢线行大于某个值,认定为十字,取远端有效的数据。从中心向两边扫描,计算中心,取远端的中心值来控制舵机(具体想取那一行,就看你自己觉得哪 一行更可靠就取哪一行吧)。 其实只要在进十字之前将车子摆正了,那么基正十字就不会有太大问题了。这是本人的一些粗略的想法。仅供大家参考吧。希望大家都好好努力,取得更好的成绩。也快走入社会了,想起曾经日日夜夜奋斗的情景,还是会有莫大的感触的。
|