此文系第16届智能车智能视觉组-上海交通大学AuTop战队开源算法讲解第五部分--元素识别,专栏及开源方案链接:

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


作为智能车比赛基本要求,小车需要按照规划的路径行驶。以下分享我们基于角点识别实现的,对不同元素识别与控制的思路。

一、角点计算方法

角点识别,故名思义,通过计算道路边线的实际角度来对道路进行判断。

在之前的文章中(llo:第16届智能车智能视觉组-上海交通大学AuTop战队开源算法讲解(四)边线处理与方向控制),采用我们的算法可以得到稳定且等距的边线前提下,直接取每个点前后20cm构成一个三点,利用向量的角度计算公式算实际角度即可。为方便判断,我们又进行了角度的非极大抑制,保证只留下角度最大的点,即角点。这样算出来的角度很稳定,跟实际也很接近。

因而,我们判断元素时候便可直接通过角点判断。例如,十字为两个L角点(90°),出入三叉标志都为两个Y角点(60°),圆环为单边长直道单边L角点(90°),车库为斑马线及L角点(与Apritag区分)。同样的,长直道与弯道也可以通过角点大小及变化方便地判断出来。

二.元素识别详解

2.1.车库识别与控制

车库的识别控制包括两部分,出库与入库。这一部分网上大多开源代码采用的是开环控制,由于SJTU-AuTop常规循线采用单线偏移的方案,因而在出库入库方案上十分简洁且合理。

(1)出库

出库很简单,循单侧线即可,即出左库循左线,出右库循右线,出库时可适当调近预瞄以获得更好的控制效果。

以出左线为例,规划路径如下图所示,右线同理。

出库_raw

出库_line

(2)入库

入库最重要的便是斑马线识别,我们采用的方案是,将透视变换视角下得到的中线反变换回原图,取每一中线点对行做处理,对该点左右各一定区域的黑白区域进行循环记录,黑白区域应交替出现。若黑白交替次数大于阈值,且每一区域点数大于指定阈值,且单侧存在L角点(90°),则认定为斑马线。L角点的左右可以区分左库与右库,此时直接更改循线模式即可。

有无L角点也是车库与总钻风识别Apriltag的重要区分,且特征十分明显。

找到斑马线后,入库便变得很简单,入左库只需循着左线即可,为保证入库的稳定性可在此时适当增加舵机pid以得到更好的入库姿态。

入库_raw

入库_line

入库完成标志为:左线右线重合,此时角点判断得到两线都存在左右L角点且L角点较近,此时通过刹车pid停车即可。

入库完成_raw

入库完成_line

2.2.十字识别与控制

十字的识别方式有很多种,常见的有道路变宽或者说出现多行白线、出现两个返向拐点等等,我们看来这些思路或斜入误判、或依据调参。

AuTop采用的是基于角点的识别,因而十字识别的标志十分明显,即两个90°直角,我们认为这样识别的方案较为直观且合理。为避免路肩带来的误判,我们对根据角度判据找出的两个L角点(90°)作出二次距离验证:两L角点欧拉距离小于0.7m,且L角点之后的边线分别向两边扩充。

控制方案上,在十字的控制中,诸多队伍采用的是补线的方案,即找到上下角点连成直线,以此控制。这里我们尝试了另外一种方案,即远近线控制。

在识别到两个直角点后,进入CROSS_BEGIN模式,为防止路径循出,对线段做截断处理,效果如下所示。

CROSS_IN(raw)

CROSS_BEGIN (line_已截断)

当角点较近时,切换CROSS_RUNNING模式,此时同时寻近线与远线(虚线),此时的路径规划由远线控制。远线的寻找方式为从车两侧找到黑色边线点,再向上经过黑白黑或白黑的循线方式,即可找到远线的起始点,之后的寻线方式与近线相同。

CROSS_IN(raw)

CROSS_IN(line)

小车经过十字,近线会经过一个先丢线后有线的过程,此时即可刷掉十字模式,切回正常循线。

2.3.圆环的识别与控制

圆环的控制阶段与十字相比更加复杂一些,网上较为流行的圆环控制算法为入环出环补线,这一方案有一定的实用价值,但实际应用中很难完美的补圆。

AuTop采用的方案的核心为内外边线交替控制,即依次循外边线过环、内边线入环出环、再且外边线出环的方式。

我们将圆环分CIRCLE_BEGIN,CIRCLE_IN,CIRCLE_RUNNING,CIRCLE_OUT,CIRCLR_END五个阶段,下面以右环为例进行讲解,左环可同理推得。

当识别到单边L角点(90°),另一边线为长直道后,进入CROSS_BEGIN阶段,此时寻长直道线进行控制即可,角点位置决定了左环与右环。

CIRCLE_BEGIN(raw)

CIRCLE_BEGIN(line)

小车行进一段时间,右线经过一个先丢线后有线的过程后,切换模式为CIRCLE_IN,此时切换循线模式为循内圆边线即可快速入环。

CIRCLE_IN(raw)

CIRCLE_IN(line)

可使用编码器或陀螺仪为标志,亦或者判断左边线是标准弯道后完成入环,切换模式为CIRCLE_RUNNING,此时可理论而言循左线或右线效果相同,但因内边线在大转角或且内线有丢失的可能,我们采用的是循外圆的方式。

CIRCLE_RUNNING(raw)

CIRCLE_RUNNING(line)

出环标志为左边线识别到拐点,且拐点较近,切换模式为CIRCLE_OUT,此时确保循线模式为循右线即可顺利出环。

CIRCLE_OUT(raw)

CIRCLE_OUT(line)

出环模式,循内圆截至的标志为左线为长直道。此时切换模式为CIRCLE_END,循线模式为循左线长直道。

CIRCLE_END(raw)

CIRCLE_END(line)

当右线经过一个先丢后有的过程后,圆环模式即可结束,此时,切换CIRCLE_TYPE为常规CIRCLE_NONE即可。

2.4.三叉的识别与控制

三叉作为今年的新识别元素,我们仍采用基于角点识别的思路进行。三叉的识别方案为两个Y角点(60°)。与十字类似,Y角点也可经过二次验证,验证的方案与十字处L角点相同。

在识别到三叉后,智能视觉组根据识别结果切换循线模式,即可进入指定路线。出三叉同样为两个Y角点,直接切换循线模式即可。

YROAD(raw)

YROAD(line)

2.5.其它元素的识别

长直道的判断较为简单,1m以内无超过5°的转角即可。

Straight

小S弯,由于我们采用的方向环控制算法为Pure Pursuit方案,其本就有且内特性,因而虽为对小S做特殊处理,但实际小车运行的轨迹极优。

S_road(raw)

S_road(line)

坡道识别,坡道有大坡与小坡之分,第十六届比赛的坡道便是小坡,其控制及识别完全不需进行,按照常规模式即可,而对于大坡而言,则需要识别以控制速度为一个合适的中值。大坡速度过高必飞坡,过低又上不去,需要在上坡的时候微踩一脚刹车,克制飞坡效果显著。

下图依次是过坡道图中的三幅场景,根据上坡前两边边框的特征或许可以对坡道进行识别,但我们认为用视觉处理起来较为复杂,因而用陀螺仪判断。陀螺仪需经过合适的滤波与逻辑判断,以避免撞到路肩的干扰。类似的,坡道识别也可以使用超声或TOF模块判断,且不易受干扰,而且并非亡羊补牢识别(陀螺仪上坡后才可检测无法提取识别)。

坡道上的控制也不太方便通过视觉进行,有些队伍采用的是仅取前几行进行控制的方式,我们觉得这个度很难把控,因而在上坡中采用的是纯电感控制的方案(后期甚至发现开环控制过大坡似乎也可)。

Ramp1(raw)

Ramp1(line)

Ramp2(raw)

Ramp2(line)

Ramp3(raw)

Ramp(line)

6.总结

十字通过双L角点(90°)识别,圆环通过单L角点单长直道识别,三叉通过双Y角点(60°)识别,可简介地将这三大基本元素区分开来,且十字与三叉通过距离特征的二次判定可极大减少误判。

我们认为,建立在良好的标定基础之上,我们采用基于角点识别的元素识别算法在合理性及普适性上都有着一定的优势,可以很方便地以此对各个元素进行判断,且代码复用性与可读性很强。因代码可复用,代码量会十分精简(例如整个圆环的模式切换与控制只有150行左右的代码),且控制相当稳定。


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

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