饶淙元

来自iCenter Wiki
2018年9月8日 (六) 05:13Rcy17讨论 | 贡献的版本

跳转至: 导航搜索

我是饶淙元,来自无72班。

Day 1

今天首次接触到了Aelos机器人,打开包装看见一个完整的机器人的时候内心非常激动——还好不用自己组装:D

今天的学习中,我比对了Aelos三种PC端软件,特点总结如下:

  • 简洁版可以很方便地指明遥控器与对应动作地关系,并顺便给出动作地重复次数等。但是在写动作代码时似乎并不支持IF、WHILE等,也就是说没有办法写条件句(或者是我没有找到,如果有谁找到了烦请告知一声),因此我不能想到写出好的逻辑的方法。(尤其是ENDIF都可以识别为关键字,IF居然不识别)
  • 教育版主要采用流程图的方式,并且支持条件判断,有完备逻辑系统,但是似乎它只支持由框图到代码的单向转换,并不能直接改动代码反作用框图,所以只能采用拖动框图的模式编程,对鼠标依赖性很高。
  • 专业版完全采用函数式编程完成指令操控,我初步尝试了一下感觉和写C手感较近,但是我们的机器人似乎并不支持专业版的IDE,所以这种方法并不可行。

今天听老师说用简洁版的软件已经足以完成课程内容,联想到发的遥控器,我突然想到一个关键问题:似乎老师一直没有提到、也一直没有人问到,最后的踢足球是遥控的还是自动的?我原本以为这和去年的电设一样最终机器人自动踢球比赛,但是从种种迹象来看,似乎更像是要做一个遥控比赛,因为如果是遥控比赛的话,确实无须用到条件判断,所有的if都将由人脑完成。但如果是这样的话,似乎我们用到的功能又太少,感觉并不像是这么简单。明天一定要问问这个问题。

写wiki时我突然想到,今天我基本可以确定这些软件底层是用C/C++写的,因为我用//和/**/可以写注释,并且课上老师也有提到这个机器人底层是AURDUINO,那么这就意味着C的运算符它大概也是支持的,那么我似乎可以充份利用?:运算符完成一系列的和条件句效果类似的操作(至少在这个体系下,我们目前所学到的输出仅有机器人的十六个舵机而已,这就大大简化了逻辑输出的需求),明天可以试试能不能使用?:运算符。

今天见识了很多机器人编程的内容,相比小时候见到的那些数个“关节”的机器人来说,今天所接触的内容相当具有趣味性和吸引力,希望将来的课程中我也会继续保持状态,坚定不移地完成各项任务。


Day 2

今天照着指导正式开始了动作编写,所幸乐聚已经完成了相当智能的封装,机器人的动作编写采用“关键帧”模式,我们不必把动作的每个细节解释清楚,只需要给出两个关键的节点动作的舵机状态,关键帧之间会自动完成缓冲,使得各个舵机同步运作。当然,这个缓冲过程可能不像我们想的那么完美,这就需要新增一些关键帧作为过渡动作,这种感觉与用软件做图时画曲线非常的相似。今天一个下午的时间我们以此完成了以下几个动作的编写。

  1. 金鸡独立
    我们首先完成了一个金鸡独立的动作,不同于直观感受那样收起一条腿就能完成,我们还必须考虑重心的问题。我在一步到位的尝试失败后,采用两个关键帧完成任务:首先用一帧的来倾斜身体,转移重心,然后第二帧顺势将非重心脚抬起,然后定住,这就完成了一个金鸡独立的动作。当然机器人比人强的一点在于稳住之后真的是非常稳,就这金鸡独立的稳定性我自认做不到。
  2. 大鹏展翅
    大鹏展翅在我试图直接将一条腿翘起失败后,突然意识到这个动作可以在金鸡独立的基础上完成,金鸡独立稳住后将抬起的腿伸到身后,并且身体前倾,然后用一个循环控制手臂上下摆动即可。总的来说这个任务也不难完成,只是被讲师吐槽前倾倾角看不出来并且手臂摆动过于机械,调整了很久才达到要求,不过看到多数人的摆臂第一反应都是只动舵机2和舵机10后我就放心了,这很工科男。
  3. 俯卧撑
    到了俯卧撑,难度开始飙升,和我做俯卧撑的难点相反,对我来说俯卧撑的上下动作是最难的,而对机器人来说这些两帧循环可以做到的事情非常容易,难点却是在于趴下后如何起身的问题。对此,我从实际出发,采用我个人做完俯卧撑后的起身方法:先将左腿收回,再将重心落在左脚上顺势而起。这个方法起身没有障碍,但是在得到了“创新”的夸奖后被打上了“不美观”的标签,最终我去仿照了样例程序的方法,先将两腿叉开,两手向内侧靠拢同时收腿,将重心聚在腹部并且顺势半蹲,然后站起。当然,对于“美观”二字我还是不是很懂,在我看来这种起身方法关键是做到了很好的对称性。
  4. 自编舞蹈
    最后一个任务是自己播放一段音乐并且跳舞,但是舞蹈完全自己编写,所以这个要做好的话可能需要时间挺长的,今天短短的三个小时时间里并不能完全写好。我选择了《小苹果》当BGM,在剩余的时间里完成了前奏时的动作原地踏步走,不得不说就连这个看似简单的动作做起来也不是那么顺手,我模仿金鸡独立时的分解法才分解成功,尽管如此衔接时还有摔倒的风险,不知道明天会给多少时间继续完成这个任务,希望能把我记忆里老师教的那一套《小苹果》动作尽可能地复原一下。

写完今日wiki,突然感觉今天不是在上机器人编程实践课程,而是在上形体课程一样:D。当然我也知道,这样的课程交叉性的一些内容也是大势所趋,包括我们最终3V3的遥控足球赛实际上也需要我们有一定的足球策略以及遥控技术。


Day 3

今天的内容为完成自编舞蹈,根据要求我们大概需要编一段一分半左右的舞蹈连续表演两次,总时间大概三分钟。不得不说,根据昨天编写一个动作调试半个多小时的节奏来说,一天三个小时的时间可能只能写出十几秒钟的内容,但是既然老师下了这样的要求,那就说明一定是有完成的办法的,否则这个任务就没有意义。抱着这样的心态,我想到了前天安装软件时U盘里附带的那部分基础动作,比如我们昨天完成的俯卧撑时也参考了官方给出的动作,如果这些动作库里的东西作为舞蹈的一部分,那么在断时间内完成舞蹈动作的编写就不是不可能了。

我依然选用的昨天已经定好的《小苹果》作为BGM,开始进行“舞蹈排练”。尽管库里已经给出了一些动作,但是这些是零散、单纯的动作,它们的节律、时长与某首具体的音乐并不相符,某些参数也与我的机器人有所差异(舵机零点不同),因此我需要调整动作、改变间隔、增减关键帧,使得这些动作与《小苹果》的节奏基本一致,当然我也深知自己没有什么音乐天赋,机器人的舞蹈可能看上去没什么美感,但我尽可能做到我的动作与音乐歌词的分句相符,我在写程序时用注释标明了歌词、时间、动作,以便在连贯排练时能够更好的反馈出节奏问题所在。为此,我将翻滚、拥抱、欢呼等动作库里的东西以及自己写的原地踏步、抱苹果、伸手等动作进行结合,经过反复调试调整节奏,使得最终能有一套连贯的动作和音乐基本契合。

在我自己调整动作时,我也注意观察了下动作库里给出的动作,因为这些动作可能都经过多次演练、不断升级而成,我相信我从中一定能有所收获。果然,在逐步调试每一帧后,我发现这些动作特点非常鲜明:这些东西的关键帧非常多,并且频繁切换速度,达到了动作的连贯性以及近人性,尤其是将动作分解得更为细微后,可以让本来一帧也可以做到的动作用三四帧来分解,出现明显的加速减速过程,这样使得动作更为稳定。反观我自己写的动作,虽然经过数次角度调整后基本能做到连贯不摔倒,但是每个动作飞速完成后机器人往往会全身一颤,让人看上去就觉得动作很悬,这大概就是因为速度和帧数没有做到位的缘故。

最终的比赛是一场遥控足球赛,今天已经开始铺设场地,并且让我们上场试了试,我用一个简单的踢球动作进行踢球尝试,不料一脚踢出球沿斜线滚走不说,机器人自己还往前摔倒了,这表明原来的动作平衡性还是有所不足,看似已经完成了踢球动作,但实际上最终一脚踢出后自己重心却没有落实,这样的动作无法面对最终的比赛,在接下来的日子里我需要重写踢球动作,使得机器人踢球后仍能移动到目标位置,达到“亢龙有悔”的神效。


Day 4

今天我们先给了一小段时间编写踢球的动作,然后讲解了教育版的用法以及传感器的使用。

我们组内进行分工后,我负责的是试图写出一个右前快走和左前快走,希望机器人在这个状态下可以走出一个近似的圆形轨迹,以求在球场上达到很好的拐弯效果。为了做出这个效果,我在原有的向前快走的基础上进行调试,主要调整行走时的脚步动作来达到收脚后朝向改变的效果。仔细观察自带的拐弯动作,可以发现这些拐弯主要还是出脚时控制好脚的方向,真正拐弯发生在最后收脚的时候。循着这个思路,我试图先写出一个左前行进的动作,我将快走时机器人的脚踝处舵机和大腿处舵机进行细致调整。

这个过程并不容易,主要是自带的快走动作如果逐帧调试,会发现这些动作并不都是平衡动作,换言之我在调试动作库里的快走时机器人会失去重心摔倒。但是可以注意到,库里的动作调节速度是很频繁的,并且某些动作试图把速度调到100,通过速度来弥补临时的重心不稳。这样做对于调试来说负担很大,但是在行进时看上去并没有什么问题。经过无数次调节,我终于调好了一个看上去没有问题的左前快走,并且在地面上进行测试,然后尴尬的一幕发生了:下达左前快走指令后,机器人没有像我想象的那样向左前画个逆时针方向的圆,而是向右前画了个顺时针的圆!并且在一次循环后机器人的偏转角度基本是理想的45°,所以我顺势把这个原计划的左前快走改名为右前快走。在做完这个事情后,我试图把程序中的A和B反转、C和D反转使得舵机角度左右对称过来,希望通过这样的方式直接完成左前快走,然而果然如同第一节课上老师所说那样,不同舵机零点不同,动作移植可能需要全部重新调参:右前快走的参数转移到左前快走后,机器人不但直行不拐弯,而且收脚时直接摔了一跤。

很快到了讲教育版软件的时候,和我第一天的印象一样,这是一个框图控制的程序,但是从授课内容中,我知道了更多之前没有注意到的细节,比如遥控器的调用方式等。操作方面我们完成的主要工作是对某几个传感器的使用,包括最初用地磁传感器来完成机器人定向移动、用火焰传感器和风扇完成自动灭火的动作。在这个过程中,我注意到这个程序所暴露出的一个不足之处:判断句语法似乎有所缺陷。比如之前就注意到的FOR只能给出具体数字,但今天看见的更麻烦的问题是IF的判断不能在判断符号右边写表达式。比如以下就是软件支持的和不支持的语法例子:

//以下为支持语法
INT A
A = 3
IF A > 3 THEN
//条件体
ENDIF
//以下为不支持语法
INT A
A = 3
INT B
B = 2
IF A >  3 + B THEN
//条件体
ENDIF

好消息是我发现教育版是可以不理会框图,直接对代码框进行编辑的!这就意味着教育版几乎可以当作专业版使用——除了不支持GOTO语句。这样做的后果是代码将无法通过软件的文件保存,但是可以自己另行写文档进行保存,每次烧程序时再将代码复制到代码框里,这样一来几乎就是C一般的码代码了,并且和专业版一样是支持函数式编程的,用JUMP可以调用不同的函数。这个软件不支持定义数组,并且变量只支持整型,但是对这个机器人的编程来说完全足够了。我想,通过灵活的程序编写,在最终的足球赛中我们可能能在软件层面取得一定的优势。


Day 5

今天开始全力投入足球动作编写当中。能够供我们使用的按键一共就那12个,大家可能都比较容易相当一些基础动作,但是想要取胜,在自认遥控技术不高的情况下,就必须从软件层面取得一定的优势。我认为,想要在软件上更胜一筹,可以考虑采用即时打断的连招方式。

首先,我们已经确定要写出可以沿圆形轨迹行走的“左前快走”“右前快走”,为了使得动作连贯性更强,我们选择用打断时操作,即按下对应按键后,机器人将会在一个循环里反复执行这个操作,直到接收到特定指令才会停止。最容易想到的办法就是写一个死循环,然后需要停止的时候按一下back强行让机器人恢复站立姿态。但是,这个办法绝不是一个好办法,至少不会是最佳办法,因为按下back后机器人会将速度调为一个极低的速度然后恢复站立姿态,这在紧张高节奏的足球赛中效率是非常低的。为此,我想到的一个办法是在这样的转弯快走状态下再按下转弯快走的键,让机器人收到指令后跳出循环,执行正常的快走收尾动作。然而这样做遇到的问题是程序中并没有BREAK指令,这对我们写程序造成了不小的麻烦。所幸,我昨天已经注意到,在教育版里是可以直接写代码的,采用函数式编程的话我可以将收尾动作独立写一个函数,然后在拐弯快走的动作里写一个死循环,再在接收到相应指令后跳转到收尾函数,这样就解决了这个问题。

但是采用这个方法实际上还不是最佳选择,我可以想到更好的设计,比如机器人右前方一定距离处是足球,我希望机器人可以右前快走跑过去然后顺势一脚踢出,这样的场面连贯高效,并且也和人们印象中的踢球场景非常相像。除了我举的这个例子之外,还有很多可以形成“连招”的例子,事实上我们能够想到非常非常多的踢球动作,但是只有12个按键,所以不可能一个动作对应一个按键(事实上,就算只是12个按键,要记下每个动作和按键的对应也不容易),为此我们可能需要采用很多游戏里的连招模式,比如先按“左前快走”,然后在机器人跑动的时候按下“左踢”,达到无缝衔接,机器人借着奔跑的架势和重心直接一脚踢出。但是要做到这一点并不容易,首先从编程实现难度来说,为了追求高效率,我们可能需要在任意两个动作之间都插入一个衔接动作来达到二连的效果,因为这个很难做到一个好的归一化处理。(更多内容此处暂且不提,毕竟wiki这东西双方都能看见嘛)

今天补充一点昨天的内容,昨天我注意到这个软件对于某些语法支持性很不好,但是今天我注意到如果我们将语法稍微改改其实就OK了,比如说以下两种情况:

//以下为不合法语法
INT A
A = 120
INT B
B = ID 5
IF A < B + 20 THEN
//条件体
ENDIF

//以下为合法语法
INT A
A=120
INT B
B = ID 5
INT C
C = B + 20
IF A < C THEN
//条件体
ENDIF

换言之,我只需要提前先把所需计算算完再写条件,就可以解决昨天我提出的问题,FOR循环同理。

在对这些语法近一步了解后,我更加确定教育版的代码框支持一套完全的逻辑体系,我今天开始写架构,为最后的足球赛动作整合做好了准备,并且准备好了一份代码规范以便队友合作开发,另外由于教育版代码框的代码无法保存,我们统一用notepad++进行编程,为此我写了一份针对这个程序代码的语言格式,效果如下图:

Aelos xml.png

这些内容我准备比赛结束后上传到GitLab。


Day 6

loading......


Day 7

loading......


Day 8

loading......