功能模块:装甲板识别及自瞄任务 - Ligcox/BTP_DM GitHub Wiki

概述

装甲板识别及击打是RoboMaster赛场上视觉部分最重要的任务,装甲板识别及击打能够派生出一系列的自瞄和追踪任务。因此装甲板识别及击打在视觉部分起到的作用至关重要。

BTPDM中实现的装甲板识别及击流程打包括了

  • 任务调度器-自动瞄准任务:调度程序切换至自瞄任务
  • 颜色过滤器:筛选出图像中的装甲板灯条区域
  • 装甲板识别器:根据灯条识别结果识别出装甲板区域
  • 分类器:根据装甲板,分类出装甲板所属的机器人编号,剔除相应装甲板
  • 自瞄决策:对指定目标的击打、预测,并转换为BCP数据发送给下位机

程序具体流程如下: 自瞄流程

任务调度器-自动瞄准任务

功能模块:任务调度器一节,我们简单的介绍了BTPDM的中心任务调度器逻辑。

对于自瞄任务的实现,可以继承或重写scheduler下的task_auto_aiming方法。地面机器人、哨兵机器人的自瞄任务实现有一定的差异,但基本流程是相似的。任务调度器作为整个程序的主线程,会首先从图像采集进程读取一帧图像数据,然后对图像数据分析,查找其中的装甲板信息。之后将装甲板信息传入自瞄决策,对机器人状态进行相关决策后,进入下一循环loop。

具体过程为: 哨兵决策

颜色过滤器

装甲板有显著的视觉特征,主要体现在装甲板两次闪烁的红蓝灯条。因此,自瞄任务会首先将图像二值化,筛选出敌方单位的装甲板灯条。

colorFilter类实现了RGB和HSV空间下的装甲板颜色过滤,各个参赛队伍可以根据自身的摄像头选型、机器人状态,选择不同的颜色过滤器类型。

装甲板识别器

灯条识别

灯条数据类型定义

strip_list:为图像中全部装甲板灯条信息,灯条信息包括两个部分:

  • ROI_RECT:装甲板长方形框信息,输出结果为cv2.minAreaRect ((x, y), (w, h), θ)
  • ROI_BOX:装甲板长方形框信息,输出结果为cv2.boxPoints((x0, y0), (x1, y1))

识别过程

灯条识别首先将颜色过滤器处理后的二值化的图像进行滤波,对图像中的轮廓进行查找,筛选出图像中 面积位于阈值内竖直 的轮廓作为灯条数据(这能够有效筛选出装甲板后方血条及血条附近两个小灯条对装甲板识别的干扰)。

装甲板识别

装甲板数据类型定义

armor_list:为图像中全部装甲板信息长度为ROI_DATALENTH

  • ROI_RECT:装甲板长方形框信息,输出结果为cv2.minAreaRect ((x, y), (w, h), θ)
  • ROI_BOX:装甲板长方形框信息,输出结果为cv2.boxPoints((x0, y0), (x1, y1))
  • PNP_INFO:装甲板pnp解算数据,输出结果为[距离, yaw偏转角,pitch偏转角]

识别过程

装甲板识别会两两对灯条数据逐个遍历,当装甲板 倾斜角度长宽比例pnp解算数据 都在阈值范围内时,会认为两个灯条能够组成装甲板。同时,若一个灯条匹配了多块装甲板时,装甲板识别会只保留该灯条最近的装甲板信息。

装甲板位姿解算

装甲板位姿解算原理细节在算法分析:位姿解算,在装甲板识别与击打过程中,位姿解算是连接图像数据和决策数据的桥梁。

相机标定矩阵通过预先标定获取,通过PNP算法计算图像数据对应的偏转角信息。装甲板识别与击打过程中,采用了的灯条两个RECT所存在的八个点的世界坐标系数据作为解算变量。同时,若pnp解算数据存在明显,应当将数据剔除。

  • 装甲板世界坐标系为灯条尺寸,而非实际的装甲板尺寸。需要注意的是,由于采集的数据可能存在灯条光晕, 参数应该适当放大。
  • pnp解算返回的结果为目标平移矩阵和旋转矩阵。平移矩阵能够反算出图像距离;旋转矩阵能够反算出yaw, pitch, roll偏转角度。
  • 一些RoboMaster开源框架中提到能够通过roll偏转角度剔除明显偏离正常值的装甲板,在实际测试过程中效果及其不理想,因此BTPDM中没有对roll偏转角度的进行处理

决策

装甲板识别及自瞄任务在不同机器人上表现有一定差异,具体表现在:

对于地面机器人,靠近屏幕中心的装甲板对自身可能造成更大的威胁,允许出现一定的误识别,能够通过操作手的操作纠正。
对于哨兵机器人,靠近自身的装甲板对自身可能造成更大的威胁,基本不允许出现误识别,不能通过操作手的操作纠正。

此外,对于敌方单位和装甲板之间也存在着复杂关系:

正常状态:敌方单位存在,装甲板存在
误识别状态:敌方单位不存在,装甲板不存在 遮挡状态:敌方单位存在,装甲板不存在,如扭腰等
被击打状态:敌方单位存在,装甲板不存在,如被击打时装甲板熄灭

因此,自瞄任务的核心就是在找到装甲板后处理这些关系。对于地面机器人,BTPDM会直接选定距离操作手图像中心最近的目标作为击打目标。对于哨兵机器人,BTPDM会首先选定距离自身最近的装甲板作为击打对象,然后处理前后击打对象的关系。

处理的核心逻辑是建立了一个时间队列变量time_queuetime_queue是一个FIFO的队列,里面保存了当前的对象信息。只有在一定时间内出现足够多的击打对象时,time_queue才会激活哨兵机器人,只有在一定时间内有足够多的击打对象被移除时,BTPDM才认为目标已经消失或被摧毁。这样做的目的是将不同的赛场环境作为不同的 状态机 交由下位机处理。