写在前面

2020年的电赛赛题要求我们巡一个黑白间隔的导航线,如果放在平地上的话难度是不大的,但是我们需要在一个有坡度的坡道上完成这项任务。

在坡道上的时候因为重力的原因,小车打角的时候会因为重力导致打角不太准确,车子可能会偏离预定航线比较多,因此一个稳定的巡线方案是非常必要的,这篇博客就来分享我的坡道上黑白间隔点巡线思路

思路分析

我将整条循迹线分成了3个部分,如下图所示:

我划分各个阶段的依据是弯道,没经过弯道之前正常循迹,弯道的时候做特殊处理,弯道结束之后在特定时机之后再切换成正常循迹,直到最后停车结束任务。

阶段1

阶段1的时候主要要分析的点就是如何正常循迹,先来看一下我车上的光电传感器的摆放方式:

别问为啥就放3个,问就是放不下了。言归正传,在阶段1的时候,主要依靠前面2个光电循迹,如果前面2个光电其中一个感知到了黑色,说明踩线了,此时我就让车子放那个方向打一个固定的角度,从而保证车子基本是按照直线来行驶的。具体实现在下面:

if (left_sensor == SWHITE && right_sensor == SWHITE)
{
  turn_flag = 0;  //回正
  start_turning_flag = 0; //停止转向
}
else if (left_sensor == SBLACK && right_sensor == SBLACK) 
{
  turn_flag = 0;  //回正
  start_turning_flag = 0; //停止转向
}
if (left_sensor == SBLACK && right_sensor == SWHITE)
{
  start_turning_flag = 1; //开始转向
  turn_flag = 1;  //左打角
}
else if (left_sensor == SWHITE && right_sensor == SBLACK)
{
  start_turning_flag = 1; //开始转向
  turn_flag = 2;  //右打角
}

那么小车如何通过弯道呢?那就是阶段2的事情啦。

阶段2

当小车行驶通过了阶段1之后,会由left_behind_sensor这颗光电传感器去感知黑块,当他感知到黑块了之后马上就会以舵机最大打角前进,实现如下:

encoder_integral = 1;
if(encoder_sum > standard[theta][run_time]){  //积分值大于设定值,认为转弯结束
    encoder_sum = 0;
    encoder_integral = 2;
    right_special = 1;
}

那么如何判断小车的通过了阶段2也就是弯道呢?我设置了2个条件,一个是编码器的积分值超过阈值,而且前面的某个光电传感器感知到黑块,实现如下:

if(right_special == 2){  //打最大角度
    encoder_integral = 1;
    if(encoder_sum > standard[theta][run_time]){  //积分值大于设定值,认为转弯结束
        encoder_sum = 0;
        encoder_integral = 2;
        right_special = 1;
    }
}else if(right_special == 1){//开始查询前面2个灯是不是看到了黑点,看到了就正常循迹
  if(left_sensor == SBLACK || right_sensor == SBLACK){
    right_special = 0;  //正常巡线标志位
  }
}

阶段3

阶段2达到了停止条件之后说明小车基本已经摆正了姿态,那么接下来只需要正常循迹就可以了,最后的停车条件就是left_behind_sensor这个灯感知到了最后的停车线。实现如下:

if(left_behind_sensor == SBLACK){
  if(track_line_flag == 1){
    track_line_flag = 0;
    switch_stopflag = 1;
    stop_flag = 1;   //停车
  }
}

以上这段程序在我的公众号AIplusX里面的程序资料的RampCar文件夹里,具体位置看这个: