这是我本科阶段的最后一战,本来期待一个完美收官,但是意外频频,打的不尽如人意,但收获还是有的,故在此复盘,留下一些可供后来人参考的东西。
在此感谢我的队友CJC,WJJ,陪我一起熬夜!
笔者才疏学浅,如有错漏之处,还请告知于我及时更正,感激不尽!
我们组确定了做控制类的题目,也就是说会选择飞行器或另一道典型控制题,所以在硬件的准备上,我主要着重于控制板的设计与调试以及飞控的调试,后来因为听说飞行器题目限定使用德州仪器的芯片,所以后期的重心主要在另一道控制题目上,我的队伍准备了:
4块板子统一了接口,可以用防反接的端子线互连
我的队友负责驱动代码的维护,确保每个模块都可以成功驱动(OLED,蜂鸣器,舵机,步进电机,直流电机,陀螺仪,串口,ADC,DAC,IIC,SPI)
反思:
拿到题目,在注意到飞行器题目需要SD卡后果断放弃(我的图像处理板没有画SD卡),开始准备 H题-电磁曲射炮。
我把整个工作分为以下几个部分
以下详细介绍各部分的分析与落实情况:
(1)电磁炮及其驱动:
电磁炮通过在网上搜索资料有了初步的理解,在了解了射程的要求后,我们认为单级线圈就可以满足题目要求的出射速度(事实上也的确如此),遂开始绕制线圈,开始使用电源组的漆包线绕制线圈,漆包线很细,导致线圈内阻很大,在使用电源箱测试时,短路电流也上不去(约7A@60V,等效内阻8.6Ω,可以说是相当大了),反复的测试还导致线圈发热脱胶(这不就是电热丝?),后来到电机维修的店里买了粗的漆包线,绕制了约150匝,线圈内阻就很小了。
【完整参数:约150匝,漆包线直径1.25mm,电阻约20mΩ】
内阻问题解决,电流可以上去了,但是通过计算可以看到,理论短路电流已经达到了3000A@60V,如此大的电流电源箱如何招架?就算存在,热功率也达到了180kW,这是不现实的,何况我们需要的是瞬时放电,所以大电容是再好不过的选择了,由于要求可控,需要一个开关来控制电容对线圈放电回路,我们找了一个空气开关来临时实现(在后期替换为MOS管,毕竟发射需要电控),经过测试,使用螺丝/铁钉作为炮弹时,绕制的线圈炮可以达到要求,(因为发射时炮弹获得的动能大致是固定的,动能E=1/2mv^2,只有质量m小一些,才能获得较大的速度v,当然,质量太小的物体在飞行时受到气流影响较为明显,主要表现为弹道发飘,落点不固定,因此需要在质量m与速度v之间做取舍)。
为确保精度,炮台使用了步进电机(航向与俯仰,共两个步进,使用16细分),步进电机驱动代码由大二队友负责,为了实现炮台两周的角度闭环,使用定时器充当了一个模拟编码器,对输入步进驱动器的脉冲进行计数,只要步进电机不丢相,根据脉冲数就可以确定步进电机当前的角度。
(2)视觉部分(寻找靶标)
使用了自制的摄像头板,刷写了micropython的固件,所以可以使用OpenMV的IDE进行编程,寻找靶标的逻辑比较简单:先找红色色块的区域,在色块附近区域使用霍夫变换的方法找指定半径范围内的圆,此算法相比于全图像霍夫变换,效率奇高(78fps),ov7725在不做任何处理的情况下,也就78fps左右以至于我都误以为帧率刷新的代码写错了。后来担心由于光照原因导致色块识别出错,改成了灰度图直接霍夫变换找圆,只不过对ROI做了一个固定的限制(上下端部分不要),测试帧率在60fps左右。最后,使用串口以115200的波特率将圆形圆心的坐标发出,同时带有固定帧头帧尾校验和无圆心的特殊标志位,并且为方便调试,识别到靶标时,亮红色LED作为提示。全部代码实现后,实测帧率40-50fps左右,满足要求。
(3)炮台控制
炮台航向的控制非常简单,不再做过多叙述,在此详细介绍炮台俯仰的控制(俯仰角控制炮弹的垂直出射角)。
首先,根据高中物理可知,在理想情况下(无空气阻力,炮弹出射动能恒定,出射点与着弹点在同一水平处),45°出射时射程最远。具体公式我在比赛的时候推导过(但是现在找不到了),炮口在45°时,无论上抬还是下抬,着弹点都会向出射点靠近。但是要注意一点,很少有人的出射点是和地面水平的,也就是在炮弹发射之后,在达到与出射点同一水平高度时,还将继续飞行一段时间。
通过计算,考虑出射点高于实际着弹点情况下,在机械结构本身产生误差角δθ时,高射方式(大于45°出射)比低射方式(小于45°出射)产生的误差δx要小,但是由于我们炮台机械装置的局限,迫不得已采用了低射方式,不过在后续实测中,这点误差无关紧要。
在炮台控制中,射程主要和线圈的初始放电电压(电容电压)、炮弹形状材质、线圈匝数、炮弹在炮膛中的位置和出射角有关,前4个变量都可以被控制成常量,所以只需要控制出射角这一变量即可改变射程。出射角与射程的函数关系非常重要,由于公式推导复杂,我们采用直接的实测数据来拟合出这一函数关系。拟合的方式采用分段折线拟合,(多项式拟合在最后被实践证明为最不靠谱的拟合方式)。
(4)论文撰写
论文撰写部分完全交给了组内大一学弟负责。
反思:
在这个环节我犯了不少错误,也反映在这个过程中,我没有做好一个合格的领导者。以前我习惯单打独斗,软硬件都是自己来,这次比赛还是没有适应过来,虽然我主要做控制算法和视觉算法工作,但还是想每个部分都插一手,搞得其他两个队员很不满意,总感觉我在否定他们的工作。
此外,我自身没有形成比较权威的领导力也是一大问题,队里大二的队员本身实力较强,在写步进驱动代码的时候有很多自己的想法,经常以“我觉得没必要”驳回我的建议,当时考虑到队伍情绪问题没有做过多干涉,结果在后期写控制算法的时候才尝到恶果,这位兄弟的变量名取的模棱两可,他自己调用完全没问题,我在衔接的时候晕头转向。因此,我的建议是,在团队合作中,多沟通,及时消除所有拒绝合作的苗头;对于不好的编程习惯,一定要尽早杜绝。在代码交接的部分,一定要规范命名,多写注释!
在比赛过程中,我一开始在调一个激光跟随的发挥部分,做好之后发现我们的基础功能还没实现(此时已经过去大半天),才开始调基础功能,后来时间仓促,这个发挥部分也没有用得上。可以说白白浪费了许多时间。后来使用调参器改造成遥控,加上了预测弹道和着弹点的界面,感觉在界面花了太多时间,虽然最后这个部分得到了评委的肯定,但是如果用这个时间去打磨我们的基础部分,效果会更好。所以,做比赛还是应该按部就班,不要好高骛远。
在基础部分中,要求键盘给定距离和角度,当时图方便,航向角步进3°,射程步进5cm,(最后也没有改动)。比赛现场评委指定了20°位置,航向角的初始值为0°,我们的设置只能到18°或21°,导致总是打偏。
此外,没想到用来判断落点的所谓高速相机,竟然是评委的眼睛!(笑),然后是通过一个沙盘来判断落点。我现在才意识到沙盘的高度相当于缩短了我在上文图片中标出的ΔH,而且由于我们采用的是低射方式,距离越近,误差就越明显!我们在自己标定的时候,都是直接在瓷砖地面标定的(也有在厚的瑜伽垫标定的,这样就很逼近赛场情况了),2cm的沙盘,最大可以产生6cm的射程误差,我也总算理解了为什么比赛时落点总是比自己实测的时候短一点了。(很气)
主要看了前几年的真题,在Multisim仿真了一下,也把部分电路在洞洞板上搭了一下,发现有源滤波的截止频率计算比较复杂,理论计算、仿真结果,bode图分析以及实物实测出来的参数竟然都各不一样。最后决定:如果遇到滤波,直接采用无源滤波的方案,幅值小就用运放放大。这部分准备较为充分。
准备了士力架,不吃午饭以省下午餐时间。
拿到题目不久,已经有了方案:
比赛的时候不知为何,我的滤波器突然失效,队友的反向比例放大始终没有增益,就卡在这个问题直到比赛结束,大家都很绝望……
这个问题的出现是真的是没想到,感觉这就是“不可抗力”吧。
比赛结束后,我的队友都比较沮丧(我也是),这世间最难过的事不是“做不到”,而是“本可以”。
诚然,比赛的成功是对参赛者能力的肯定,比赛的失利却绝不是对参赛者能力的否定,做学问需要不卑不亢,十年磨剑才是做学术的正确态度。谨记:功不唐捐,玉汝于成!