此篇博文并非技术分享,而是记一次艰难的比赛经历,可能也是大学接近尾声时最难忘的一次比赛。
4月12日,已经深夜,快要坚持不下去了,已经连续通宵了三天,身体出现了明显的不良状况,但距离工训赛省赛目前还有四天。
为什么时间这么紧张,需要通宵调试?因为我们频繁地更改方案,缺乏比赛经验,每个方案都在不停地试错,最终改回了之前的校赛方案,但是,再也回不去了……
工训赛从去年的12月份开始讨论方案,中间长时间在放假,项目进度停滞。新学期开学就疯狂赶进度,但是每天进展依旧缓慢。当其他组的小车跑得飞快时,我们还在缓慢循迹,但最终还是在校赛前一天调试完毕,完成了整个功能。校赛的大佬较多,我们的实力是靠后的,大多使用步进电机。我们既没有使用步进电机,连直流电机都没上编码器,更没调PID,包括驱动都是非常规的串口驱动,循迹用的车头反向,所以车身跑起来一抖一抖的。所有的特点综合起来使得我们的机器人处于一种极端的劣势:走得丑,放不准。在校赛十支队伍里面,应该是处于第八位或者第九位。
比完校赛,我们的机器人只抓取了三个物料放在粗加工区,由于四周有挡板的缘故,机械臂将车身掀起,导致机器人并未跑完全程。四个人都极其沮丧,准备收拾行李离开赛场,校赛10进3,肯定进不了。但事实是,第二天出成绩,比第四名多了零点几分,刚好卡线过校赛。
4月17号省赛,在此之前我们先换成了步进电机的方案。步进电机确实很稳,能及时刹车,能给机器人增加配重,重心较低。但可能是我们使用不当,步进电机的驱动DRV8825发热严重,使用时间过长时电机一段时间不运转,驱动失效,甚至有时会损坏单片机(一块单片机的channel引脚被损坏)。之后换成了闭环的步进电机驱动器模块,贴在步进电机上,节省空间,但琢磨了一下午,它并未如期转动,起初由于是电机的线序问题,但找了很长时间没有解决问题,无奈退货。最终选用TB6600电机驱动,基本不发热,驱动电流较大,但体积大,不好安装,多亏鬼才队友将驱动悬挂式安装,才塞在机器人的肚子中。可以说淘宝上的步进电机驱动被我们试了个遍,财库血空。
之前的灰度传感器也被换成了激光传感器,以为检测黑线很准,但事实是比灰度传感器还垃圾!!!检测同样一根黑线,输出的数值还在跳变。询问客服后,客服支招说斜着安装激光,我们试了一下,效果还可以,但另外一个依旧精度不够,怀疑是一个残次品,且漫反射激光传感器相互之间影响较大,我们最终放弃了该传感器。于是从淘宝购买了单路的,两路的灰度传感器,使用光敏巡线,效果还不错,由于没有安装位置,此种方案待定。在此我没有使用一个同学推荐的线性CCD,因为CCD安装位置较高,主要是看得远,能检测前方黑线的变化并做出及时的反应,用于寻直线有点大材小用了,并且CCD价格较为昂贵。
小车组装完毕后,开始跑轨迹,但步进电机的小车巡线并没有我们想象中的那么好。起初以为步进电机可以走直线,不会偏移,事实证明步进电机确实偏离较少,但是巡线回调的力度比不上直流电机,导致有时偏移黑线太多而偏离路线。步进电机启动时加速度不能过大,必须采用S型加速或者梯形加速,否则会造成失步,甚至无法启动。同时也不能实现立即反向,只能先减速停止再加速反向。步进电机的速度不能过快,跑不过直流电机,驱动有时也会偶尔出现问题。
前后折磨了十天左右,看到步进电机巡线并没有直流电机效果好(其实步进电机巡线反而更偏,不循线应该是最佳选择),最终在7号凌晨一点,我们毅然决定换回校赛的方案:直流电机。这也意味着,我们十天改成步进电机方案的努力,全部泡汤。
大概在八号左右,换回了以前的校赛方案,重新拆装,花了几个小时。直接用校赛的工程代码,可能是还原不出以前的小车的。于是我又花了一个通宵调试完代码,此时只是想单纯还原最初的方案,未使用编码器。最终在早晨7点,机器人可以跑完全程,虽然车身较歪且有点抖,但是基本是最初的效果,甚至比校赛的小车更快。
由于需要改进,之后小车又重新拆装,换了亚克力板。我不太想使用非常规的串口驱动,总是需要考虑许多问题,比如波特率较低时,串口给驱动模块发送的消息会不会被定时器中断或者外部中断给打断,造成数据丢失,电机不转的现象(因为之前遇到过,小车直接停止运动),干脆之间换成TB6612,使用PWM波驱动,就不需要考虑诸多问题了,但是这也意味着,底层的驱动代码全部需要重写,之后花了几个小时左右写完底层驱动。
驱动模块是在淘宝上购买的一块电路板,上面集成了两块TB6612芯片,还有一个拨动开关,晚上九点左右,另外一个队友调试PID时,不小心将这块驱动板和单片机放在一起,引脚相互接触造成短路,两块板子全废。进度又变成负数,信心打击巨大。还好有备用的TB6612芯片,连夜焊接,大概在凌晨一点,又开始重新调PID。调完一个电机后,效果还不错,响应时间较短,但我们此时并未测试剩下的三个电机,直接装车。凌晨三点左右,装车完毕。接着调试四个电机的PID,开始出现玄学,车子的轨迹越来越离谱。有时出现单个轮子很长时间不动的现象,我们知道是Kp值太小了,参考了平衡小车之家的PID参数,以及看了许多文章,也都没调好,前后花了大概一天一夜,但时间不多了,我们决定放弃PID调参,直接让小车下地,手动增减参数。后来考虑到四个电机的参数应该不同,所以我们每一个轮子都设置不同PID参数,后面效果好了一点点,我们就不愿过多花时间在调参上面了。也参考了上一届工训赛同样调PID的文章: PID:从入门到放弃
使用陀螺仪MPU6050,可以知道车身的偏角以及加速度,这里我们只使用了z轴的旋转角,利用陀螺仪寻找方向是一个不错的选择,采集的数据经过卡尔曼滤波发送给单片机,起初效果较好,后来陀螺仪的数据完全离谱,以为是陀螺仪本身的零飘或者受到磁场的干扰,我们最终认为,这块MPU6050已经损坏,又重新购买了其他三块陀螺仪。
开始利用陀螺仪转向,我们又遇到了一个新的问题:无法解决转向角为180°的情况。按常理说陀螺仪可以测360°的任何一个偏角,但我们的陀螺仪超过了180°就会出错,这个问题我们解决了一个晚上,最终放弃解决,节约时间。为了使用陀螺仪转向,后面想了一个办法:每转向一次,将角度重置为当前的偏角,因为我们测试发现当前角度与重置角度不超过180°陀螺仪才能正常工作,可实现180°转向。
在省赛的前两天,我们使用了未调好的PID,直接跑车,并且使用差速来回调车身,此时的效果比之前的反向回调好得太多,车身不抖。但是因为回调力度过小有时会巡出线外,又回到了当初步进电机的效果,不过直流电机可以任意加大回调力度,调试几次之后,小车大部分轨迹能正常巡线了。
此时又出现了一个新的问题,在半成品区后退巡线的时候车尾启动时永远会往右偏,我将它称为玄学问题,并将锅甩给了PID,解决了一天一夜,最后没办法,强行让车尾左偏。
因为“玄学问题”,个人差一点直接弃赛,每天都要收拾前一天的“烂摊子”,我们的进度天天是负数,前一天的问题解决不了,于是疯狂通宵。已经记不清通宵多少次了,大概十几次应该有,其中有三四天连续通宵。精神状态不好,整个人处于一种低迷的状态,吃完饭后不愿意去调车,一个人就去林子里崩溃。压力很大,每天都会遇到新的问题,调试不成功。而其他组的小车都跑得很快很准,我们依旧停留在最初的循迹,心理落差较大,也无法直面老师的目光,越来越麻木,只求不输的太难看就行。调试不成功,只能硬着头皮去调了,看了调了几百遍的代码就反感,又开始了无休止的通宵调试…
4月15日,我们将轨迹跑完,剩下的优化,想尝试openMV巡线,测量黑线与视野的偏角,但是本质和陀螺仪差不多。本来计划15日晚上将机械臂调试完毕,后面的时间全部用于openMV巡线了。单片机的六个串口被我们恰好使用完,已经记不清openMV使用的哪个串口,可能是思路不清晰,通信问题我们解决了很长时间。最终巡线有效果,但是有段时间又不太行了,测量的数据开始不准确,我们并没有多余的时间解决这个问题,最终放弃了openMV巡线。
4月16日去比赛场地报道,下午回学校接着调试,17号开始比赛。
既然小车可以跑完全程,剩下的就是定位的问题了,之前买的漫反射激光传感器还没派上用场,斜着装了四个激光传感器用来车头和车尾定位,想着效果应该会不错,但16号下午又出现了一个新的问题。同样的工程代码,每一次重启后运行都不一样,起初以为是硬件问题,可能是线接触不良,加固一下接线后依旧如此。我们观察到单片机周围有一个LED一段时间常亮,一段时间持续闪烁,可能问题与它有关,于是查找原理图,这个引脚是输出TB6612的方向信号的,代码上是隔一段时间就将它输出为高电平,它没有上拉和下拉,也不至于持续闪烁。后来改了一下代码,只输出一次高电平,小车就能正常行驶了。但第二次重启,问题复现。怀疑是单片机出现了问题,换了一块单片机,烧录同样的工程代码,依旧会出现LED持续闪烁的问题。
另外一个队友发现,挂在单片机上的ST-LINK在代码运行时也会持续闪烁,想着会不会与ST-LINK有关,于是将ST-LINK拔下,代码正常运行。罪魁祸首已找到:正版的ST-LINK。
浪费一个下午时间解决的问题竟与ST-LINK有关,好在后面激光定位比较准确,效果较好,仿佛看到了希望,每一次机械臂放置的环数也比以前高了许多,我们异常欣喜,进度可以加快了。
16号晚上11点,开始调试舵机。
17号凌晨1点,一个意外出现了。小车启动后行驶了一段距离不动了,冒出了一股轻烟。我迅速关闭电源,发现单片机上有一颗螺丝,应该时从机械臂上面掉下来的,造成了引脚短路。最可怕的事情发生了,在比赛的前9个小时单片机烧毁。换单片机也不方便,上面有大概60个引脚接着线,其中很大一部分引脚都是焊上去的,为了防止接触不良,早应该画个底板将引脚扩展出来。没办法只能硬着头皮上,紧接着开始了时长两个小时的“心脏移植手术”。四个人紧密配合,不停地警告自己不要慌张。两个小时后,“手术移植”完毕,换上了新的单片机,凌晨三点,接着调试机械臂,凌晨四点,调试完毕。一直到凌晨五点,还在优化轨迹和机械臂。最终在17号比赛之前,把初赛功能全部完成,机器人也会偶尔出现失误。
4月17日,体育馆比赛场地灯光太亮,导致我们的灰度传感器一进去就失效,并且摄像头也无法扫描出物料的颜色。侥幸过了省赛初赛,下午在社区里面效率较低,整个队伍都比较疲惫,在社区里小车的轨迹都未调试出来,到了晚上九点左右想直接放弃了,后来就真的放弃了,不再调试轨迹,机械臂也是定点直接调试。整个过程不了了之,无法实现决赛的功能。晚上十点半提交作品,第二天决赛。最后队友也真的提交了,尽管一点都没调试出来,自己在旁边昏昏睡去。
晚上回酒店,开始后悔,毕竟这是最后一个晚上了。于是打开电脑,开始云调车,另外一个队友在脑海里云调机械臂的角度。凌晨三点,关闭电脑,至此,不再更改。
最终结果是好的,但时至今日,我们均未能在赛场上看见我们的机器人跑完全程,只能吐槽主办方的赛制,选手的综合实力未能体现出来,赛制区分度太不明显。一路上我们总是在不断试错,频繁地更换方案,导致进度极其缓慢,归根究底还是自己考虑问题太复杂,经验不足,每增加一种新的传感器就会遇到一种新的“玄学问题”。比赛使人麻木,也让人崩溃。偷偷放几张图: