黑白间隔点巡线思路
Posted AIplusX
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了黑白间隔点巡线思路相关的知识,希望对你有一定的参考价值。
写在前面
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
文件夹里,具体位置看这个:
以上是关于黑白间隔点巡线思路的主要内容,如果未能解决你的问题,请参考以下文章
POJ 2942 Knights of the Round Table 黑白着色+点双连通分量