早期粗糙的赛道元素处理
说这个没有别的意思,就是觉得,遇到实际应用上的问题,虽然脑海里的知识技巧并不能让我们有多高明的手法去解决这个问题,但也要努力去尝试。
元素判断
这里的元素判断也是粗糙的,因为没有太多的尝试,所以有没有误判的现象也没看出来,只是在为数不多的测试中,并没有误判这回事的发生。
十字
从最底下这行向上扫线,当某一行及前面数行左右两边都丢线的情况下,看更前面某几行中间的一部分点,看它到底是白点还是黑点,若是白点,那可以下定义,这处赛道元素是十字,设定十字标志位为一,驱动电机直行,延时一段时间,让小车成功驶过,再让标志位置一。
具体代码演示:
void crossroad(void)
{
uint16 i,j;
uint8 a,b,left_flag,right_flag;
for(i=119;i>85;i--)//从最底下这行开始往上扫线,至于这个75,看着设,预估一下十字路口在图像中大概占多长
{
for(j=94;j>0;j--)//左扫线
{
//左扫线看是白点还是黑点,是白点就给前面设的变量自加
if(点是白点)
a++;
}
//如果当行白点计数超出某个值,丢线行数变量自加
if(a>某个值)
a=0;//清零 left_flag++;//丢线行计数自加
//像上面那段,右扫线
}
}
因为懒啊,就不写详尽了。但早期就是这样写的,左扫线右扫线,然后计丢线行数。当丢线行数大于某个值,再对图像中间那几个点遍历一下,看是否基本上全为白点,若是白点,那设定cross_flag为1,驱动电机向前跑路,软件延时通过十字元素后再将标志位再将标志位置零。
//前面的标准达到了,标志位置一
if(标志位为1)
{
//PWM_duty(设定的速度值这些参数);
//delay(速度乘时间等于距离,自己估摸着设时间参数);
//标志位置零
}
三岔
三岔和十字的判断方法差不多,可以和十字写在一起。二者区别的就在于中间几个点是白是黑。白就是十字,黑就是三岔。会不会产生误判说不好,但有一点能确认的是,你这参数但凡没设好,那百分之一百会跑出毛病。
之后的处理就是
//三岔标志位置一后
//在前面还得设定几个变量
if(三岔标志位为1)
{
//前面设的变量自加
if(变量是奇数)//因为有要求每次转向不一样
{
//两边轮子差速,固定向左或向右转六十度,这一点可以用陀螺仪辅助
//延时,怎么说都得把头转过去,让摄像头看到新的路
}
if(变量是偶数)
{
//与上面相同,只是方向不一样罢了
}
//标志位清零
}
圆环
至于圆环就不多说了,毕竟写到这儿大伙儿也明白了,我这所有的赛道元素处理,全都是识别出来给一个固定参数、固定的速度通过的。理论上确实可行的,就是不可变速以及费人。毕竟参数不是一下子就能设对的。