首先在开头感谢吉林大学2020年开源代码以及西北工业大学2020年开源代码对本套代码的完成提供的巨大帮助。
本代码是华南理工大学超星五灵侠队XBOTCON无限机甲杯2022视觉算法,主要模块分为装甲板识别、位置预测、角度解算、相机驱动及串口通信。
模块 | 功能 |
---|---|
装甲板识别 | 检测敌方机器人装甲板位置信息 |
位置预测 | 自瞄时检测移动靶 |
角度解算 | 根据上述位置信息解算目标相对枪管的yaw、pitch角度及距离 |
相机驱动 | 实现相机参数控制及图像采集 |
串口 | 与下位机通信,传输机器人姿态信息及操作手反馈视觉的控制信息 |
装甲板识别采用基于OpenCV的传统算法实现装甲板位置检测。因为读取的是彩色图,直方图均衡化需要在HSV空间做,同时开操作 (去除一些噪点),闭操作 (连接一些连通域)。 识别得到装甲板在图像中四个顶点、中心点的坐标信息。
使用了卡尔曼滤波分别对三维点坐标x、y、z进行更新,在自瞄状态下将自动代入解算。
角度解算方面使用了P4P算法。
此外还引入了相机-枪口的Y轴距离补偿及重力补偿。
硬件 | 型号 | 参数 |
---|---|---|
运算平台 | Manifold2-G | Tx2 |
相机 | USB摄像头 | 720p 30帧 4.2mm 70° |
软件类型 | 型号 |
---|---|
OS | Ubuntu20.04 |
Library | OpenCV-3.4.0 |
├── CMakeLists.txt
├── Config
├── libBase
│ ├── Common.cpp
│ ├── Common.hpp
│ ├── FirstProcess.cpp
│ ├── FirstProcess.hpp
│ ├── SecondProcess.cpp
│ └── SecondProcess.hpp
├── libCamera
│ ├── Camera.cpp
│ └── Camera.hpp
├── libHardware
│ ├── ServoControl
│ └── Transport
│ ├── Serial.cpp
│ └── Serial.hpp
├── libSolver
│ ├── Pose
│ │ ├── AngleSolver.cpp
│ │ ├── AngleSolver.hpp
│ │ ├── Pose.cpp
│ │ └── Pose.hpp
│ └── Predict
│ ├── KF.cpp
│ ├── kPredict.cpp
│ └── kPredict.hpp
├── libVision
│ ├── ArmorDetect
│ │ ├── ArmorDetect.cpp
│ │ └── ArmorDetect.hpp
│ ├── FuwenDetect
│ │ ├── FuwenDetect.cpp
│ │ └── FuwenDetect.hpp
│ └── MonoDistance
│ ├── Mono.cpp
│ └── Mono.hpp
├── Main.cpp
├── README
├── setup.sh
├── Test
│ ├── CameraAdjustion
│ │ ├── CameraAdjustion.cpp
│ │ └── CMakeLists.txt
│ └── getTestData
│ ├── 10.jpg
│ ├── 11.jpg
│ ├── 12.jpg
│ ├── 13.jpg
│ ├── 14.jpg
│ ├── 15.jpg
│ ├── 16.jpg
│ ├── 17.jpg
│ ├── 18.jpg
│ ├── 19.jpg
│ ├── 1.jpg
│ ├── 20.jpg
│ ├── 21.jpg
│ ├── 22.jpg
│ ├── 23.jpg
│ ├── 24.jpg
│ ├── 25.jpg
│ ├── 26.jpg
│ ├── 27.jpg
│ ├── 28.jpg
│ ├── 29.jpg
│ ├── 2.jpg
│ ├── 3.jpg
│ ├── 4.jpg
│ ├── 5.jpg
│ ├── 6.jpg
│ ├── 7.jpg
│ ├── 8.jpg
│ ├── 9.jpg
│ ├── CMakeLists.txt
│ └── getTestData.cpp
└── z-help
├── AngleSolver.txt
└── solvePNP
装甲板识别使用基于检测目标特征的OpenCV传统方法,实现检测识别的中心思想是找出图像中所有敌方颜色灯条,并使用找出的灯条一一拟合并筛选装甲板。
主要步骤分为:图像预处理、灯条检测、装甲板匹配、装甲板数字识别及最终的目标装甲板选择。
-
图像预处理
为检测灯条,需要进行颜色提取。颜色提取基本思路有BGR、HSV、通道相减法。
因为读取的是彩色图,直方图均衡化需要在HSV空间做,同时开操作 (去除一些噪点),闭操作 (连接一些连通域)。 -
灯条检测
灯条检测主要是先对预处理后的二值图找轮廓(findContours),
使用得到的旋转矩形(RotatedRect)构造灯条。 -
装甲板匹配
分析装甲板特征可知,装甲板由两个长度相等互相平行的侧面灯条构成。 我们对检测到的灯条进行两两匹配,解算出中心点,得到灯条在相机面四个角点的坐标(ImagePoints),同时以枪管中心为原点、装甲板长宽构造世界坐标系(ObjectPoints),方便代入PNP解算。
角度解算部分使用了两种模型解算枪管直指向目标装甲板所需旋转的yaw和pitch角。
上下板之间的通信逻辑,主要由我们自定的通信协议体现:
协议共有16个字节,包括帧头占用的1字节,校验位需要的1字节,数据位的12个字节,以及两个字节的标志位。可以满足上位机与主控板之间的通信需求,且尽量精简了数据包体量以提高传输速度。
- OpenCV库安装及配置
- 使用systemback进行Linux系统移植 3.使用xml文件对相机参数进行调参
- 丰富的调试接口及数据可视化
代码配备了多个调试用函数,能将代码运行效果及计算参数通过图片或终端实时显示,便于代码调试优化。
- 卡尔曼滤波预测 预测算法不稳定,时而输出的pitch值为nan。调参的参数依然需要优化,准确率需进一步提升。 调参窗口仍待优化。 本套代码创建了许多未写的模块,在比赛的最后阶段有望更新。 目前使用inputVideo.set(cv::CAP_PROP_GAMMA, gamm)调相机参数使得相机读取较慢,所以先注释掉,仍待优化。