RoboMaster2021桂林电子科技大学Evolution视觉框架开源

概述:

本人为桂林电子科技大学Evolution战队视觉组成员,在2021赛季负责视觉代码框架的维护以及能量机关预判部分的编写。
2021赛季我队在南部分区赛以小组第一出线,在16进8中成功晋级,进入南部十强。在技术交流中小组赛以小组第二出线,淘汰赛中于败者组进入全国八强,8进4中惜败止步八强。
我队视觉起步时间较晚,19年第一年在机器人上应用视觉。本赛季视觉组前期按照功能分配任务,完成了装甲板识别,角度解算及预判,能量机关识别,能量机关预判,识别特定ID等功能。后期以兵种分配调试,实现了英雄自瞄远程吊射前哨站,无人机远程吊射哨兵,哨兵远程狙击吊射,哨兵不击打工程等功能。这些也都在2021赛季赛场上有了不同程度的体现。
我们的视觉开发相比于强队来说还不够成熟,在对场地的适应性这方面做的实为欠缺。

框架结构

├─include									//包含路径
├─build										//生成路径
├─log										//日志文件
├─Src
│  │  main.cpp								//主函数(拉流,创建线程)
│  │      
│  ├─angle
│  │  │  angleFactory.cpp					//角度解算服务
│  │  │  angleFactory.h
│  │  │  
│  │  ├─CoordinateSolver
│  │  │      ArmorCoordinateSolver.cpp		//装甲板解算
│  │  │      ArmorCoordinateSolver.h
│  │  │      BuffCoordinateSolver.cpp		//神符解算
│  │  │      BuffCoordinateSolver.h
│  │  │      
│  │  ├─KalmanPredict
│  │  │	KalmanPredict.cpp
│  │  │	KalmanPredict.h
│  │  │ 
│  │  └─PNP
│  │          PNPSolver.cpp					//PNP解算
│  │          PNPSolver.h
│  ├─armor
│  │  │  armorDistinguish.cpp				//装甲板识别
│  │  │  armorDistinguish.h
│  │  │  
│  │  └─bpPredict
│  │       net.cpp
│  │       net.h
│  │      
│  ├─buff
│  │      buffDistinguish.cpp				//能量机关识别
│  │      buffDistinguish.h
│  │      buffTest.cpp
│  │      buffTest.h
│  │      
│  ├─camera
│  │  │  modifyCamera.cpp					//相机设置工具类
│  │  │  modifyCamera.h
│  │  │  streamRetrieve.cpp					//相机拉流
│  │  │  streamRetrieve.h
│  │  │  
│  │  └─calibration
│  │          cameraCalibration.cpp
│  │          cameraCalibration.h
│  │      
│  ├─decisionLevel
│  │      decisionLevel.cpp					//决策层
│  │      decisionLevel.h
│  │      
│  ├─serial
│  │      CRC.h								//CRC工具
│  │      serial.cpp						//串口
│  │      serial.h
│  │      
│  └─tool
│          autoSaveSample.cpp				//自动保存机器学习样本
│          autoSaveSample.h
│          Conf.h							//配置文件
│          fileOperation.cpp				//文件操作辅助类
│          fileOperation.h
│          PointUtil.h						//常用操作工具类
│          RMDefine.h						//常用定义
│          RMLOG.h							//日志服务
│          systemChoose.h
│          
├─Tools                                 //工具文件夹
│  │  autoPull.sh                       //自动代码更新脚本
│  │  dog.sh                            //进程守护脚本
│  │  Baldr.sh                         //强制退出代码脚本
│  └─SVM                                //SVM训练代码
├─trainData                             //机器学习训练结果
│  │  
│  ├─armor                              //装甲板样本
│  ├─buff                               //能量机关样本
│  └─circle                             //能量机关圆心样本
├─visionData
│  │  armorData.yml                     //装甲板尺寸数据
│  │  armorPara.yml                     //装甲板识别参数
│  │  buffPara.yml                      //能量机关识别参数
│  │  cameraConfigurationData.yml       //不同识别模式下的相机参数
│  │  codeSet.yml                       //代码设置
│  │  installData.yml                   //相机安装参数
│  │  
│  ├─AVISave                            //相机录制的视频
│  ├─cameraCaliData
│  │  │  serialNumber.txt
│  │  │  标定棋盘图.jpg
│  │  │  
│  │  └─caliResults                     //相机标定结果
│  └─imgSave                            //相机拍的照片

解析

项目解析详见github仓库:代码传送门

效果展示

全国技术交流

总结

本队视觉方面还有很多的不足之处,希望能与各个参赛队伍多进行技术交流,一起提高队伍水平。

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
以下是一个C++实现的机器人混战模拟程序,利用了面向对象的多态编程方法: ``` #include <iostream> #include <string> #include <cstdlib> #include <ctime> using namespace std; // 机器人基类 class Robot { public: Robot(string n, int h, int a, int b) : name(n), health(h), ammo(a), attack(b) {} virtual void attackRobot(Robot& r) { int damage = rand() % attack + 1; // 计算攻击造成的伤害值 cout << name << " attacks " << r.name << " and deals " << damage << " damage." << endl; r.health -= damage; ammo--; } virtual void receiveAttack(int damage) { cout << name << " is attacked and suffers " << damage << " damage." << endl; health -= damage; } virtual void showStatus() { cout << name << " (" << health << " health, " << ammo << " ammo, " << attack << " attack)" << endl; } protected: string name; int health; int ammo; int attack; }; // 英雄机器人类 class HeroRobot : public Robot { public: HeroRobot(string n) : Robot(n, 100, 10, 20) {} }; // 步兵机器人类 class InfantryRobot : public Robot { public: InfantryRobot(string n) : Robot(n, 100, 30, 5) {} }; // 哨兵机器人类 class SentryRobot : public Robot { public: SentryRobot(string n) : Robot(n, 100, 20, 10) {} }; // 侦查机器人类 class ScoutRobot : public Robot { public: ScoutRobot(string n) : Robot(n, 100, 15, 15) {} }; // 巡逻机器人类 class PatrolRobot : public Robot { public: PatrolRobot(string n) : Robot(n, 100, 25, 8) {} }; int main() { srand(time(0)); // 初始化随机数生成器 // 创建5个不同类型的机器人 HeroRobot hero("Hero"); InfantryRobot infantry("Infantry"); SentryRobot sentry("Sentry"); ScoutRobot scout("Scout"); PatrolRobot patrol("Patrol"); // 输出机器人信息 cout << "Initial robot status:" << endl; hero.showStatus(); infantry.showStatus(); sentry.showStatus(); scout.showStatus(); patrol.showStatus(); // 让机器人互相攻击至少1次 cout << endl << "Robot battle starts:" << endl; for (int i = 0; i < 5; i++) { Robot* attacker; Robot* receiver; // 随机选择攻击者和受攻击者 int a = rand() % 5; int b = rand() % 5; while (b == a) { b = rand() % 5; } switch (a) { case 0: attacker = &hero; break; case 1: attacker = &infantry; break; case 2: attacker = &sentry; break; case 3: attacker = &scout; break; case 4: attacker = &patrol; break; } switch (b) { case 0: receiver = &hero; break; case 1: receiver = &infantry; break; case 2: receiver = &sentry; break; case 3: receiver = &scout; break; case 4: receiver = &patrol; break; } attacker->attackRobot(*receiver); if (receiver->health <= 0) { cout << receiver->name << " is destroyed!" << endl; } receiver->attackRobot(*attacker); if (attacker->health <= 0) { cout << attacker->name << " is destroyed!" << endl; } } // 输出机器人信息 cout << endl << "Final robot status:" << endl; hero.showStatus(); infantry.showStatus(); sentry.showStatus(); scout.showStatus(); patrol.showStatus(); return 0; } ``` 以上程序定义了一个Robot基类和5个派生类,每个派生类对应一个机器人类型,它们分别实现了攻击和受攻击的行为。程序随机选择两个机器人进行攻击,直到每个机器人都至少攻击了一次。最后输出每个机器人的最终状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

freezing?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值