▲ 越野车车模全貌
聊之前,我们先回顾一下第十五届的AI电磁组,那是第一届AI电磁,引入AI是为了引入新的学习方法,新的工程训练手段,让学生从之前的从底层到模块到小车一点一点按模块拼凑还原出整个小车的开发过程变成基于数据的整体设计思路,从设计开始就区别于之前的模块化思路,让学自动控制这部分学生也接触到AI的开发方式,是高校教育的一种探究,让这部分学生对AI开发工具链以及开发手段进行熟悉,不管他们今后是从事科研,学术研究,还是开发,或者读研,都是一种提前学习,将来都可能都会用到,对他们都有帮助。
第十五届的AI电磁组采用的C车模,主控限定使用NXP公司的MCU,并且由NXP和逐飞的工程师给大家准备了学习资料和参考教程。AI组别考察的重点也有所变化,这个组别的基础工作,板级应用,单片机底层驱动程序,基本AI模型及开发方法都会直接给出参考,底层不用学生来做,学生的工作包括AI工具链的应用,学习,使用,AI模型学习和设计,传感器设计,驱动电路设计。
▲ 头被锯断的AI小车
今年AI电磁越野组换成了室外越野组,采用了更难控制的L车模,主控限定使用英飞凌公司的MCU,同时并不强制规定必须使用AI模型训练的方法,也可以采用传统方法,只是强制限定了车模长度为40CM。用这样的方法来逼迫大家用AI的手段对车模进行训练,关于究竟哪种方法好后面再展开讲,这里先讨论如果要搭建AI模型,应该怎么做。
之前的推文里“英飞凌TC系列MCU开源库汇总”也提到过,AI电磁组建议使用算力更强的TC364、TC377芯片,主频更高,资源更丰富,第十五届由逐飞和NXP一起给出了一套逐飞硬件平台+单片机底层库+软件模型+AI模型训练手段和方法,参加这个组的学生在这个基础上去学习刚才提到的AI相关知识和基于数据的设计思路去解决控制的问题。
今年虽然该组别更换了限定芯片,但逐飞依然和英飞凌公司一起为大家带来了一套同样模式的参考资料,今天先整体针对规则聊一聊小车的设计和逐飞的验证过程,模型部署及使用的参考教程预计很快就可以整理好并开放给大家免费使用了。
1、双电机变为单电机,分离后轮双驱变为机械差速四驱。从最终比赛的情况和技术报告我们可以看得出,第十五届的AI神车其实都通过后轮双驱的差速辅助了转向,相当于偷偷增加了20cm+的前瞻,用模型输出的转向PWM信号和传统转向控制相结合的方式实现了高速AI小车,其实这算是去年规则中的一个BUG,所以今年变更为单电机的L车,没有后轮主动差速,规避了这个规则BUG。
2、禁止改动后轮联动转向,L车首次引入大赛是在第十四届的越野组,然后第一届引入就产生了将转向改为前后轮联动转向的创意,改装详情逐飞在智能车制作论坛发了帖子,可通过以下链接跳转了解,第十五届因为赛题变少而取消了这个组,所以今年是第二届使用L车模,但今年禁止了前后轮联动转向,其实这一点依然是在补偷前瞻的BUG,要是可以改,就意味着有30cm+的前瞻了。
3、L车机械结构复杂,车模控制精度更低了,去年的C车模在干净的赛道上运行,车模也更小巧,结构简单,控制更有效,今年的L车属于经典RC模型车中的四驱越野车,车体更大,结构复杂,机械差速实现四驱,动力分配不可控,因为结构复杂导致控制精度也降低,同时室外越野摩擦力不可控,很容易打滑,对AI来说数据集需要更丰富。
4、L车舵机是卧式长短连杆的典型RC遥控车结构,不像C车的立式对称安装,而且L车的舵机安装方式不太容易改装,因为限制了车长40cm,所以舵机放前面的改装会用掉车长限制的余量,得不偿失,发挥空间比较小。除非大改为双驱,限制动力输出到前轮,把舵机安装方式改了,增大转角,增加响应速度等方法,这些想法就需要同学们自己去验证了。
5、L车舵机的默认安装位置相比C车离车头更远,这样也带来了一个好处,对车头电感的干扰几乎没有了,所以几乎不必对电感信号进行滤波,逐飞方案验证的样车就使用的原始数据输入模型。
▲ 不超过40CM的车身总长度
前面的传感器主要用于训练数据采集,比赛时需要拆下来
综合来看,今年的变化都意味着第十六届的AI电磁更难了,而且没留BUG给大家钻空子。大家应该不难注意到,样车采用的逐飞以前的电感安装板,只有25cm宽,但今年赛题限制是不超过40cm宽,也就意味着可以做的更宽来更好的锁住中线而不会像样车这样很容易丢线,这个优化空间就交个同学们去做了。但整体来看,算是给这个组别的同学提出了新的挑战。
关于L车机械调校方面的经验分享,可以参考逐飞写的这篇推文:
https://mp.weixin.qq.com/s/-47rnisDkk1YELmJYgcXbA
以及“【视频】L车改装性能测试–By 逐飞科技”这篇帖子:
http://www.znczz.com/forum.php?mod=viewthread&tid=283958&extra=
但需要注意今年禁止改为前后轮联动转向了,所以请只参考其他部分即可。关于主控芯片变更带来的模型部署变化将在下一期推文中分享给大家,同时也会发帖分享到英飞凌生态圈,方便英飞凌进行资料汇总。
▲ 封死固定后轮不能够转动
方案验证样车的后轮之前改过联动转向,原装配件找不到了,所以这里用胶封死来固定住后轮不能转动。
接下来给大家介绍本次方案验证的情况。本次验证方案用样车采用TC364作为主控,以此为控制中心设计了扩展板,得益于这块主控的资源丰富,我们在一块扩展板上就实现了编写程序让小车自主寻迹运行进行数据采集,将采集到的数据送入网络训练,得出模型,然后将模型加载到同一块TC364主控中,实现对模型车舵机的控制。
▲ 主控 TC364
本次测试车模使用L车模,根据室外越野组的任务,需要对电磁信号进行采集并完成对电机、舵机的控制以实现循迹越野竞速,同时因为AI模型的加入,从而对单片机的算力和综合资源有一定的需求,如果自己后期再加入一些其他复杂的程序,代码会更大,所以我们推荐选用英飞凌的TC3xx系列(TC364、TC377)来运算AI程序以及车模控制相关的程序。
▲ 硬件平台全貌
TC364具有300M的主频,双核心,内置4MB的flash,内置672kb RAM。
TC377具有300M的主频,三核心,内置6MB的flash,内置1136kb RAM。
这两款单片机性能和资源都够用,这样使用起来不会那么局限。所用到的资源及用途列举如下:
16路AD:3-5路用于前期寻迹,模拟真实在赛道上运行的状态,便于车身周围电感采集数据,其余AD预留定位车身位置用,本次测试依旧只用了7组数据采集;
1个GPT12: 用于采集迷你编码器的数据;
1个spi:用于驱动2寸ips液晶屏;
1个串口:用于将采集的数据通过无线模块发送给PC;
2路PWM:用于控制一个电机;
1路PWM;用于控制舵机;
其他外围硬件:运放采用OPA4377运放模块(参赛需自制),驱动采用逐飞DRV8701E单电机驱动模块(参赛需自制),主控板采用逐飞TC264、TC364、TC377兼容的AI电磁拓展学习板(参赛需自制)。编码器采用逐飞迷你编码器,液晶采用逐飞2寸液晶屏,无线模块采用逐飞无线透传模块,电感采用普通的6*8工字电感,用于数据采集的一共有7路电感(5横电感,2竖电感),电感分布如下图:
▲ 车模前端电感分布
1、使用传统的控制方法将车模跑起来,这样可以采集车模在正常运行时的数据。
2、使用传统的控制方法+随机干扰控制,其中随机引入误差控制方向时的数据不采集,仅仅在正常的控制时采集数据,这样可以采集到车模在偏离赛道的纠正数据。
3、将车模固定在一块很薄的硬纸板上,手动转动硬纸板,以获得更多姿态下的电感和舵机数据,为了保证手动摆动过程中车模的高度不变,我们选择了一个很薄的光滑的底板将车模固定在上面,然后移动底板来采集不同姿态下的数据。
▲ 串口转无线模块发送到PC机接收端
今年使用L车,所以没有遇到舵机干扰电感数据的情况,所以没有对电感数据进行滤波,直接使用的原始数据,如果同学们在测试时发现电感数据有较多毛刺,下图是去年C车模使用传统方式寻迹,然后采集的靠近舵机的数据,再使用excel对电感数据绘制的波形图,数据图形如下图所示:
然而同样的条件下,采集到的其他电感的数据就稳定很多,如下图所示:
从上面两张图对比可以看出来,距离舵机近的电感干扰较大。远离舵机的电感几乎没有什么干扰,波形也很平滑。
如果今年有同学遇到了这样的情况,可以先找到干扰源,然后考虑将电感放置在距离干扰源较远一点的位置,这样可以大大的降低干扰。如果干扰源和布局存在矛盾的情况,在不改变电感布局的情况下,为了提高数据的可靠性,可以尝试对电感的数据进行滤波(从之前的波形图可以看出,干扰数据大多都是属于跳变的,因此推荐滤波方法为:如果采集到的电感值如果相较于上次变化过大则舍弃,以滤除干扰数据),相较于没有滤波的状态数据确实要好了许多,不过最好的办法还是将电感移动到距离干扰源较远的位置或消除干扰源,这样可以获得更加真实的数据。滤波之后的波形如下:
在新的硬件平台,新的车模,新的环境下,从头采集数据,将上诉3种方法采集的数据都送入网络训练模型,再将模型加载到主控MCU,最终仍然能完成沿着赛道运行的任务,当然也不是一次成功,期间遇到了不少问题,而且这个工作的难点在于不能直观的定位出问题出在哪,解决起来也很麻烦,下面附上相关视频:
通过前瞻电感循迹进行数据采集(电感循迹方法可参考“电磁及摄像头(总钻风)寻迹算法浅析–逐飞科技”这篇推文的电磁寻迹部分),数据采集对顺向和逆向都进行了采集:
▲ AI越野组养车数据采集演示视频 逆时针
▲ AI越野组养车数据采集演示视频 顺时针
通过加扰动和人工旋转进行数据采集的视频又忘了录,后面做完才发现杆子已经被锯断了。
前几次训练结果都没有完成一整圈,失败视频举例,这个时候可以看到前排电感的数据线已经移除,仅靠后排数据输入到模型,再由模型输出的结果来控制舵机。
▲ 前几次训练的结果|AI车模冲出赛道-1
▲ 前几次训练的结果|AI车模冲出赛道-2
训练多次后L车第一次AI循迹完成一圈运行视频,这个时候可以看到前排电感的数据线已经移除,仅靠后排数据输入到模型,再由模型输出的结果来控制舵机。
▲ 训练多次后L车模完成的一周的运行
多次调试训练后锯掉前瞻电感完成AI循迹视频,这个时候可以看到已经锯掉了前排电感,仅靠后排数据输入到模型,再由模型输出的结果来控制舵机。
▲ 将前排传感器去除之后完成赛道运行
大家从AI模型输出舵机控制信号的视频中可以看出,稳定性并不太好,首先我们并没有花大量的精力采集更多情况下的数据,其次也没花太多时间对小车进行充分的调试。
但我们想到一个优化点,同学们可以去尝试。可以将采集到的同一份电感数据用作两用,第一是用来送入模型得出舵机控制数据,第二是用传统算法得出一个舵机控制数据,将这两个控制数据进行一定的融合,应该可以在一定程度上优化控制,减少震荡。具体怎么融合就需要同学们自己去思考了,一定有比较好的方法能做出比较好的效果。
去年就有很多关于AI引入的讨论,卓老师在公众号上发过相关推文和讨论,广大的参赛者都有自己的看法,但用在智能车竞赛上目前这种模式虽然是第二年了,但依然会有比较多的问题,比如需要使用传统控制方法将车模驱动起来,然后才能采集到有参考意义的数据进行模型的训练。不具备一定调试经验的新手很难做好第一步。
当模型训练完成之后,如果有问题,很难查找具体的问题在哪里,不像传统算法那样,可以分析数据一步一步推导出具体的问题在哪个环节,使用AI模型后,如果有问题,则大多数时候只能重新采集数据进行训练。本次训练结果一共采集了3次数据,重新训练了大概有4次模型后才达到的效果。同时同学们调试过程中还有一些小问题需要克服,比如车模更换过电感、新做了一辆车、更换过赛道电源、更换场地,之前训练的模型可能就不能使用了,需要重新训练。
▲ 车模上的驱动电路板
还有一个问题也始终困扰着我,AI模型输出控制信号的跑法其实也需要前瞻,因为车模的数据输入和控制信号输出始终都需要时间差,不能提前感知到更远的信号是不可能预测前方的路况的,但如果可以有手段可以感知到前方的信号,那通过传统方法已然可以规划出好的路径了,所以AI训练能达到的效果,传统算法也能实现。
当然最终我们还是希望广大参赛者摸索出更多更好的方法将AI应用真正的用到比赛准备的过程中,AI的引入本是为了减少人力调参,我记得去年9月份我们到卓老师办公室讨论这个话题时,卓老师表达的原意应该是:为了引入新的学习方法,新的工程训练手段,让学自动控制这部分学生也接触到AI的开发方式,是教育的一种探究,让这部分学生对AI开发工具链以及开发手段进行熟悉,学习基于数据的设计思路去解决控制的问题。毫无疑问,这是一个好的设想,所以更希望这个好的设想能寻找到一个更好的落地方式。大家如果有更好的建议欢迎留言讨论。
▲ 电机上的Mini编码器的安装方法
同样,越野组的验证样车用于证明以上推荐和结论均经过逐飞样车验证的,同时也是对我们设想的基础方案以及逐飞核心板、传感器产品的验证。也许对新手入门能有一点帮助,对知识应用做一个简单的梳理,提供一个基础的参考。样车上的学习用PCB板,样车应用程序,均不公开,不出售,不赠送,只分享思路。这些内容并不复杂,是完全符合大学生能力定位的,所以根据分享的思路做自己的小车,编写自己的代码都是可以实现的,希望每个参赛的同学都能知其然并知其所以然,不偷懒,不走捷径,理解到了,自己做了,知识才是自己的。
我们的样车一定不是最优方案,更好的方法、算法等都需要车友们去思考和发现,这样你才能成为一名合格的工程师,将来才能有一技之长。所谓的工程实践活动,就是需要你去实践,根据比赛要求设计小车,亲手制作,才会有收获.
最后,祝愿车友们制作出满意的小车,最终能在竞赛中取得自己满意的成绩!
特别提醒:参赛所需主控板、驱动板均需要参赛同学自行设计制作,逐飞所销售的模块仅供参考学习,不能直接用于参赛。
▲ 外表狂野的L车模