=====Day 6=====
<font size='1' color='brown'>loading......</font>
<font face = "kaiti">
明天就要开始试炼了,今天无疑是调整动作、做好一系列准备工作的最后机会了,已经到了临阵磨枪的时候,如果不把所有BUG解决掉,那么明天场上程序崩溃的话,无疑会对后天的比赛造成无穷大的压力。但不幸的是,在我不断的调试中,发现这款软件存在的BUG超出我的想象。 采用函数式编程,本身是比较容易的,逻辑简单,遇到需要分支的情况直接跳转即可,并且我上星期已经将这个程序支持的语法基本摸透了,一套完备的逻辑系统也有了,也就是说,目前除了缺乏一些常见的语法糖,函数没有办法传入参数之外,其他基本可以做到C语言早期能做到的事情。基于这样的机制,要做到动作之间的无缝衔接、强行打断、圆润过渡等是非常容易的。然而我今天突然发现,在一个函数中插入IF条件时,会发生奇怪的BUG,这种BUG的触发条件尚不明确,我的测试情况都是在某动作函数的FOR循环中加入了读取遥控器后根据遥控器的值进行跳转的JUMP函数,但是在我没有按下遥控器的时候它也会进行跳转。 为此,我不断控制变量进行DEBUG,最终发现一个残酷的事实:我只要在这种情况系加入一个IF句,就会出现BUG!也就是说,哪怕我只是写了如下的代码: <!--此处为日后写正文的位置--nowiki>IF 1==0 THENENDIF</nowiki>这样的代码在正常的编译器中会直接被优化掉,永远不会执行,可是在这个软件之下却会出现随机跳转,莫名其妙随机执行某个函数,完全无法使用。这个机器人底层是一个STM32F103系列的单片机,这块板不至于产生性能障碍导致不支持我所写的内容,并且我看了下生成的用于STM32运行的hex文件也不过五六KB而已。那么,排除掉硬件性能本身的问题之外,剩下的就只能是IDE本身的缺陷,将一些伪代码翻译为C代码时出现了BUG。当然有这样的BUG并不奇怪,毕竟我用的是教育版软件强行当专业版用,在这个版本里直接写代码可能算是开发者没有意料到的一个feature,因为本身这个软件是将框图转化为代码,而这个过程是用单函数写的,自然也就不会产生各种奇奇怪怪的问题。但是单函数写出来的效果和直接用简化版没有什么区别,我们实际上需要的依然是一个能支持突变式跳转的架构,那么在这个方法行不通的情况下这个想法只能被迫放弃。 不得不说,经过一周摸索,基本弄清了这个伪代码的函数式写法后,最终发现它内在BUG导致我的架构无法实现,这个结局是很让人沮丧的。但是,学了一年C/C++后,这是我首次面临这种情况,拿着一款软件的伪代码不断摸索语法、试图用C的思路写出更为复杂的代码、自行规定代码风格、写出简单的框架,这样的一个经历是让人难忘的,并且对于我加深对不同语言代码的理解有着重要的意义。 最后的时间我们将一些动作进行了微调,因为最初版本的动作在跨机器人后由于参数导致了失衡,为此我花了很长时间将一些动作进行优化,以及不必要的DELAY进行删除或缩短。其中花费时间最长的右踢和左踢,这两个动作是对称的用力射门动作,但是我的左踢有着从一个球门踢到另一个球门的优良效果,可是右踢却会在踢出去后摔倒。我不断调试最终优化了右踢,但也只是在摔倒方面优化了,射程却是减小了将近1/3。我想,射程和脚踢出时与地面的最近距离可能有很大关系,或者更确切地说,和踢球瞬间时脚的高度有关,而踢球脚的高度和整个从后往前的踢的过程中脚的最低高度是正相关的。原来摔倒是因为脚最低高度太低,狠狠地踢到了地面上导致摔倒,现在则太高,踢球时脚完全不擦地,所以无力,那么明天我的改进空间将在把脚的最低高度设成一个轻微擦地的程度,这样可能就能够在平衡性和射程之间找到一个好的平衡点。
</font>
----
=====Day 7=====