做了好久自动化打大神符,等比赛结束之后写一篇长博客把过程和代码放出来
时间线
比赛结束了
还有因为刚开始用CSDN写博客,所以格式排版很bug所以希望大家 将就看
南部赛区比赛终于结束了,很遗憾本大人的队伍还是搞不过老司机们(毕竟一年级新生),而且因为某些”前戏“没有准备好,所以最后开发的大神符系统也没能使用,所以在此分享一下目前为止(实际也就认真做了几天成果,队长知道肯定不会很开心的)。
基本的设想架构:我方采用树莓派+摄像头实现图像处理部分,然后通过运算得出结果(密码串中的第n个数字在九宫格的m位置,m的取值范围为1 -9 )通过树莓派的UART传送到步兵车的接收系统,然后步兵车receive到树莓派传输回来的指令之后根据经验法移动到m位置处(假设初始步兵的发射装置:准星指向8位置,注意此处说的是九宫格的8位置),经验法就是我们在比赛之前,先对我们的步兵车进行一波训练:利用arudio通过设置不同的向上方和左方移动的时间,来使你的步兵车的准星能够准确的移动到目标位置,然后给从8移动到1-9的位置的这一套固定流程设置一个代号,这个代号可以随便设置,只要不重复即可,比如说从8位置移动到1位置的代号是‘q’,那我们当前密码串要射击的位置正好是九宫格中的1位置(左上角),那我们UART发送一个‘q’字符过去,步兵车接收到这个信号之后,按照预测的流程进行移动保证能够打中目标区域,该过程结束之后,我们在让发射装置回到原本的8位置(为什么要回到初始位置之后我会进行一下交代,这是出于节约时间的目的,毕竟我们的打击时间只有1.5s)。
大致的思路已经介绍完了,相信大家通过我足够冗长的描述已经差不多能够get到我的点了,下面我们进入算法部分,
首先是树莓派部分:此处主要是调用UART发送和接收指令的部分:
代码:
以上部分只有一个发送信号的功能,调用的函数主题就是我们的图像处理代码:首先说明一下,2017年DJI的robomaster比赛大神符系统中密码串的显示为标准的LED数字显示,这个东西非常无比好训练直接opencv中调用一个knn的库,在此之前搞一个训练集resize一下大小完全可以解决,对于九宫格中的数字,其使用的是minist字体集(本人亲测,在其视频流中截取图片时,我使用svm模型训练minist字体库,训练样本为5w,在minist自带的测试样本中正确率为98%,实际的预测过程应用到大神符的识别当中平均可以达到九宫格中九个数字只预测错一个),话不多说,作为一个粗糙的工程师先上一下代码,我相信聪明的大家很容易可以看懂我的代码:同时提示所用的代码是python搭载opencv库实现的,要问原因的话只是因为在树莓派上运行python相比c语言来说容易并且舒服很多。
1)SVM训练部分
# decoding:utf-8
import os
import cv2
import numpy as np
import codecs
from cv2.ml import VAR_ORDERED
import cPickle
import gzip
def vectorized_result(j):
e = np.zeros((10, 1))
e[j] = 1.0
return e
def load_data():
mnist = gzip.open(os.path.join('data', 'mnist.pkl.gz'), 'rb')
training_data, classification_data, test_data = cPickle.load(mnist)
mnist.close()
return training_data, classification_data, test_data
def wrap_data():
tr_d, va_d, te_d = load_data()
# print type(tr_d), type(va_d), type(te_d)
train