作为第二次参加智能车大赛的“老队员”,有了前一届的参赛经验,上手起来确实轻松了不少。因此,在选择组别的时候,我便想挑战一下自己,选择了这个今年新加入的且难度较大的单车拉力组。
事实也证明,这个单车在制作和调试的过程中,难度的确很大。虽然实现平衡和循迹程序的算法相对简单(不排除有大佬采用了更加高级的算法),但是对于小车机械结构和参数的要求十分苛刻,需要不断尝试和调整才能十分稳定地跑起来。
下面我会对调车和比赛过程中出现的问题进行总结,并进行经验分享。
由于大部分比赛已经结束,所有的制作文件我都会开源,链接放在本文最后,大家可以自行下载。学业繁忙,评论区发邮箱暂不回复,希望大家理解。
由于大小限制,此GIF采用了2倍速播放!
单车拉力组是本届大赛新加入的组别,使用的车模也是新设计的K车模。
可能有不少同学看过稚晖君大佬的作品:我把自行车做成了 自 动 驾 驶 !! 抛开AI识别和路径规划等技术,稚晖君在这个作品中设计的自行车主体,是使用动量轮进行的平衡。这种平衡方式比较稳定,可以实现自行车的原地直立,在淘宝的平衡小车之家中也有类似的学习套件。
但是卓大大为了加大本组别的难度,在规则中明确要求了:不允许使用动量轮或质量快等实现平衡。那么,这个小摩托想要实现平衡行进就困难了不少。所以,K车模中并未设计安装额外平衡装置的位置。(具体实现方式后续说明)
下面开始吐槽:
★K车模精致帅气,主体采用纯金属打造,外喷金色涂装,尽显高端大气。
★车模采用传统的RS380电机控制后轮速度,舵机控制前轮转向的方式,实现小摩托的平稳运行。
★车模标配新款SD-12小舵机,不仅价格昂贵(单价115元),性能更是十分拉跨,响应慢,扭力小,易损坏,让调车人时常感受更换舵机的痛苦。
★标配的车模轮胎更是昂贵(一对120元),轮胎皮与轮毂一体构造,胎皮磨损后,只能整体更换。由于材质和设计问题,后轮轮胎极易磨损(前后轮轮胎相同,由于后轮为驱动轮,更易磨损),也需要不时更换,为我们的调车生活又增添的几分难度。
左边为使用5天的后轮轮胎,右边为使用了1天的后轮轮胎。
★车模设计的后轮固定结构更是有趣,由于制造上的误差,每台车模都有属于自己的特色。电机转动后,车轮或左右晃动,或上下晃动。调平衡难度进一步加大。
上面有关车模设计上的问题,在第一批车模上尤其突出,后面一批车模有一定改善,但仍然存在。(两批车模我都使用过)
单车拉力组与AI电磁越野组使用的赛道基本类似,只是做了部分简化。包含的元素有,直线、折线弯、十字、坡道、直角弯(直角弯难度较大,在赛区比赛中未添加)。
在各赛区的比赛中,基本都使用了下面这个赛道:(其中,蓝色部分为单车拉力组的实际赛道,灰色部分为原AI电磁越野组赛道,红色线段部分放置了一个坡道,红色圆圈放置锥桶,绿色部分为发车点)
小摩托只需要从发车点出发,循着电磁信号线(蓝色的赛道),正常绕行一圈即算完成比赛。期间,小摩托只要保持不倒(除两轮外的其他部分触地均算作倒地),且不碰撞锥桶,前不会穿过锥桶超近道即可。(卓大大发的规则中提到,碰撞锥桶后,锥桶移动10cm以内不算违规,但是对于单车而言,碰撞后基本难以再保持直立)
★由于小摩托配套的SD-12小舵机性能弱且易损坏,因此我们改换成了性能更好的S3010舵机。
★自制的电池和支撑安装支架,可以方便把电池安装在小摩托底部,降低重心,更容易平衡,两边的支撑用于立住小摩托,以及防止倒地后摔坏小摩托。
★适当添加配重块,保证小摩托左右两侧的平衡,这样才能保证左右转弯时,不会有较大的差别。(例如左转转弯半径小,右转转弯半径大的情况)
★前轮安装使用了13孔,可以让转弯更加灵活。当然因人而异,也有队伍使用24孔跑得很好。
★由于小摩托制作的误差,当两个舵机前杆均安装上去后,会限制前轮的转向幅度,从而影响小摩托的最小转弯半径。因此,推荐只使用一个舵机前杆,另外一个使用橡皮筋拉住即可。
(Tips:此点因车因参数而异,我的小摩托在使用此种方案后,平衡稳定度得到了很大的提升,转弯也更加灵活。)
★STC16主控板采用了龙邱科技单车主板的外形设计,内部电路进行了一定的改造。
变动1:去除了不必要的模块接口,比如CCD等,简化主板结构;
变动2:采用TI的TPS5430芯片替换AS1015芯片(AS1015芯片缺货)为舵机进行供电。
变动3:稳压芯片采用了常用的AMS1117-3.3V线性稳压芯片,并在前面添加了LM2596-5.5V开关电源芯片,减少LDO的损耗。(LM2596芯片有点过时,但正常使用没问题)
变动4:更换了开关、接口、按键等原件的封装;
变动5:对电路板重新进行了布线和布局,并把电源地,模拟地和数字地进行了隔离;
变动6:更换的蓝牙模块接口是配套逐飞的蓝牙模块,方便使用。
变动7:下载电路换成了习惯用的CH340G芯片,体积略有增大。
★电机驱动采用了BTN7971芯片,芯片价格较高,但是电路非常简单,焊接调试难度小,运行稳定,板子体积也较小,适合使用在单车上。
★前瞻的外形采用龙邱的设计,但是把原来的LM358换成了一块OPA4377运放芯片,可以同时放大四路信号,因此一根杆子上仅有四路电感。
实际使用时,安装了两个前杆,采用6路电感进行循迹(一对水平,一对内八字,一对竖直),一般循迹只需一对水平和一对内八字电感即可,竖直电感主要用于判断直角(虽然判断直角的程序还未调试成功)
(推荐还是在一根杆上设计六个电感,减少前瞻的重量,小摩托更容易平衡。)
小摩托的平衡原理和我们日常骑电动车类似:
电动车正常向前行驶的过程中,假设此时的小车平衡,平衡角度为0°。当车身出现向左倾斜的趋势时,如果想要车身回正,那么就需要前轮向左旋转;同理,当车身出现向右倾斜的趋势时,如果想要车身回正,那么就需要前轮向右旋转。
同时,当需要电动车向左转时,只需要令其向左倾斜一定的角度;当需要电动车向右转时,只需要令其向右倾斜一定的角度。这便是基本的控制原理。
更加详细的可以参考此篇博客:自行车平衡原理
软件的整体设计不难,重点在于调参。
与传统的两轮直立平衡车有异曲同工之处,代码中主要涉及三个环:
★一个是电机的PI环,用于稳定控制小摩托的运行速度。通过编码器反馈的实际速度,试电机转速达到目标转速。
★还有一个是舵机的PID环(直立环),用于实现小摩托的直立。通过从MPU6050中获取左右倾斜的角度(类似于横滚角)和角速度,反馈到直立环中,输出控制舵机的PWM占空比从而改变舵机的转角,最后实现平衡。
★最后一个是模糊P+定值D的转向环,用于实现小摩托的稳定循迹。通过前瞻的电感值,经过一系列数据处理,最终计算得到所需的目标平衡角度。采用模糊控制,可以保证在直道稳定的同时,转弯也会灵敏识别。
★程序通过MPU6050的INT引脚,在初始化时设置了每5ms发出一个信号,从而每5ms控制一次。
★姿态角的获取采用了龙邱提供的MPU6050+DMP实现。
★为了消除电感值的一些噪声干扰,可以采用滑动平均滤波的方法。
★如果发现电机对整个系统产生很大的干扰。比如:打开电机使后轮转动后,主控出现死机、OLED花屏、舵机开始抖动、电感读取的值出现严重噪声等问题时,很可能是因为电机本身出现问题,需要更换电机才能解决。
★舵机对电感的值始终有一定的影响,且是由于舵机运动后内部电流变化产生的影响,而不是其产生的外部磁场干扰。(测试时:令舵机远离和靠近电感,发现一直有干扰,且基本没有区别;当舵机停止转动后,干扰消失)
★与上述相同:由于小摩托制作的误差,当两个舵机前杆均安装上去后,会限制前轮的转向幅度,从而影响小摩托的最小转弯半径。因此,推荐只使用一个舵机前杆,另外一个使用橡皮筋拉住即可。
(Tips:此点因车因参数而异,我的小摩托在使用此种方案后,平衡稳定度得到了很大的提升,转弯也更加灵活。)
★速度的稳定对小摩托来说十分重要,因此,只有令后轮越顺滑,齿轮间的阻力越小,控速才能越平稳。需要格外注意轮胎两侧固定轮胎的两个金属柱的正反问题,放反后,会卡住轴承,增大转动的阻力。齿轮和轴承上可以滴加一点润滑油。
★由于小摩托后轮驱动,摩擦较大,因此后轮极易磨损,打滑后对上下坡十分不利,需要及时更换。
★前瞻需要尽可能轻,要令小摩托的整体重心靠后才容易控制,转弯不容易倒。
★定期检查电感的值,可能会有较大的变化,很多因素都会影响采集的电感数据。
★板子越精致小巧,小摩托越容易平衡和循迹。因此,在有足够设计和焊接能力的前提下,缩小电路板体积是十分必要的。
★布线时候需要格外注意,对于电源的滤波电容,电源线需要先要经过电容再进入芯片的电源引脚,否则起不到滤波作用。尤其是对STC16单片机而言。(第一版主板由于粗心大意,没注意此问题。导致电机和舵机打开后,电源不稳定发生波动,STC16直接死机)
★推荐加装蓝牙传输模块进行调试,在匿名上位机上显示波形,可以更加直观地调试各种参数,缩短调试时间。(经过测试,除去帧格式,只能发送4个字节用于显示的数据,否则单片机运行速度不够,会出现程序崩溃或丢包的情况)。
★直立环(舵机PID)的稳定性对小车后续的调试起着至关重要的作用,下图展示的是我的小摩托的直立稳定性能。只有当小车可以十分稳定地直立前进后,才能更好地实现循迹。(直立调试要求:几乎可以走直线、遇到轻度颠簸路面可以稳定通过、用手添加外力后可以迅速转向不抖动)
★直立环的积分系数I很重要,用于平衡长时间的积分量。将会直接影响小车的当前角度是否能达到目标角度,使用上位机进行波形观察可以明显看出。当目标倾角越大时,静态误差也越大,比如设定的目标倾角为5°时,I不够大的情况下,小摩托可能一直保持在8°左右行驶,那么就很容易倒地。
★STC8H系列单片机使用MPU6050获取姿态角时,只有一阶互补滤波有效,二阶互补滤波和卡尔曼滤波会出现延时(严重的阻尼现象),移植的DMP也会有较大的过冲(暂未解决)。因此推荐使用STC16,并直接使用龙邱移植好的未开源DMP库。
★在小摩托本身硬件没有大变动的情况下, 直立环的参数是固定的,调节好后,可以一直保持稳定,不需要经常调。
★虽然舵机对电感值有干扰,但是相对于电感值的变化幅度来说,是可以忽略的。经过测试,电感靠近和远离电磁线时,数值变化的幅度可达2000~3000。而舵机的干扰始终在30以内。经过滤波和归一化后,可以基本消除干扰。
★Keil251的编译器经常会出现许多奇奇怪怪的问题。比如:1.写的某些函数会导致程序卡死,无论是否调用;2.某些变量定义的顺序会影响程序的正常运行;3.一条语句中定义多个变量也会影响程序运行;
★★★小摩托想要直立前进,首先需要找到它的角度中值,也就是可以直线行驶时,横滚角的角度。可以通过悬挂法,或者把小摩托放在平面上,调节它的姿态,找到平衡点,记录此时的角度,然后在程序中进行角度偏差的补偿。
★★★PI速度环:此环参数较为简单,下面这个参数基本可以。需要保证电机转动过程中可以明显感觉到转动速度均匀,而非周期性得一快一慢。(注意:使用的是龙邱512线编码器,如果是1024线编码器,参数需要改动)
★★★PID直立环:此环的参数与行驶的速度有很大的关联,因为速度和直立环会同时影响小摩托的平衡。整体来说是:速度越大,直立环的P和D越小。
在保证角度中值准确,速度适当且恒定的前提下:
☆先调节P和D并添加固定的系数I(0.1左右),当小摩托可以简单直立后,增加P和D。
☆如果出现直线行驶时,前轮左右晃动幅度过大的情况,可以降低P,略微增大D;
☆如果用手突然改变前进方向,小摩托出现明显的左右震荡,需要降低D。
☆给与小车一定的倾斜角度,使其绕圈行驶,通过上位机观察。如果实际角度始终与目标角度有较大的误差,需要适当增加I。
★★★模糊P+定值D转向环:这个环主要是通过电感归一化后的值,经过差比和得到的偏差,来计算出需要的倾斜角度,从而实现转弯。实际使用时,定值D比模糊D效果更好,且节省资源。
☆P的模糊表和相应的系数需要自行设计。此环的系数主要通过实际循迹时进行调整。
☆当寻直线时,如果发现小摩托在线上左右摆动,不贴线,可以增加D进行抑制。
☆当发现小摩托转向不灵敏时,可以适当增大P来提高灵敏度。
★最终获得了华东赛区决赛第八的成绩,勉强拿了一个赛区一等奖。小摩托的最好水平没能在比赛时发挥出来。
★赛道全长84m左右,在试车的时候可以跑到最快的速度,一圈63s;初赛时能跑中等的速度,一圈70s,获得了初赛第六;决赛时只能以最慢速才能完赛,一圈77s,获得了决赛第八(初步分析是由于场地更换的问题,试车和初赛都在A赛道,决赛在B赛道,赛道和信号发生器都有一定的差别)。无法跑完全程,几乎都是在出十字时,小车出现跑偏的情况,且无法寻回路线。
★至于有关本届华东赛事承办学校在办赛过程中出现的诸多问题,我在此就不多说了。仅对那些因各种原因未完赛的车友们表示理解与遗憾。
★最后再放一个调试的慢速运行过程,由于是gif,演示效果可能不明显。实际测算后,最慢速度约为45cm/s。
PS:华东赛区8个国赛名额,我们混进了国赛,躺赢国二,嘿嘿!
★文章如有错误,欢迎指正。