Bootstrap

RoboMaster机甲大师——视觉组——总结、未来期望与比赛经验分享

RoboMaster机甲大师——视觉组——总结与未来期望
FOR THE SIGMA
FOR THE GTINDER
FOR THE ROBOMASTER

入坑指南

各兵种需要的视觉:
步兵-每年必备的,需要自瞄算法,以供机器人精准打击敌方装甲板,同时也需要能量机关瞄准算法,以供机器人有效打击大小符能量机关,在此基础上也需要电控或是视觉看看谁或者移动预测的
英雄-每年必备的,需要自瞄算法,以供机器人精准打击敌方装甲板,因为有个42mm大炮口,移动预测所以弹道需要单独做测试,
工程-没上过,之前都是电控利用激光测距取弹药箱(有没有其他学校的老哥分享一下啊,嘿嘿嘿)
哨兵-每年必备,相当于py轴反过来的步兵云台,需要自瞄算法,以供机器人精准打击敌方装甲板,同时因为是两个枪口,所以对自动化决策需要优化已实现动态抉择自动追踪打击
无人机-云台调到稳都不需要啥自瞄,只需要在操作界面画瞄准标识即可,东北大学法老之鹰的天降正义了解一下
飞镖-不会
雷达站-直接工业相机交叉火力覆盖,需要设计反导算法,以供拦截敌方飞镖,具体操作类似于类似于加强版的移动预测(考虑到的变量会更多),但是对工业相机要求很高,不,应该说是高速运动相机,雷达站还需要搭配目标识别并将场地信息传递给各作战单位

关于minipc:
其实就是每台机器人的上位机,运行我们设计的自瞄算法,将算法运行后得到的数据反馈给下位机32开发板,告诉下位机新的坐标在哪里,下位机便会控制机器人云台转动相应的角度攻击(上位机是minipc下位机是死它马32开发板

计算平台的选型与感想

关于调车:
调车的时候就是拿着显示屏(我一般用的便携式显示屏,自带电池,直接把显示屏插上就行了,当然也可以试试远程控制TeamViewer,只要你接受得了一点延迟,在测试ICRA车时还是需要,不然不限速的摩擦轮突突突起来,谁被打中谁知道),鼠标,键盘(鼠标和键盘推荐无线蓝牙那种,特耐用,又方便,而且不贵)这三件套连接机器人上的小电脑,然后坐在地上调车。调车过程要时刻注意电池电量不然代码可能就没了。
顺便推荐一下我自己用的

Wimaxit M1561C

关于linux下的东西:
大多是人接触到的都是win系统居多,但是因为轮运行效果与算法效率不得不提一下linux系统,没接触过的也无所谓,先来第一步,安装这个系统,然后下个火狐啥的自己先玩一天就行了,玩转命令行是第一步,在接下来就是安装各种环境配置,这些直接CSDN百度就行了,然后我们需要学到cmake或是make指令与list编写,这是编译程序,当算法完成也测试完后,就可以上shell脚本了,这里的脚本是指开机自启动脚本,因为比赛是否你肯定不可能花时间插个显示屏键盘啥的,在比赛过程中我们还要考虑到要是程序突然退出了怎么办或是突然因为撞击啥的掉线了咋办,这个是否我们需要用到守护进程,监测对应进程,若发现退出则直接进入文件夹内再进行打开就行了,这样你就“关”不了这个程序了

当然这里需要提到的是git的运用,这东西只需要会用就行了,好处就是共同协作,坏处就是参与者高低不平的话得与没用,但是即便如何我还是很赞同要学会如何git

Ubuntu16.04指令集(基础)+问题集
ubuntu开机自启动脚本分析

关于OpenCV
一个开源图形处理库,类似的有hacon,OpenGL啥的,图形处理是按照流程步骤来的,建议先画流程图后编程,你要知道你每一步都是要干啥,模块化,把库的对应函数啃熟就知道怎么用了,因为感觉很多功能都是由最基本的数学逻辑知识来实现的,因此多注重底层代码逻辑很重要

关于相机
相机是机器人的眼睛,而不同相机的功能大相径庭,因此了解一部相机如何使用,有什么功能是非常重要的。(例如普通usb相机与工业相机之间区别)

一般但你购买一个公司的产品后会有技术支持,而购买工业相机后,会用到相应的SDK,这个SDK可以理解为公司给你做的库,给你二次开发用的,里面包括很多函数用来解决不同的情况,比如画面太亮影响装甲板的识别,需要通过调用函数调低相机的曝光,这些都会在SDK附带的技术文档里有(有的甚至直接代码注释好的)

相机的帧率越高,则获取图的速度越快,得到的图的效果就越好,比如曝光调得太高,可能帧率就会下降,拍出来的视频看起来一卡一卡的(这一点用USB相机的都知道的)

焦距的改变导致PNP测距算法的计算结果不准确,重新标定即可

摄像头的选型与应用

关于串口通信
可以理解为上位机在运行自瞄程序时识别后需要把这些数据传给下位机32开发板,而32开发板在接收后解算得到云台转动角度等并使机器人云台转到相应角度,当然也不止这些,如果比赛用到键盘还可以传输相应的信息,例如敌方是红色还是蓝色,当前模式是自瞄还是反陀螺,这些都是可以实现的
视觉这边主要做好传输函数send就行了
下面是代码演示部分

//视觉部分
void SerialPort::TransformData(const VisionData &data)
{
   int i = data.pitch_angle.f*100;
   int j = data.yaw_angle.f*100;
   int k = data.dis.f*100;
   
   
    //3-头部
    Tdata[0] = 0xA5; //帧头起始位
    Tdata[1] = CmdID1;  //01
	Append_CRC8_Check_Sum(Tdata, 3); //帧头CRC校验  CE
    //12-数据-float
    if(i>=0)
    {
    Tdata[3] = i/1000;  //pitch值第四位
    Tdata[4] = (i%1000)/100;  //pitch值第三位(小数位)
    Tdata[5] = (i%1000)%100/10;  //pitch值第二位
    Tdata[6] = (i%1000)%100%10;  //pitch值第一位(若是两位整数的话) 41或40
    }
    else
    {
    Tdata[3] = -i/1000;
    Tdata[4] = (-i%1000)/100;
    Tdata[5] = (-i%1000)%100/10;
    Tdata[6] = (-i%1000)%100%10;
    }
    
    if(j>=0)
    {
    Tdata[7] = j/1000;  //Y
    Tdata[8] = (j%1000)/100;
    Tdata[9] = (j%1000)%100/10; 
    Tdata[10] = (j%1000)%100%10; 
    }
    else
    {
    Tdata[7] = -j/1000; //Y
    Tdata[8] = (-j%1000)/100;
    Tdata[9] = (-j%1000)%100/10; 
    Tdata[10] = (-j%1000)%100%10; 
    }

    Tdata[11] = k/1000;  //距离
    Tdata[12] = (k%1000)/100;
    Tdata[13] = (k%1000)%100/10; 
    Tdata[14] = (k%1000)%100%10;
    //5-数据-标志位
    Tdata[15] = data.ismiddle; //瞄准中央否
	Tdata[16] = data.isFindTarget; //识别到目标装甲板否
    Tdata[17] = data.isfindDafu; //识别到神符装甲板否
    Tdata[18] = 0x00; //预留位
    Tdata[19] = data.nearFace; //贴脸
    if(i>=0)
    {
        Tdata[20] = 0 ;
    }
    else
    {
        Tdata[20] = 1 ;
    }

    if(j>=0)
    {
        Tdata[21] = 0 ; //为0正数
    }
    else
    {
        Tdata[21] = 1; //为1负数
    }
    
    //2-尾部
	Append_CRC16_Check_Sum(Tdata, 24); //占用2格 0~23
}

视觉主要通过定好传递的位数好使电控那边调整,我们自己定的是24位,电控只需要捕获头帧即可验证即可,我们传输的主要为三个主要参数p轴角度,y轴角度,d距离,还有两个确定是否识别到,识别到为1,否则为零

//电控部分
void USART1_IRQHandler(void)
{
    if(huart1.Instance->SR & UART_FLAG_RXNE)//接收到数据
    {
        __HAL_UART_CLEAR_PEFLAG(&huart1);
    }
    else if(USART1->SR & UART_FLAG_IDLE)
    {
        static uint16_t this_time_rx_len = 0;

        __HAL_UART_CLEAR_PEFLAG(&huart1);

       
		__HAL_DMA_DISABLE(&hdma_usart1_rx);

		this_time_rx_len = RX_BUF_NUM - hdma_usart1_rx.Instance->NDTR;

		hdma_usart1_rx.Instance->NDTR = RX_BUF_NUM;

		DMA1_Stream1->CR &= ~(DMA_SxCR_CT);

		__HAL_DMA_ENABLE(&hdma_usart1_rx);

		if(this_time_rx_len == 15)
		{
			convert_uart(&cache[0], &RecvData[0]);
		}
    }
}

总结:

2020 赛季:

自瞄基本实现,克制陀螺仍有缺陷,枪口稳定是解决办法之一,摄像头容易受光干扰得提前做好曝光值处理,用动态阈值即可(即自适应化),电控与视觉通信完成,移动预测实现一半,能量机关识别用视频已经可以实现,但是实物还没测试,哨兵决策上考虑用行为树,通过pnp解算的距离来优先考虑机器人识别

2020年遇到的问题:

1.消极情绪
原因:因为报账、疫情、加工周期过长等情况,导致进度被耽搁,所以在备赛过程中有很多人坚持不想去直接退队,后期也是有部分消极抱怨的情绪
解决方案:不要让消极情绪出现在实验室,积极的气氛和适量的鸡血是团队中不可缺少的东西,遇到各种困难,说明团队正在思考、进步

2.队员懒散,影响整个队的进度
原因:第一年参赛,队员可能因为疫情原因或是其他(例如课程或是研究中心培训啥的)耽误啥的,大一忙,大二不会,大三少数几个,造成后期基本视觉组就一两个在干活
解决方案:按照赛季初订的规则,选择合适的执法者,给予警告,甚至劝退,如果有悔改之心,队长出面给予机会,一般能让队员重生,但屡教不改者出于对队伍负责的态度,可以杀鸡儆猴。

3.队员不愿意投入时间
原因:大一培训,大二自觉性不够,大三能力够,但是人少而且有的要忙自己的比赛,大四基本都是考研居多
解决方案:大一基本不招,招也是直接考核方式;大二与大三正常招,但是需要明确有时间的,不然还是尽早劝退,大二大三培训主要靠布置任务以及主动学习为主

4.和队内搭档或者重要负责人有矛盾
原因:电控与视觉在联调过程中有几率会出现这种问题的
解决方案:该吵就吵,把握好发泄程度和尺度即可,吵完了合适时间吃个饭商量下接下来怎么向前走(对于动刀子或是直接人身攻击的还是得处罚一下)

5.视觉培训问题与分工
原因:分工很明确,有四台机子配搭四个相机用,按照原来的构想一正带两预,兵种也分配好的,但是最后四个组进度都很低,最后只能靠组长解决问题,培训也分享很多资料了,有的也手把手教了但是还是那个样
解决方案:建议队内直接以兵种小组负责人来弄,提前规划好负责的,兵种负责人发现谁不干活的就直接叼,屡教不改者轻则记过,重则直接劝退割队籍,培训事情OpenCV识别物体培训就行了,但是其他的还是自己主动学习来获取(我在北海那边就是重零开始,一步一步来,谁培训我了?),新生遇到问题别直接就说不会,上网百度啊,骚扰其他战队的参赛队员啊,怕个锤子,难道对方会随着网线来ban你吗?-_-

6.队员断层问题
原因:每个战队都有,有考研的有工作的有不想打的,顺其自然(黑魂3影响,灭了在重新来就行了,当然除非不作为或是学校不给搞,否则全灭还是很困难的)
解决方案:摈弃传统的一年一招制度,开放全年任何时候都可以加入实验室,但实验室对加入同学有严格的培训验收流程(会的,愿意干活的就招进来)

未来展望

新生培训(主动学习,多骚扰其他战队队员,多逛CSDN、B站、RM论坛)
1.养成主动找资料,多看资料的习惯(RM论坛,战队之间的交流,CSDN,B站,其他)
2.多与其他学校交流,多看资料,多看各种算法总结各自优势,多与其他学校交流学习
3.新队员首先学习opencv,之后通过分配一些具体的小任务例如识别队徽,单目测距等来锻炼新队员的编程能力。学习git的使用,研究各参赛队伍的开源代码构思自己的视觉方案。

比赛经验

上电之前一定要检查
在minipc安装在车上上电之前一定要问清楚电控那边焊接线是否焊接对没,若上电出现黑屏则很有可能是被烧了,好一点就换个三极管或是保险,坏情况可能就是minipc直接报废

工业相机都一样
工业相机哪家都一样,重要看性价比(符合比赛需求的即可,这里的需求是每年RM规则报告时队员需要去看的)与技术支持,推荐一下迈德威视或是海康威视,其他的诸如基恩士啥的没用过。
工业相机选型不懂的点这里
minipc选型不懂的点这里
如果以上还不懂的直接问客户与对应公司的技术支持人员,他们会帮你选型的,只要你提出需求即可

雷达算法与其他的考虑
雷达算法很多的都是采用速度学习训练的,这次似乎更多学校在考虑用深度学习完成自瞄与能量击打,但是个人建议自瞄上传统视觉就行了,深度可以当着课题研究,能量机关基本都是深度学习啥的场地,可以适当考虑传统识别加mask

我自己用的工具分享
印象笔记、xmind、processon、notepad++、向日葵

最后总结,引用上海交通大学的话————突然之间从啥都没有,就到0啥都有了,突破是需要积累的,没有积累别妄想突破啥(听说他们2019年之前三年内都没有视觉)

分享一下

视觉开源的(这个考虑到有的学校用USB相机,所以用DJI开源的RM文件替换了,能用) 提取码: eu4c

电控对应通信文件提取码: 7a4t

视觉用到的通信文件(整套)提取码: 8siy

培训文件(太弗拉不堪了,献丑了)提取码: 9yyd

;