那些花儿,好怀念,那些时光,好珍贵。
时间过得是有些快了,上研已经两个多月了,可是我的心偶尔还是会回到西邮,回到229,回到那个让我拼命学习的日日夜夜。不禁想起了“飞思卡尔”智能车比赛,一段刻苦铭心的经历,这次比赛可以说是大学生活中让我成长最快的经历。此刻两个队友的名字映射到了我的脑海,梅仔,肖坤,两个可爱的队友,虽然当时闹过别扭,有些不愉快,可是“不打不相识啊!”
梅仔,我们的coder,参加过新卓越的培训,经过老范的指点,编程方面经验丰厚。会使用多种编程语言,从后面利用C#编写上位机,观察小车动态采集回来的数据以及动态的调节车子的PID参数,在小车的调试中,启到了很大的作用。然而,我们的梅仔,有些执拗和偏执,也正是因为这,我们倆闹得有些不愉快。接下来,该介绍我们的PCB制作者,肖坤,河南周口籍。这里我之所以要提到籍贯,是为了说明河南小伙的几个优点。第一,做事细心,有耐心,会一直做下去;第二,特别能忍耐,并调节我和梅仔之间的关系。可以这样说,如果没有他的话,我和梅仔之间必然会闹掰。第三,性格好,肖坤被他们班的女生叫作“坤姐”。当然,这些都是我后来毕业和他们一起吃饭的时候,听到的。
合作(cooperation)真的不是那么容易,在共同完成一个任务时,各司其责是完全不够的,我们必须有足够的交叉,让我们的思想融汇贯通。最好的方式也是最通常的方式,就是坐在一起讨论。我们当时的分工是这样的,因梅仔对编码很在行,所以梅仔主要负责K60的编码工作和调试小车。肖坤负责调试激光传感器、绘制电路板和焊接元器件。尤其是调试传感器,后来基本上都是他负责,感觉那激光传感器就只听他的话似得。虽然我偶尔也动动,但心中总是带着担心,深怕手上的静电把激光弄坏了。而我呢,两边都参加,看程序做算法,虽然我没有经过专业的培训,但是我的逻辑能力还不错,找错误是一把好手。同时,在硬件电路的设计和调试上,也能帮忙分析,对发现错误解决问题,总是屡试不爽。
好啦,现在步入正题,进入问题讨论环节。做“飞思卡尔”智能车中困扰我很久的两大问题,在此也不完全能够提出正解,如果你也对这个问题感兴趣,可以发表你的看法。
第一个问题描述:我们采用的是一对三的方式接收反射回来的激光信号,发送的激光信号是经过PWM(180KHz)调制的,传感器的布局左边[9 8 7; 6 5 4; 3 2 1 ],右边[1 2 3; 4 5 6; 7 8 9 ],最终这些激光点都是整齐的打在小车前50-60cm的白色KT板上。因为接收管采用了复用方式,为了判断出来是哪个点对应的激光照射到黑线上面,我们采用分时的方式,分三次点亮所有激光。例如第一次点亮左边[9 6 3]和右边[3 6 9],第二次点亮左边[8 5 2]和右边[2 5 8],第三次点亮左边[7 4 1]和右边[1 4 7],这样就可以采集到所有的点信息。在这里,我不去讨论传感器的具体布局和前瞻远近的问题,假设其处于合适的状态。
我和梅仔的第一个争论,采样频率问题。梅仔的观点是,尽可能的使采样时间短,减小小车状态调节的时间延迟,缩短调节周期,达到对小车稳定平滑的控制。在增加了采样频率后,出现了这样的现象,激光的亮度明显变暗。至于激光为什么会变暗,这个不难理解,单个激光的点亮时间明显缩短,因而观察到的结果就是整个激光的亮度衰减。刚开始调车的时候,效果还不错,紧接着,出现了一些让人不可思议的现象,小车在一些平常行走很正常的地方,却出现了奇怪的行为,如突然左拐或右拐。对此,梅仔刚开始的解释是激光没有对好焦点,然后就让肖坤去调节。可是后来,怎么调节都不启作用,总会有接收不到的点。这个时候,就不得不深入的思考一下了。于是我提出这样的观点——如果我们把器件的寿命考虑进去的话,当器件还是新的时候,无论是器件的响应时间还是稳定性,都是处于最佳状态。刚开始使用这种方式采集数据的时候,发射管的功率和接收管的接收能力都还很不错,可是使用一段时间后,发射管的发射功率明显衰减,导致接收管接收误判,将白板判断为黑板,从而在小车的控制策略上面就会出现大的误操作。后来发现,当我们减小小车的前瞻的时,激光的接收能力明显增强,这在一定程度上验证了我的观点。
我和梅仔的第二个争论,采集数据的量化问题。梅仔对编码有相当的经验,编写出来的代码让人看了相当舒服,有大家的风范。采集数据后,要找到黑线所在的位置,梅仔所采用的思路是从内侧激光点往外扫描,当找到黑线后就停止,然后进行量化。并且,我们的量化方式采用的是倍增点量化(将已知点的中间点也量化),至少初期的时候,我和他都还津津乐道到这个肯定能够增加控制精度,可是却为后面的调试埋下了一大隐患。首先,我们讨论一下量化程序,从理论上面来讲,这种量化方式是完全没有问题的,也不会出现什么弊端。可是在实际的处理问题当中,会出现很多异常的现象,例如,所采集的数据中,多于两点的数据照射到黑线上,这样在量化的过程中,就会忽略掉一些点,从而使得系统的稳定性能大大下降。在所有激光工作正常的情况下,这样量化有一个优点,我们可以完全忽略掉赛场外的背景,而不至于受到赛道外界环境的干扰。(ps:官方当时指出,我们不限定赛道外的背景颜色,主要由主办方来决定,赛前两个礼拜公布)
对此,我想提出一种量化解决方案,既能够很好纠正错误情况的产生,同时又能够不受赛道外部背景影响。方案如下:因为目前大部分的芯片都不存在着容量不足的情况,所以我们可以把传感器采集数据可能出现的情况(包括非正常情况,如某个管工作不正常)按照二进制进行量化,根据实际情况对应量化值,当控制器采集到数据后,通过查表的方式获取采样值的量化值。这个方案的要点是怎样进行量化编码,量化值如何取,在此不作进一步分析。
再说说倍增点量化,之所以有这样的考虑,是因为官方规定的黑线宽度是25mm,而我们的激光点间距小于25mm,所以会出现两点同时落在黑线上的情况。因此,我们决定将中间的一个虚点也纳入到其中,来增加调节的精细度,使控制精准。后来的实践证明,这种方式的量化,给系统的稳定性带来了很大的隐患。因为,稳定状态极不容易达到或保持,跟随系统的误差总是存在,小车一直不停的调节,从而使得车体产生震荡,运行不稳定。刚开始,我们还没有意识到这个问题,通过各种滤波函数来处理出现的问题,可是效果都不理想。后来在一次偶然的尝试过程中,去掉这些虚点,小车的状态一下子上了一个档次,当时真是把我乐坏了。总结一下,出现上述错误主要有两点原因,一是激光点间距本身就不一致,量化时就存在误差;二是智能小车在运行过程中,允许的误差越小,小车跑的就越保守,放不开步子。而事实上,小车在道路上跑动的时候是允许有一定的误差的,只要不超过这个限度,都是合理的。我和梅仔都太过于理想化,忽略了实际情况,才导致后来种种曲折道路。
为青春奋斗不息,我的战友,你们现在还好吗?
写着写着,就这么长了,第二个问题待续。。。