此文系第16届智能车智能视觉组-上海交通大学AuTop战队开源算法讲解第四部分--边线处理与方向控制,专栏及开源方案链接:

llo:第16届智能车智能视觉组-上海交通大学AuTop战队开源汇总


  1. 边线处理

在方向控制中,一种基于几何关系的常用控制方式是纯跟踪控制。对于纯跟踪控制,相信做智能车比赛的小伙伴都不会陌生,而在纯跟踪控制中,最重要的就是确定预锚点

预锚点是位于小车目前路径上的一点,使用纯跟踪控制可以使得小车从当前点平滑的过渡到目标点。可以看出为了确定预锚点,需要设定小车的目标路径。为了方便,我们直接将赛道的中线设定为小车的目标路径。

一种比较简单的提取赛道中线的方式是在确定了两条赛道边线后,从图像下方往上依次取左右边线的一个点,将这两个点的中点当作中线上的一点。这个方法对于直道效果不错,但并不适合大转角处

我们采用的方式是对单独左(右)边线进行跟踪从而得出中线的方式。因为在去畸变和透视变换的帮助下,我们已经得到了俯视视角下的赛道边线,而赛道的宽度又是固定的(45cm)。这意味着我们只需要将左边线向右侧“平移”22.5cm,或将右边线向左侧“平移”22.5cm即可得到中线。对于左边线上的每一个点,首先计算此处的切线,然后将该点沿切线法向向右侧移动22.5cm即可得到中线上的一个点。注意,这里的22.5cm需要将单位换算成像素。

由于我们并没有对边线进行曲线拟合,而是用一系列离散的点来表示这条曲线。所以曲线上一点的斜率我们利用拉格朗日中值定理来近似,即计算该点前后两点连线的斜率作为该点切线斜率的近似。为了降低噪声的干扰,我们首先对得到的边线进行了三角滤波和等距采样。

  • 三角滤波:使得曲线变得平滑,降低异常噪声的干扰。
  • 等距采样:使用线性差值的方式,对曲线上的点进行重新采样,使得采样后的相邻两点之间的距离相等。

类似的,对于计算得到的中线,我们同样对其进行了等距采样。

等距采样:边线和中线上的点有着相同的间距

由于中线既可以从左边线得到,也可以从右边线得到,这意味着我们的方向控制有两种不同的选择,即巡左中线和巡右中线。这给了方向控制极大的灵活性,在下一篇(第16届智能车智能视觉组-上海交通大学AuTop战队开源算法讲解(五)元素识别)中可以看到,我们会大量利用切换巡左中线和巡右中线的方式,控制我们的小车顺利的通过各种不同的赛道元素。

由于在前一部分我们提到过,我们对中线进行了等距采样,这极大的方便了纯跟踪控制中的预锚点的选取。假设等距采样时,每2cm采样了一个点,而我们希望将预锚点设置在前方60cm处,那么只需选取第30个中线点作为预锚点即可。

然而这种方式仍然有一定的问题,由于中线可以从左边线和右边线中得到,如果两种选择得到的中线起点位置不同,在来回切换左中线和右中线时,预锚点也会来回变动。这可能导致舵机异常的抖动。

左右中线起始点不同

在上图中,我简单的绘制了一个左右中线起始点不同的现象。为了避免这种现象对方向控制的影响,我们还需要对中线进行一次归一化,使得不同情况下的中线都有着相同的起始点。简单的,我们直接设置了一个固定起始点位置,如果中线超出了起始点,就将中线截断,而如果不足起始点,则将起始点和中线相连接。

2. 方向控制

经过上述边线处理,我们可以得到一个较为稳定的预锚点,并将其用于纯跟踪控制。在纯跟踪控制中,预锚点的距离是一个很关键的参数。较远的预锚点可以使得小车的移动更加平滑(S型弯基本无转向),但会导致过弯过于切内线,从而容易撞上路肩;而较近的预锚点则会使得小车更好的贴合预设的赛道中线,但严重时会产生控制震荡。一种常用的设定预锚点的方式是使得预锚点和当前速度正相关,即高速行驶时“看”远一些,低速行驶时“看”近一些。但我们由于时间不足,同时也由于主要精力放在了靶牌的识别上,未进行相关尝试,仍采用的固定预锚点距离的方式。

3. 感言

虽然我们认为自己的边线识别方案做的不错,但小车控制上还有较大提升空间。也欢迎四轮组的大佬来交流控制经验。


SJTU-AuTop完整开源方案链接,如果觉得我们的方案对您有帮助,请在github上帮忙点个star吧:)

llo:第16届智能车智能视觉组-上海交通大学AuTop战队开源汇总