线上比赛中关于视觉AI组与信标组补充说明
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线上比赛中关于视觉AI组与信标组补充说明相关的知识,希望对你有一定的参考价值。
简 介: 本文给出了在第十六届全国大学生智能车竞赛中,线上比赛地区(广东省、山东省)AI视觉组以及信标组中补充的信息。
关键词
: 智能车竞赛,AI视觉组,信标组
§01 AI视觉组
根据 第十六届全国大学生智能车竞赛竞速组-室内视觉组补充说明 中对于室内智慧视觉AI组的要求,需要在比赛赛道旁边部署以下用于视觉识别判断的标靶:
- 视觉标靶:包括数字、动物、水果;
- AprilTag:用在动物、水果标靶区域;
一、比赛图标
下面是Apriltag以及相应的图表示例:
▲ 图1.1 Apriltag图片
▲ 图1.2 水果图片
▲ 图1.3 动物图片
▲ 图1.4 数字图表
数字图表用在三岔路口,竞赛车模根据识别数字确定第一次行进是左行还是右行。
- 偶数: (0,2,4,6,8) 第一次入三岔路口选择左侧路口;
- 奇数:(1,3,5,7,9) 第一次入三岔路口选择右侧路口;
二、靶标位置与比赛方向
下图给出了比赛中数字、动物、水果靶标部署的位置。请注意,安装公布的规则,靶标部署在Apriltag的左侧和右侧是根据Apriltag的数字对应的是偶数还是奇数来确定的。
- 偶数:在Apriltag左侧放置靶标;
- 奇数:在Apriltag右侧防止靶标;
因此根据下图所示的车模运行方向以及动物和水果靶标的位置部署,在水果靶标出放置奇数Apriltag,在动物靶标出放置偶数Apriltag。
▲ 图2.1 靶标位置以及比赛车模运行方向
如果安排决赛,那么决赛场地可以沿用单个预赛比赛场地,也可以将比赛场地有两个预赛场地连接而成。此时靶标的位置仍然只在其中一个场地进行部署。
§02 节能信标
节能信标组的比赛,除了需要按照统一的信标灯的位置和环境铺设比赛场地之外,对于比赛过程中亮灯的顺序需要进行统一。
为了避免参赛队伍利用记忆亮灯顺序来获益,在比赛过程中,准备了八条不同的亮灯顺序,它们具有相同的路径长度,比赛过程中,随机选择不同的亮灯顺序进行比赛。
一、信标场地部署
下图给出了信标比赛场地(5×5米)中四个信标所在的大体位置。比赛过程中,这四个信标灯的位置可以做相对的移动。只要维持整个组别比赛过程中对于所有参赛队伍是相同的即可。
▲ 图2.1 信标灯布置示意图以及编号
二、比赛亮灯顺序
1、预赛亮灯顺序
亮灯20次,八个亮灯顺序为:
[1, 2, 1, 2, 3, 2, 4, 2, 3, 2, 3, 1, 2, 1, 3, 2, 4, 3, 2, 3]
[1, 2, 1, 2, 3, 2, 4, 2, 3, 4, 3, 1, 2, 1, 3, 2, 4, 3, 2, 3]
[1, 2, 1, 2, 3, 2, 4, 3, 2, 4, 3, 1, 2, 1, 3, 2, 4, 3, 2, 3]
[1, 2, 1, 2, 3, 2, 4, 2, 3, 2, 3, 1, 2, 1, 3, 4, 2, 3, 2, 3]
[1, 2, 1, 2, 3, 4, 2, 3, 2, 4, 3, 1, 2, 1, 3, 2, 4, 3, 2, 3]
[1, 2, 1, 2, 3, 4, 2, 3, 2, 4, 3, 1, 2, 3, 1, 2, 4, 3, 4, 3]
[1, 2, 1, 2, 3, 2, 4, 2, 3, 4, 3, 1, 2, 1, 3, 4, 2, 3, 4, 3]
[1, 2, 1, 2, 3, 2, 4, 2, 3, 4, 3, 1, 2, 1, 3, 2, 4, 3, 2, 3]
三、如何设置亮灯顺序?
在比赛系统的“设置界面”中,设置亮灯顺序。
首先,信标组应该选择“信标组比赛”的选项。
然后,在“信标组亮灯顺序” 依次输入前面给定的亮度顺序。注意不需要输入 方括号[]。 然后点击“添加”按钮,可以将亮灯顺序降价到下面的列表框中。
通过“清空”、“删除”可以将输入错的,或者旧的路径取消。
▲ 图2.2 设置信标灯亮灯顺序的界面
在比赛的时候, 可以通过以下三个方法来选择一条路径:
- 直接使用鼠标双击路径列表中的路径;
- 使用鼠标选中某一路径,然后点击“选择”按钮;
- 点击 “随机选择”可以由计算机随机选择一条路径。
最后点击“应用”,返回前面比赛界面,可以进行信标组的比赛了。
§03 亮灯顺序
对于第二个问题,如何确定一组亮灯顺序,使得它们对应的车模行进距离这一指标都是相同的呢?
一、搜索方法
由于现在场内只有四个信标灯,所以可以通过穷举方法来对于所有满足亮灯个数的要求下的路径计算对应的距离,然后进行排序,找到其中的距离相同的路径。
1、亮灯个数与路径个数
加入,所有的路径都从1号灯开始,然后后面亮 N 个灯,由于不允许一个等连续点亮,所以每一次都有 3个选择,所以总共的路径个数为: 3 N 3^N 3N 个。
-
亮灯个数对应路径种类:
-
N=2
:9
N=5
:243
N=10
:59049
N=15
:14348907
N=20
:3486784401
对于亮灯个数超过10以上的路径,对应的种类就非常多了。可以采用分段进行组合的方式来设计亮灯路径。
2、计算所有10之内的路径
将所有亮灯个数10以内的路径进行穷举并进行排序,其它亮灯个数的路径则有这些10之内的路径进行串联组合。为了能够进行串联组合,因此,需要规定每一组路径起始与结束灯的位置。下面假设每个路径的起始与结束的信号灯都是1号等。
▲ 图3.1 亮灯数量为5对应的路径长度分布
▲ 图3.2 亮灯数量为10对应的路径长度分布
▲ 图3.3 亮灯数量为12对应的路径长度分布
3、搜索程序
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY -- by Dr. ZhuoQing 2021-07-13
#
# Note:
#============================================================
from headm import *
lightpos = [(2.5, 0.65), (0.65, 2.5), (2.5, 3.75), (4.35, 2.5)]
#------------------------------------------------------------
def path2len(pathid):
length = 0
path = [lightpos[i] for i in pathid if i >= 0 and i < 4]
for x1,x2 in zip(path[0:-1], path[1:]):
length += sum((array(x1) - array(x2))**2)**0.5
return length
#------------------------------------------------------------
allpath = []
allpathlen = []
def searchpath(N, pathid):
if len(pathid) == 0:
pathid.append(0)
lastid = pathid[-1]
for id in range(4):
if id != lastid:
pathcopy = pathid.copy()
pathcopy.append(id)
if N == 1:
pathcopy.append(0)
allpath.append(pathcopy)
allpathlen.append(path2len(pathcopy))
else: searchpath(N-1, pathcopy)
#------------------------------------------------------------
N = 12
searchpath(N,[])
resultpath = list(zip(allpathlen, allpath))
resultpath.sort()
sortlen = [s[0] for s in resultpath]
sortpath = [s[1] for s in resultpath]
tspsave('path%d'%N, length=sortlen, path=sortpath)
#printf(sortlen)
#plt.hist(allpathlen, 20)
#plt.xlabel("Length")
#plt.ylabel("Frequency")
#plt.grid(True)
#plt.tight_layout()
#plt.show()
printf('\\a')
#------------------------------------------------------------
#------------------------------------------------------------
# END OF FILE : TEST1.PY
#============================================================
二、路径组合
1、长度中位数路径
根据前面进行路径搜索,可以看到路径长度在中位数的比例最多。
亮灯个数 | 中位数长度 | 路径个数 |
---|---|---|
5 | 13.1516 | 15 |
6 | 15.898 | 8 |
7 | 18.63 | 10 |
8 | 21.347 | 120 |
9 | 24.063 | 88 |
10 | 26.796 | 230 |
11 | 29.512 | 500 |
12 | 32.445 | 416 |
13 | 35.280 | 170 |
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST2.PY -- by Dr. ZhuoQing 2021-07-13
#
# Note:
#============================================================
from headm import *
length0, path0 = tspload('path4', 'length', 'path')
length1, path1 = tspload('path5', 'length', 'path')
length2, path2 = tspload('path6', 'length', 'path')
length3, path3 = tspload('path7', 'length', 'path')
length4, path4 = tspload('path8', 'length', 'path')
length5, path5 = tspload('path9', 'length', 'path')
length6, path6 = tspload('path10', 'length', 'path')
length7, path7 = tspload('path11', 'length', 'path')
length8, path8 = tspload('path12', 'length', 'path')
def midpath(l, p):
midlength = l[len(l) // 2]
midpath = p[l==midlength]
return midpath, midlength
mp,ml = midpath(length8, path8)
printf(ml, len(mp))
#------------------------------------------------------------
# END OF FILE : TEST2.PY
#============================================================
2、不同路径组合
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST2.PY -- by Dr. ZhuoQing 2021-07-13
#
# Note:
#============================================================
from headm import *
import random
length0, path0 = tspload('path4', 'length', 'path')
length1, path1 = tspload('path5', 'length', 'path')
length2, path2 = tspload('path6', 'length', 'path')
length3, path3 = tspload('path7', 'length', 'path')
length4, path4 = tspload('path8', 'length', 'path')
length5, path5 = tspload('path9', 'length', 'path')
length6, path6 = tspload('path10', 'length', 'path')
length7, path7 = tspload('path11', 'length', 'path')
length8, path8 = tspload('path12', 'length', 'path')
def midpath(l, p):
midlength = l[len(l) // 2]
midpath = p[l==midlength]
return midpath, midlength
#------------------------------------------------------------
lightpos = [(2.5, 0.65), (0.65, 2.5), (2.5, 3.75), (4.35, 2.5)]
#------------------------------------------------------------
def path2len(pathid):
length = 0
path = [lightpos[i] for i in pathid if i >= 0 and i < 4]
for x1,x2 in zip(path[0:-1], path[1:]):
length += sum((array(x1) - array(x2))**2)**0.5
return length
#------------------------------------------------------------
def pathserial(pathid):
path1s = []
path2s = []
path3s = []
path4s = []
path5s = []
path6s = []
path7s = []
path8s = []
lpdim = ((length0, path0), (length1, path1),
(length2, path2), (length3, path3),
(length4, path4), (length5, path5),
(length6, path6), (length7, path7),
(length8, path8))
for id in pathid:
mp, ml = midpath(lpdim[id][0], lpdim[id][1])
random.shuffle(mp)
path1s.extend(mp[0][:-1])
path2s.extend(mp[1][:-1])
path3s.extend(mp[2][:-1])
path4s.extend(mp[3][:-1])
path5s.extend(mp[4][:-1])
path6s.extend(mp[5][:-1])
path7s.extend(mp[6][:-1])
path8s.extend(mp[7][:-1])
return (path1s, path2s, path3s, path4s,
path5s, path6s, path7s, path8s)
path = pathserial((7, 8))
pathlen = [path2len(p) for p in path]
printf(shape(path))
for p in path:
printf(p)
#------------------------------------------------------------
# END OF FILE : TEST2.PY
#============================================================
■ 相关文献链接:
● 相关图表链接:
以上是关于线上比赛中关于视觉AI组与信标组补充说明的主要内容,如果未能解决你的问题,请参考以下文章
第十六届全国大学生智能汽车竞赛总决赛 AI视觉组线上赛细则草案