跳到主要内容

附加理论

视觉目标

FRC 游戏设计师经常在场地上的战略位置放置反光的"视觉目标"。这些视觉目标通常由逆反射胶带制成。主要的得分元素通常都有可用于自动瞄准的视觉目标。下面你可以看到 2016 年和 2017 年 FRC 游戏中一些视觉目标的两个例子。

视觉目标示例

这些逆反射视觉目标具有一个非常有用的特性:当光照射到它们时,它会直接反射回光源。这就是为什么 Limelight 在其摄像头镜头周围有明亮的绿色 LED。通过在发射明亮的绿光朝向目标的同时将摄像头曝光设置得非常低,我们可以获得一个大部分是黑色的图像,其中视觉目标呈明亮的绿色。这使得获取目标变得相对容易。

这里你可以看到理想图像的一个例子。注意由于低曝光设置,图像中几乎所有的细节都消失了,但逆反射胶带却非常突出。

视觉目标示例 2


阈值处理

阈值处理是大多数 FRC 视觉跟踪算法的下一个关键组成部分。它是指对图像进行处理,丢弃不在特定颜色范围内的任何像素。阈值处理的结果通常是一个一维图像,其中像素要么"开"要么"关"。阈值处理在使用上述策略(低曝光,非常暗的图像与明亮照明的视觉目标)捕获的图像上效果很好。

Limelight 在 HSV(色调-饱和度-亮度)颜色空间中进行阈值处理。你可能习惯于在 RGB(红-绿-蓝)颜色空间中思考颜色。HSV 只是另一种表示颜色的方式,类似于笛卡尔坐标或极坐标可以用来描述位置。我们使用 HSV 颜色空间的原因是,可以使用色调来非常紧密地选择 Limelight 的 LED 输出的绿色。

HSV 图像

调整阈值设置以尽可能多地从图像中消除内容是至关重要的。如果你在移动到下一阶段之前优化视觉管道的每个阶段,你将获得最佳结果。下图描述了不正确和正确阈值处理之间的区别:

阈值处理示例

有时,竞技场中的天花板灯或窗户等物体可能难以通过阈值处理从图像中移除,这就引出了下一个阶段。


轮廓过滤

阈值处理后,Limelight 的视觉管道会为图像生成一组轮廓。轮廓是围绕连续像素集的曲线。有时天花板灯、竞技场记分牌、窗户和其他东西可能会通过阈值处理步骤。这就是轮廓过滤变得有用的地方。目标是消除我们知道不是我们感兴趣的目标的任何轮廓。

第一个也是最简单的轮廓过滤是忽略任何小于我们从得分距离看到的视觉目标的轮廓。任何小于该尺寸的东西显然是更远的东西,应该被忽略。这被称为面积过滤。

FRC 视觉目标通常具有一些可以用来帮助我们过滤轮廓的几何特性。例如,如果视觉目标具有宽的纵横比,我们可以过滤掉任何不宽的轮廓:

目标

然而,请记住,你的摄像头可能从一个奇怪的角度看目标。这可能会极大地影响其轮廓的纵横比。请务必从各种角度测试你的设置,以确保你不会过于积极地过滤并最终忽略视觉目标!

目标

这个下一个图像目标非常有趣。它是 FRC 中设计最好的视觉目标之一(在我们看来)。Limelight 自动计算一个称为轮廓充实度的值。充实度是轮廓的像素面积与其凸面积之比。这种特殊形状的充实度非常低,你几乎从不会看到任何天花板灯、窗户等具有如此低的充实度。因此,如果你的视觉目标看起来像这个,你可以非常有效地过滤掉不需要的轮廓。

目标

Limelight 有许多用于过滤轮廓的选项。你可以将这些选项与你所知道的特定视觉目标的几何特性结合使用。

目前,如果多个轮廓通过你的过滤选项,会选择最大的轮廓。此外,管道倾向于使用滞后来"锁定"轮廓。这是一个有助于防止在相似目标之间闪烁的功能。

从像素到角度

视觉管道的最终结果是图像中最佳轮廓的像素位置。对于大多数游戏,我们可以只瞄准轮廓的中心。有时瞄准顶部中心或其他点也很有用,但本质上我们有一个我们想要瞄准的像素坐标。为了计算到这个目标的角度,我们需要使用一点三角学。

首先,我们假设我们有一个完美的"针孔"相机。在实践中,这可能远非事实,但 limelight 的相机非常接近。(鱼眼镜头作为反例,会远离这个理想状态。)

limelight 相机的水平视场为 54 度,垂直视场为 41 度。它以 320x240 的分辨率捕获图像。我们假设图像的中心是相机的光轴(因此该位置的 x 和 y 角度为 0,0)。给定这些已知值,我们可以使用一点三角学来计算图像中任何像素的角度。

下图显示了一个我们想要计算角度的示例目标点。像素坐标从图像的左上角开始,向右和向下为正。

像素到角度

我们的第一步是将像素坐标转换为归一化的 2D 坐标,其中 0,0 是图像的中心,1.0:

(px, py) = 像素坐标,0,0 是左上角,向下和向右为正

(nx, ny) = 归一化像素坐标,0,0 是中心,向右和向上为正

nx = (1/160) * (px - 159.5)

ny = (1/120) * (119.5 - py)

接下来我们定义一个虚拟视平面并计算其大小。为简单起见,我们可以选择将此平面放置在相机位置前 1.0 单位处。这里是俯视相机的视图。我们的目标是计算视平面的宽度和高度,因为这些值将用于稍后计算角度:

像素到角度归一化坐标

给定 1.0 单位的距离和已知的水平和垂直视场,我们可以使用以下公式计算视平面矩形的大小:

vpw = 2.0*tan(horizontal_fov/2)

vph = 2.0*tan(vertical_fov/2)

使用这两个值,我们现在可以通过简单的乘法在归一化像素坐标和视平面坐标之间进行转换。

x = vpw/2 * nx;

y = vph/2 * ny;

记住我们选择将视平面放置在距离 1.0 的位置。现在我们有了计算目标点角度所需的一切。

像素到角度计算

tan(ax) = x / 1

tan(ay) = y / 1

ax = atan2(1, x)

ay = atan2(1, y)