我们现在的智能摄像头小车,运用如下的代码:
unsigned char threshold = 128; // threshold for binary
for(int i = 0;i < IMAGEH;i++) //图像的高为120,即IMAGEH=120
{
for(int j = 0;j < IMAGEW;j++) //图像的宽度为188.即IMAGEW=188
{
if(Camera_Output[i][j] > threshold)
{
binary[i][j] = 255;
}
else
{
binary[i][j] = 0;
}
}
}
int mid[120];
int left1[120]={0};
int right1[120]={0};
left1[119]=0;
right1[119]=187;
for (int i = IMAGEH -1 ; i >= 0; i--)
{
mid[i] = (left1[i] + right1[i]) / 2;
if (i == 0)
{
break;
}
for (int j = mid[i]; j > 0; j--)
{
if ((binary[i-1][j - 1] == 0 && binary[i-1][j] == 255 && binary[i-1][j + 1] == 255) || j == 1)
{
left1[i - 1] = j;
break;
}
}
for (int j = mid[i]; j <IMAGEW; j++)
{
if ((binary[i-1][j - 1] == 255 && binary[i-1][j] == 255 && binary[i-1][j + 1] == 0) || j == IMAGEW-1)
{
right1[i - 1] = j;
break;
}
}
}
int sum1 = 0;
for (int i = 0; i < 120; i++)
{
sum1 += abs(94 - mid[i]);
}
if (sum1 / 120 < 100)
{
my_duty=10; //35 //50
motor_duty(my_duty);
}
else
{
my_duty=20; //25 //50
motor_duty(my_duty);
}
int sum2 = 0;
for (int i = 30; i < 60; i++)
{
sum2 += mid[i]-94;
}
float auto_angle = sum2/k_steer; //k_steer是一个经多次尝试得到的一个合理的系数
steer_angle(auto_angle);
现在上述代码已经能实现简单的弯道自动拐弯,直线也能走直,但是环岛的话可以进去但是一直会循环转圈出不来。
在订阅了您的专栏后,发现里面的环岛相关代码对于我们来说太过复杂困难,因此我们想请教您,想问问基于如上代码的逻辑,如何有一个判断环岛的条件?这样只要我们能编出这个条件的话,我们就用最最原始的方法:定时打满方向来绕一个环岛然后在定一段时间直走的,直到完全将环岛通过之后再换用上面这套弯道自动拐弯程序。
我们时间从零开始造小车只有7天,明天下午就要截止测试了,在此殷切盼望您能帮忙指点我们环岛条件判断的方法,越简单越好,非常感谢,麻烦您了