功能模块:能量机关识别及击打任务 - Ligcox/BTP_DM GitHub Wiki
概述
能量机关识别及击打是RoboMaster赛场上视觉和算法部分最困难的任务。而成功击打能量机关的增益效果巨大,往往能起到扭转战局的作用。因此能量机关识别及击打极其重要。
BTPDM中实现的能量机关识别及击流程打包括了
- 任务调度器-能量机关任务:调度程序切换至能量机关任务
- 能量机关颜色过滤器 :筛选图像中对应颜色的目标
- 能量机关识别器:根据筛选出的能量机关灯条识别装甲模块目标
- 能量机关预测器:根据击打目标和运动速度来预测装甲模块目标位置
- 自瞄决策:对指定目标的击打、预测,并转换为BCP数据发送给下位机
任务调度器-自动瞄准任务
在功能模块:任务调度器一节,我们简单的介绍了BTPDM的中心任务调度器逻辑。
对于自瞄任务的实现,可以继承或重写scheduler下的task_auto_Energy方法。 任务调度器是整个程序的主线程 程序具体流程如下:
从图像采集线程读取一帧图像数据。
通过EnergyColorFilter能量机关颜色过滤器,将对应目标颜色筛选出来。
通过EnergyDetector能量机关识别器
通过EnergyPredictor能量机关预测器
通过InfantryDecision自瞄决策
对机器人状态进行相关决策后,进入下一循环loop。
颜色过滤器
能量机关的视觉特征为红蓝两色,故可以通过颜色来过滤图像,筛选出目标。但由于击打能量机关准确性要求高,需保证没有误识别的情况。所以在原有HSV滤波器的基础上再加上BGR滤波。将两者过滤出来的二值图进行与操作,从而获得的二值图不会有其他杂波。
能量机关识别器
能量机关目标识别
整体思路
我们知道能量机关共有两种形态,一种为未被激活的锤子形和另一种为激活成功的宝剑形。两者的不同在于他们的面积,故思考能否通过轮廓信息计算面积,并通过对每个轮廓进行比较,实现筛选出锤子形的目标。由于所要击打的目标为锤子形目标,而锤子形目标具有上宽下窄的特点。故思考能否通过此特点,使用轮廓填充和膨胀操作的图像相减获得目标。
能量机关灯条数据类型定义
- stripList:灯条信息列表,包括能量机关灯条Energy_Strip和R标灯条Circle_Strip,数据类型为contour
- stripCenterList:灯条中心列表,包括能量机关灯条中心Energy_Strip_Point和圆心Circle_Center_Point,数据类型为tuple
- energyTargetCenter:装甲模块目标的几何中心,数据类型为tuple类型
- energyTargetRect:装甲模块目标的矩形信息,数据类型为cv2.minAreaRect ((x, y), (w, h), θ )类型
识别过程
为确保轮廓清晰完整,对二值化图像进行
enhanceContour
轮廓增强操作,轮廓增强包括 canny算子(用以边缘模糊)、膨胀、腐蚀和开闭运算。
对轮廓进行findStrip筛选灯条操作,使用cv2.contourArea
计算轮廓面积,并通过设定面积的上下限完成锤子形灯条的筛选。
对灯条轮廓分别进行填充和膨胀操作,获得fillContourIMG
和dilateContourIMG
图像
将两图像相减获得装甲模块目标图像
对图像进行minAreaRect
操作,获得targetRect
能量机关预测器
旋转方向判断
整体思路
考虑到能量机关在比赛中的旋转方向非固定,故需要能实时判断旋转方向的功能。通过记录并比较前后两帧目标的角度或弧度即可得出旋转方向。
旋转方向数据类型定义
clockwise
:顺时针方向旋转,数据类型为bool
类型anticlockwise
:逆时针方向旋转,数据类型为bool
类型
判断过程
通过比较两帧前后两次
originRadian
的值来判断方向
若前后两帧的originRadian
的值相差过大,即可视为目标的切换,则自动抛掉当前帧的信息
目标预测
整体思路
为简化问题,将瞬时速度作为用于预测的数据。(本身应该通过数据拟合将瞬时速度拟合到正弦函数上,并根据时间差来预测下一次击打时的速度)
目标预测数据类型定义
predictTargetCenter
:预测击打点,数据类型为tuple
类型predictRect
:预测击打点的矩形框,数据类型为cv2.minAreaRect ((x, y), (w, h), θ)
类型
目标与预测过程
计算前后两帧的目标中心点位移和时间差的比值得出目标移动的瞬时速度
Velocity
瞬时速度和子弹在空中的时间乘积为预测目标移动的距离
预测目标移动的距离即为弧长,代入圆的弧长公式,即可推出预测目标移动的弧度
自瞄决策
由于相机非广角镜头,在自瞄能量机关过程中会出现目标丢失的情况,那么就涉及到决策问题,是选择继续等待目标出现,还是选择自动寻找目标。 对此我们的决策方案如下:
操作手设定云台修正位置。
若短时间内目标丢失,则以未丢失前R标的位置为云台移动方向。
若长时间目标丢失,则通知下位机将云台位置回正到操作手预设位置。