1,关于电轨和电磁的区别: 电轨和电磁传感器的形式都很想,都是物理前瞻,都是左右对称,但是电轨和电磁有着很大的区别。
1.1:首先就是视野宽度的问题:
电轨传感器只有在铝箔的上方才能读取到赛道信息。不在铝箔上的线圈都是瞎的。
电磁传感器,只要不是偏得特别厉害,每个电感都有值,离电磁线越远值越低,反之越高。可以这样说,电磁车在赛道上的偏差是连续的。
而相比于电轨车,如果就采用左右对称的两个线圈的话得出了的偏差肯定不连续。
因为电轨是由铝箔导航,而铝箔的宽度是10.5cm。中间有5mm的空隙。如果往一边移动小车的话,线圈的值会有一个先增大后减小的过程。
所以说,电轨采用左右两边两个对称线圈的方式肯定会导致,最后计算出来的偏差不连续。
这里会导致一些问题:因为电磁的传感器很小,可以看成一质点,并且偏差是连续的所以电磁组可以通过所有的电感值来判断车的位置。
电轨组只能通过判断某个线圈的值来判断位置,这样会会产生很多问题由于电轨偏差的不连续,铝箔宽度的有限。所以会给判断车体的位置带来很多的麻烦
2.2:关于电轨和电磁在传感器处理方面的区别。
电磁一般是通过差比和来计算出连续的偏差的。保证偏差随传感器的偏移来线性变化。
而电轨如果采用差比和的话,如果两个线圈相距比较远,当车左右移动的时候几乎只有一侧的变化值比较大。用差比和根本拟合不出连续的变化。
如果两个线圈相距比较近的话,随着车的移动一个传感器值增加,一个传感器的值减小。倒是能在一定的范围内拟合出连续的偏差。但是......有互感
所以能否拟合出电轨车的连续偏差来反应车身的当前位置成了智能车的关键。所以说,电轨车的精髓在于传感器的处理。
2,机械结构部分
说到机械结构不得不说一句在智能车界流传了很久的一句话“机械结构决定车的极限速度,程序决定你能否达到这个极限速度”
2.1,传感器前瞻,说说自己对前瞻的认识。电轨传感器属于物理前瞻。线圈都是置于车身前面。具体前瞻多出车身的长度一般都大于20cm。这次我们的车的
前瞻长度达到了28cm。我们之前尝试过在前瞻上加万向轮的方案(为了上坡考虑)后来通过后面的对比实验发现这种方式是及其不可取的。因为对于物理前瞻的小车一定要保证两点。一,物理前瞻不能和赛道有接触,也就是保证不能和赛道有摩擦。否则会给转向带来很大的困难。二,前瞻绝对不能太重,也就是要保证车的重心要在车的中间靠后的位置。如果前面的前瞻太重会导致前轮的摩擦力太大,给舵机转向太多的负载,造成舵机打角迟钝,甚至不能打到预定角度。
2.2,关于舵机选择的体会,首先不得不说,像电科,北科这样的巨无霸都是选择的立式舵机。这种舵机的好处:立式舵机在打角的时候会更省力(具体的专业术语我也不太懂)。但是立式舵机我们在使用的过程中发现了一个问题:就是当立式舵机达到最大角度时会卡死,这对智能车的转向是十分不利的。在转弯的时候如果一侧的轮子打死不转了,那会导致车子的转弯半径变得相当大,让车子看起来就是在直走,而不是在转弯。(我不知道巨无霸是怎么解决这个问题的)当时我们在解决这个问题的时候就是在程序中控制舵机的最大角度,让舵机达不到打死的那个角度。但是后来实验发现这种方法不是特别可取。原因1:这样最直接的就是影响舵机的打角范围。原因2:舵机在转弯是产生的力会让轮子向内运动,如果舵机安装不到位(有活动的区间)也会导致车轮卡死(车轮转不动)。
对于卧式舵机在安装的时候有一个小技巧:在安装的时候让舵机整体相对于正常位置前倾,这样会让舵机打角范围变得非常大,并且在打到最大角度的时候轮子也不会卡死。这样就不用在程序中去限制舵机的角度。
2.3.关于传感器支架:
传感器支架我们是安装在舵机上的,就是随着舵机的转动,传感器也会跟着转动。这样做在理论上的好处,我自己真还没整明白。大家可以试着尝试一下。2016年西南交通大学也是采用了和我们相同的机械结构,但是他们前瞻我们长。目测35cm左右。(全国第六名)在跑车的过程中会遇到这样的问题,有时候一个弯道没过好会影响到后续弯道。简单点说就是车的姿态不能及时矫正。这个问题比较复杂,也没弄清楚到底是这种机械结构的问题,还是程序的问题。说说国赛的车的前瞻吧。他们是将传感器固定在车身上,他们的前瞻普片都在30cm左右,这样以来重心势必前移。但是说了重心一般在车体重心偏后的位置。他们是怎么解决的呢?通过两根特别长的杆,一端连接传感器,一段固定在车模的电池位置。这样就把重心后移了。
2.4.关于单电机车模后轮的硬件差速问题,大家都知道,车体的转向一方面靠前轮控制方向,一方面靠后轮的差速。但是这次我们使用的是单电机,不能像双电机一样程序控制差速。所以要用到硬件差速。具体实现就是调后轮的螺丝。听学长们说把电机开着,用手捏着一个轮子(不让它转动),另一个轮子还能转动,这样硬件差速就算调好了。我开始听一个学长说还不信,后来听国赛大神说了之后就信了,哈哈。
2.5,关于轮胎的问题:轮胎的摩擦力在一般情况下是越大越好,当然这也要结合车身的重量来说。这里只讨论轮胎的粗糙程度。一般新轮胎的是比较光滑的,摩擦力比较小。我们一般采用轮胎软化剂增大轮胎的摩擦力。但是我看国赛大神的车的轮胎都是特别旧的那种。轮胎中间的花纹都磨得看不见了。当然这是祖传的轮胎。咱们没有。哈哈。前轮要考虑摩擦力和舵机负载的问题,摩擦力大负载大,打角慢。具体结合车的重量考虑。
3,关于程序部分
3.1:还是先说说电机的PID调节把。
比例调节( P)作用:是按比例反应系统的偏差,系统一旦出现了偏差,比例
调节立即产生调节作用用以减少偏差。比例作用大,可以加快调节,减少误差,但是过大的比例,使系统的稳定性下降,甚至造成系统的不稳定。
积分调节( I)作用:是使系统消除稳态误差,提高无差度。因为有误差,积分调节就进行,直至无差,积分调节停止,积分调节输出一常值。积分作用的强弱取决与积分时间常数 Ti, Ti 越小,积分作用就越强。反之 Ti 大则积分作用弱,加入积分调节可使系统稳定性加强,动态响应变慢。积分作用常与另两种调节规律结合,组成 PI 调节器或 PID 调节器
微分调节( D)作用:微分作用反映系统偏差信号的变化率,具有预见性, 能预见偏差变化的趋势,因此能产生超前的控制作用,在偏差还没有形成之前,已被微分调节作用消除。因此,可以改善系统的动态性能。在微分时间选择合适情况下,可以减少超调,减少调节时间。微分作用对噪声干扰有放大作用,因此过强的加微分调节,对系统抗干扰不利。此外,微分反应的是变化率,而当输入没有变化时,微分作用输出为零。微分作用不能单独使用,需要与另外两种调节规律相结合,组成 PD 或 PID 控制器。
我们小车在电机控制方面采用了位置式的动态PI算法。
也就是P的参数不是固定的,而是动态发生变化的。这样做有什么好处呢?
一,由于P的参数是随着偏差的变化而变化的,当在偏差很大的时候,那么P的参数也很大。最后计算出来的pi也大,也就是输出的占空比大。这样就能使电机迅速的达到设定速度。随着偏差的减小,计算出来的P值也随着减小,这样就能避免因为P太大而引起的震荡。
二,为什么要采用I呢? 一方面是为了消除静态误差,是系统更加稳定。另一方面是由于我们在采用动态P的时候发现,因为动态的p一般是以偏差的平方作为P的参数。这样的二次函数在偏差大的时候计算出来的参数也大,但是在偏差小的时候计算出来的参数往往很小。也就是在电机速度在快接近设定速度的时候,p的调节能力被限制了。所以我们采用I也是为了在小范围内调节电机速度。
另外我们一般在设计pid的时候都忽视了时间,完整的pid系统是和时间有密切相关的。时间反应到程序中我想就是咱们说的采样周期吧。
在控制电机的时候,采样周期一定要尽可能的短。这样才能使响应时间尽可能的短。
编码器的话在有条件的情况下尽可能选择线数大的。我们这次采用的是200线的编码器。后来发现计得的数值比较小。不太利于控制。
对于PID参数的整定:一个字’试‘
但是也不是盲目的去试,而是在了解pid参数的基础上有目的的去尝试,我听说网上有用上位机调试参数的,但是最常用的的办法还是用按键或者遥控器,然后把参数存储在FLASH里面。(可怜的我,在做车的时候还不会用FLASH,只是去不断的下程序,改参数)。
在说说电轨车的传感器选择:
有人说电轨车最精髓的地方就是传感器的选择和设计。
目前市面上的传感器方案大致有三大类:
1,就是以官方的方案为代表,蓝宙和黛墨改进的方案。这种方案都是产生的方波信号,线圈和滤波的相对位置不同,那么产生的频率就不同。
这种方案的好处就是电路简单,相对开源。网上一找一大堆。
缺点就是因为产生的是方波信号所以需要通过计数来判断频率的不同。而关于计数方面有FTM正交解码可以计数,lpt可以计数,DMA可以计数,FTM输入捕捉可以计数,但是这种计数方式在线圈较多的情况下就会有计数模块不够用的情况。虽说DMA有16路,而且不占用CPU资源。但是据我了解DMA只有一个通道,所有的数据都要从这儿一个通道过去。而传感器的脉冲计数确实一直要进行的。DMA计数用多了的话会导致计数不准确,因为DMA用多了的话会产生一个中断优先级的问题,就是优先级高的先计数,优先级低的后计数。这样优先级低的通道会有数据失真的问题产生。而且这种计脉冲数的方法因为需要在一定的时间之内数频率,所有实时性不是很好。不能反应车的实时位置。
2,就是用的LDC系列的芯片(这种芯片在电赛中用比较多),这种方案以浮点为代表(浮点用的是LDC1000)。我们在使用的过程中发现这种芯片对电压特别敏感,电压稍高或者稍低都会导致芯片不工作。这种芯片资料比较少,只有原版的datesheet。所以我们没有做过多的研究。听说电科是采用的LDC1314的芯片,但是他们是自己设计的。置于浮点的方案可能是没调好。特别不稳定。慎用
3,再就是以联物为代表的检测电压值的方案,直接把采集到的电压值输入到K60的AD转换模块,然后读出电压值。这种方法读取速度比较快能反应小车的实时位置。
而且滤波算法可以参考电磁的滤波算法(已经比较成熟)。但是我们没用过这种方案,网上也还没开源,技术封锁阶段啊,不过可以考虑购买联物的方案。(不过要300大洋啊)
我们是采用的岱墨的方案,岱墨的方案要采用岱墨独家提供的小线圈才能更好的工作。11块钱一个。(好坑啊)
再来说说传感器的摆放位置。
传感器的摆放位置直接决定整个程序的算法。前面已经提到过,电轨面临的最大问题就是偏差的不连续。我们线圈是采用左右各一个,中间再有一个。
为了解决这个不连续问题,我采取了一种简单粗暴的方式。就是直接把不连续的那短去掉。电轨传感器在一定的区间范围内是连续的,从单个传感器看如果向一边移动小车,那么传感器有一个由小变大,再从大变小的过程。在传感器从小变大的过程中,整个偏差是连续的。而从大再到小的过程我们直接去掉了。(就是达到最大时候让舵机打到最大角度),简单粗暴,所以效果也不是太好。 在设计传感器时候一定要从连续性和实时性的角度去考虑传感器的摆放和算法的设计。这个也是我在比赛后才体会出来的(呜呜)。
在说说这个控制周期的问题:
刚刚开始写程序的时候就纠结过一个问题: 控制程序到底是在中断中写还是在主函数中写?
开始也问过学长这个问题:他们都说在中断中写。
我就问他们为什么呢?他们说在主函数中容易被中断打断。
我还会反问他们那么主函数干什么呢?他们说写一些显示函数和串口发数据。
我那时候就想我在主函数中控制舵机和电机的时候就可以不让外部打断啊,再说如果主函数什么都不做会太浪费资源了啊。
我觉得有句话可能一直会对我们产生一定的误解。就是我们经常会问别人“你的控制周期是多少啊”。比如别人回答“5ms”。
我觉得这句话应该这么理解“小车是每隔5ms控制一次,而这个'控制'是一个时间段,不是一个时间点。咱们在控制舵机的时候一般都是给的50hz的频率,
也就是舵机的控制周期起码都是20ms,所以说控制是一个时间段”。
如果你在主函数中执行舵机程序,如果在K60产生pwm的过程中(也就是那20ms内)一旦有中断打断程序的执行,那么舵机就会不转。
而且对于K60芯片,有些在逻辑上看起来正确的东西在主函数中执行可能会出错,而在中断中就正确。具体原因不知道是库的问题还说芯片本身的问题。
所以对于K60来说最好还是在中断中写程序。不然会造成很多意想不到的问题,而且找不到原因(好多时间都是在解决这些问题,呜呜)
最后在说说舵机控制:也是整个程序最核心的部分
舵机控制是整个程序最核心的部分,前面已经提到过传感器的设计决定程序的设计。我在这儿主要就是介绍一下几种程序的思路。
第一个,当然要数我们的pid了,这是最常用的一种算法,用的也非常广泛。在舵机控制的时候一般的就采用PD算法,为什么不用I呢?因为舵机属于实时性很强的
器件,而且舵机没有偏差的累计。所以一般不加I。D在控制中有超前的作用。就是在刚刚进弯道的时候 error-error_last;减出来的值很大会给舵机一个大角度。
但是我个人觉得没什么卵用。因为从直道刚刚进入弯道的时候可能error_last很大,但是在第二次计算的时候error_last就变成上次的error了,也就是说只会产生一个大角度,第二次控制的时候角度就没那么大了。而舵机在执行程序给他的角度的时候是需要一定的反应时间的(由于自己的机械结构和前轮的摩擦力决定)。可能在舵机还没打到最大角度的时候就接收到第二次的角度信号了。然后就到不了最大角度。所以说单纯的pd算法显得非常粗糙。
第二个,我想说说模糊控制。当然模糊控制我自己还没搞明白。但是我相信模糊控制在智能车中肯定是一种比较优秀的算法。为什么这样说呢?因为对于智能车来说影响智能车的因素比较多(比如车的重量,车轮的摩擦力,车的重心,控制的周期,传感器采集的数据的延时性)都难以建立精确的数学模型。所以模糊控制对于智能车来说都是一种比较适合的算法。
关于模糊控制,我自己当然没什么好说的了。我就说说某大学的控制思路把。他们是用四小线圈拟合出连续的偏差,然后把偏差和偏差的变化率输入模糊控制器然后通过模糊控制器再输出P和D。当然这就相当于模糊pid。
最后在说说微分先行pid吧。曾经有小伙伴想我建议过微分先行pid。听着挺高大上,对车的实际角度进行微分。实际上就是在车上加陀螺仪,然后把陀螺仪的角速度积分后(角速度积分就是角度)作为微分输出。当时因为没钱买陀螺仪就没弄。