▌单车拉力组
又是一个“周一”,各位参赛同学们你们好,终于可以和大家一起聊聊单车拉力组了,还不算太晚,上周卓老师也让我协助了解一下大家的准备情况,然后进行了一次关于单车拉力组的线上讨论,然后根据情况看是否给大家出一个参考教程。经过初步的了解,我们得知,不同参赛队伍的准备情况差异还蛮大的。而且大多数的情况并不是太乐观,只有少数准备得比较早的学生能做出比较好的效果,当然这个了解也并不全面,附上卓老师整理的推文:你的单车还好吗?(点击标题可跳转,也可通过后方的链接访问)https://mp.weixin.qq.com/s/6_Qaw5LABkLuQ97c3c89Rg。虽然不能代表全部,但从一定层面体现了大致情况。
单车拉力组是今年新引进的一个组别,车模是全新的电动摩托结构,这种自行车原理的车模也是第一次引入大赛,对于新车模的控制,的确都还没有太丰富的经验,入门的难点也就在这里了,怎样控制车模平衡,怎样控制车模走直线,怎么样控制车模绕圈,怎样控制车模在保持平衡的情况下根据引导电磁线循迹,完成了这几个“怎样”,大概可以保证完成比赛了。接下来我们就来聊聊怎样完成这几个“怎样”。
▲ 测试单车样车全图
一、 赛题分析
1.车模
通过规则我们知道单车组使用了全新的K车模,车模作品尺寸不限,车模上不允许安装额外保持平衡的惯量轮。怎么理解这个规则呢,其实就是车模做的小巧才方便控制,把长宽给你放开也不要紧,因为又大又笨的自行车不太可能有好的效果,因为可以给你控制的就一个控制单车龙头的舵机和提供动力的电机,所以制作车模的原则就是在合适的前瞻长度情况下,尽量将小车制作的小巧轻盈、结构紧凑。
▲ 单车样车侧面图片
2.微控制器与传感器
该组别限定使用STC的单片机,从赛题的控制需求来讲,STC的8G、8H、8A以及今年的16位STC16F都能胜任。允许使用各类传感器。但我们结合比赛场地来看,单车组是在室外比赛,没有PVC赛道,采用的电磁引导,所以放开其他传感器也没啥用途,可以用到的传感器基本就只有姿态传感器、速度传感器以及电感(用来感知磁场强度)了。所以单车组看似比较开放的传感器使用范围真正能用的也就几个。
3.比赛赛道和任务
比赛赛道是室外越野组类似的折线电磁引导线,目前确定的元素包含直道、弯道、十字路口。目前来看赛道难度会比越野组的低,而且也在相对平整的室外运动场,不会有颠簸和砂石路段,同时也没有环岛,坡道和直角还不确定是否有,估计最终会根据大家的实际备赛情况来做调整。但既然会有调整就最好都准备着,小坡道应该没有问题,以往室内比赛那种大坡道我估计是比较悬的,的确有点难为自行车了。关于赛道元素的更详细规则还是以官网发布的规则为准。
▲ 电磁引导折线赛道
比赛任务其实很简单,预赛就是循迹竞速赛,决赛是两两对抗看谁跑的久,如果两车都很能跑,就最先跑完规定圈数的获胜,从决赛这里来体现的“拉力”二字。还有可能额外新增一个比谁跑的慢的挑战赛,我想这个挑战赛的灵感应该来自于教职工运动会上的趣味运动项目,比谁骑自行车骑得慢,把这项挑战加入到竞赛很有挑战性,因为电单车跑很慢和跑很快都是很有难度的。也很有趣味性。
二、赛题验证及车模制作小建议
1.芯片选择
如上文所说,允许使用STC的各系列芯片,推荐在STC的8G、8H、8A系列以及今年的16位机STC16F这些型号中选择一款来作为自己的主控,从需求来讲,都能胜任,但16位机的优势是有单精度浮点运算单元,虽然主频还不如8H的48M高,但因为是16位机,在同频率的情况下实测运算速度是8H的两倍,如果使用卡尔曼滤波,8位机的计算能力可能不太够,16位机就完全能够胜任这个需求。
如上文所说,允许使用STC的各系列芯片,推荐在STC的8G、8H、8A系列以及今年的16位机STC16F这些型号中选择一款来作为自己的主控,从需求来讲,都能胜任,但16位机的优势是有单精度浮点运算单元,虽然主频还不如8H的48M高,但因为是16位机,在同频率的情况下实测运算速度是8H的两倍,如果使用卡尔曼滤波,8位机的计算能力可能不太够,16位机就完全能够胜任这个需求。
▲ STC16F 核心板
【核心板参数】
名称 | 功能 |
---|---|
下载器 | 板载CH340,无需下载器,一根Type-C即可下载 |
板载资源 | 电源指示灯×1; 用户LED灯×1; 硬件复位按钮×1 软件复位按钮×1;USB转TTL下载接口×1 |
IO引出 | IO引脚×61; VCC电源×1; GND×2 |
芯片内部资源 | 定时器×5; 高速串口×4; 硬件SPI×1; 高级PWM定时器×2;12bitAD×15 |
2.机械调校
其实想吐槽的,控制一下,算了,既然都这样了,劝各位参赛同学还是好好调吧,起码舵机放开了,S3010可以直接替换原来的小舵机,我甚至都不知道那个小舵机的型号,就叫它小舵机可以了,因为它已经不重要了,如果可以使用S3010替换,我想只要知道这个消息的同学都会更换吧,高下立判,谁用谁知道,S3010舵机的安装方法就自己琢磨了,演示样车就是万能的热熔胶一顿糊,因为这个位置本身不是设计给S3010的,幸好拆掉两个固定连接件后还能刚好放进去,不然更麻烦。
至于皮带动力传输以及齿轮的这些调整就自己去想办法优化吧。其他建议没太多,保证小车小巧轻盈、重心低,传感器支架不要太重,编码器安装不要影响动力轮,松紧适度,可以参考逐飞的赛题验证样车,但样车的传感器支架是略偏重的,前期起步可以这样装,但做到一定程度后建议自己设计更轻巧的电感支架,减轻小车重量,降低小车重心,电池建议不要装在设定的框里了,建议放小车肚子下面,这样重心更低。
3.传感器选择
姿态传感器推荐使用ICM20602,编码器推荐使用逐飞带方向输出的mini编码器,电感就普通的10mh工字电感和矫正电容匹配就行,原则是感知20K交变磁场。
▲ Mini编码器安装方法
4.控制方法
本次样车,我们采用的是位置式PID控制舵机,增量式PID闭环控制电机,一阶互补滤波进行速度融合。
在调试过程中我们发现电单车对滤波的要求相当的高,如果滤波滤出来的效果不平滑,就会造成角度数据抖动很大,从而导致舵机抖动异常。滤波做好了,后面的控制就好办很多,这是一个很重要的要点。接下来就从这个要点讲起(以下为调试经营分享,供入门参考)。
第一步:做好一节互补滤波
样车使用的是一阶互补滤波,在以前逐飞公众号都已经讲过。直达连接:互补滤波浅析–逐飞科技
https://mp.weixin.qq.com/s/hcnLPSbKXnpAo4VSh872Cg
在使用一阶互补滤波的时候,我们需要整定加速度计比例系数和陀螺仪比例系数,而这个加速度计比例系数也叫做对加速度计的信任程度,陀螺仪的比例系数也就是对陀螺仪的信任程度。系数越大,信任程度越高,融合得到的角度就更加跟随其变化。融合出来角度的波形,需要达到快速,稳定,平滑这几个指标。
在系数整定的时候可能会遇到,这样的情况:
(图中的黄线是陀螺仪数据,红线是加速度计数据,蓝线是经过数据融合后的角度值。)
▲ 图2-1 加速度计系数较大是对于的融合角度曲线
如图2-1所示,这个图,很明显的感受到蓝色的角度值,受到加速度计的抖动,明显的跟随着其抖动。这样的加速度计抖动,可能是因为路面不平整突然抖了一下,导致加速度计抖动很异常,此时,我们融合的角度,不希望跟随加速度计变化而变化这么大,所以,我们应该降低加速度计的比例系数。
我们降低了加速度计的比例,波形变成了图2-2这样,融合后的角度跟随加速度的趋势变慢了,但角度波形变得更加平滑。
▲ 图2-2 加速度系数合理,陀螺仪系数不勾对应的融合角度曲线
此时再去增加陀螺仪比例,增加后的波形如图2-3所示,目前加速度计的比例不高,融合后的角度波形紧跟加速度计,且角度值的波形很平滑。
▲ 图2-3 滤波器系数较为合理时对应的融合角度曲线
从图2-3中可以看出加速度计数据,波动相当的大,融合后的角度数据并没有大范围的波动,且角度跟踪加速度计较为紧凑。这样的波形,我认为才是一个合理的波形。
小结:我们对加速度计的信任不能太高,太高了,会导致融合的角度容易产生波动,最终会导致舵机的控制不够丝滑。
▲ ICM20602模块以及锂电池安装
第二步:舵机中值、幅值以及机械零点确定
滤波做完了,我们得测出电单车需要的几个重要数据,在测试这些数据前,建议先更换为S3010舵机,实测S3010舵机换上之后不管是在响应速度还是力量、精度上都得到了很大的提升。可更换舵机的推文见卓老师推文:
a、舵机安装在车模中的舵机中值,这个值需要安装好之后来实际测得,但安装的时候需要考虑自由旋转龙头的范围需要在舵机的控制转动范围内,不要装偏,避免超过舵机机械限位导致将舵机烧毁。
b、由于机械限位,需要测出舵机左转的最大值,右转的最大值,以防舵机占空比范围不合理,烧坏舵机。
c、机械零点。简单地说就是电单车平衡位置的角度angle。
▲ S3010舵机安装示意图
第三步:保持单车直立行驶
控制思路大致是这样的:当电单车有往左边偏的趋势了,此时舵机得往左边旋转,让电单车往右边偏,来保持平衡。这里我们使用位置式PD算法来控制舵机:
位置式PD:
A n g l e O U T ( t ) = k p ⋅ A n g l e ( t ) + k d ⋅ G y r o ( t ) Angle_{OUT} \left( t \right) = k_p \cdot Angle\left( t \right) + k_d \cdot Gyro\left( t \right) AngleOUT(t)=kp⋅Angle(t)+kd⋅Gyro(t)
开始,我们可以控制电机闭环转动,舵机只用位置式PD,如下面上面公式所示, A n g l e O U T ( t ) Angle_{OUT} \left( t \right) AngleOUT(t)是角度环输出, A n g l e ( t ) Angle\left( t \right) Angle(t)是数据融合后的角度, G y r o ( t ) Gyro\left( t \right) Gyro(t)是陀螺仪值。
电单车是通过传入的当前倾角值来控制舵机旋转达到保持平衡。实际上,我们只有PD参数,电单车会因为路面不平,机械零点不对称等一系列因素,小车将会跑着跑着往一边倾斜,然后开始向车身倾斜的那一边转圈,最后越转越小直到倒下。(在只有PD参数的情况下,舵机中值不对,机械零点偏差很大,就会导致小车,永远向一边倒下。)
此时我们就需要引入积分量了,积分参数(ki)x积分的累加值(integral)等于积分输出。让舵机的控制变为位置式PID,这个积分输出有滞后的作用,但是电单车又必须要这么做。积分输出小了,在直线行驶的时候电单车,还是会先向一边倾斜,然后转圈直到倒下。积分输出大了,就会导致舵机响应严重的滞后。这里这个积分输出需要有一个合理的值,同时积分的累加值(integral)是需要限幅的。如下面的公式所示:
位置式PID
A n g l e O U T ( t ) = k p ⋅ A n g l e ( t ) + k i ⋅ ∫ − ∞ t A n g l e ( τ ) d τ + k d ⋅ G y r o ( t ) Angle_{OUT} \left( t \right) = k_p \cdot Angle\left( t \right) + k_i \cdot \int_{ - \infty }^t {Angle\left( \tau \right)d\tau + k_d \cdot Gyro\left( t \right)} AngleOUT(t)=kp⋅Angle(t)+ki⋅∫−∞tAngle(τ)dτ+kd⋅Gyro(t)
这里我通过无线模块传输回PC的实时数据抓了一个直线行驶的波形,如图3-1所示,这个图是电单车放在光滑的地面上直线行驶,截取出来的波形图。从波形中可以看出来,角度值,一直在0点附近平滑的来回波动。
▲ 单车直线前进对应的角度和加速度曲线
小结: 直线行驶的时候,首先角度环控制只用位置式PD,让其直线行驶,大概能很直的跑几米后,再去使用位置式PID,这样小车就可以跑很久的直线了。建议按照这个思路来调试,这样可以让你更充分的体会单车模型控制的要诀,知道哪些量的作用是什么,不要图快,不要囫囵吞枣,注意每一个细节。
第四步:怎样在受控的情况下让小车转圈却不倒
直线调完后,就可以开始调节转圈。这里指的转圈是按照你的程序控制来转圈,而不是前面所说的不受控制的转圈最后倒下,而且转圈的大小也是受程序控制的。这里我们以右转圈为例:
这个车我们期望向右转圈,在电单车的机械零点( A n g l e ( t ) Angle\left( t \right) Angle(t))加上一个很小的期望的倾角值( A n g l e S E T Angle_{SET} AngleSET),经过PID计算再控制舵机。开始发车的时候,车身处于直立的状态,而程序期望他向右倾斜来达到右转弯的状态。此时舵机最开始会向左打一些,让车身往右倾斜,往右倾斜的时候,这里我们使用的是位置式PID,电单车的实际的倾角就会在期望的倾角值附近来回震荡,来达到一个动态平衡的效果。
位置式PID :
A n g l e O U T ( t ) = k p ⋅ [ A n g l e ( t ) + A n g l e S E T ] + k i ⋅ ∫ − ∞ t A n g l e ( τ ) d τ + k d ⋅ G y r o ( t ) Angle_{OUT} \left( t \right) = k_p \cdot \left[ {Angle\left( t \right) + Angle_{SET} } \right] + k_i \cdot \int_{ - \infty }^t {Angle\left( \tau \right)d\tau + k_d \cdot Gyro\left( t \right)} AngleOUT(t)=kp⋅[Angle(t)+AngleSET]+ki⋅∫−∞tAngle(τ)dτ+kd⋅Gyro(t)
在实际调车的时候,如果转圈的过程中,越转越小,可以尝试增加角度环位置式PID参数中的P参数或者I参数。让其增加向心力,从而达到转圈不倒的目的。
如图5-1和5-2所示,这里代码中设定的期望倾角为200,角度波形就在200的附近来回抖动,实现动态平衡。
▲ 图5-1 旋转式角度波动曲线
▲ 图5-2 旋转式角度波动曲线
小结: 调转圈的时候,期望的倾角值,可以先给一个很小的量,然后调节角度环位置式PID参数,直到不会倒下,再继续增加倾角值。这个期望的倾角值越大,他的转弯半径就越小。我们肯定期望转弯半径越小越好。
第五步:怎样巡线
如果完成了前面的几步,能够一直转圈不倒,而且转圈半径也比较小,那么巡线基本就没有问题了。一直转圈不倒是通过倾角值来控制它原地转圈的。同样,我们可以通过改变期望的倾角值来让电单车巡线。
▲ 用于电磁巡线的电感传感器(四个电感)
样车的使用的是两电感算法,通过差比和算法计算出偏差值:
E r r o r = ( V r i g h t − V l e f t ) × 128 V r i g h t + V l e f t Error = { {\left( {V_{right} - V_{left} } \right) \times 128} \over {V_{right} + V_{left} }} Error=Vright+Vleft(Vright−Vleft)×128
-
其中:
-
Error : 计算出的偏差数值
V r i g h t V_{right} Vright:右电感电压测量数值
V l e f t V_{left} Vleft:左电感电压测量数值
计算出来的偏差值经过PD计算得出期望的倾角值,通过期望的倾角值,来改变电单车的运行轨迹,从而达到巡线的目的。
我们手拿着电单车使其处于直立状态,放置在电磁线左边,就会发现,这个舵机是往左边转动的。这个是由于算法上,我们是通过控制期望倾角的方式来使电单车转弯的。我们期望电单车往右边倾斜,舵机必然需要往左边打一下,让他很迅速的达到期望的角度,来使其巡线。这个逻辑如果不明白的可以先自己体会一下,想明白了才能知道程序怎么写。
电磁寻迹的差比和的算法已经不用再详细讲了,很多年的东西了,参加过一次的同学们也基本熟悉,就算对没参加过的的同学来说也很简单,逐飞之前推文里也有讲过,详情见推文:电磁及摄像头(总钻风)寻迹算法浅析–逐飞科技(点击标题可跳转)。
以上几个步骤就是逐飞在做赛题验证时得出的一些经验,分享给参赛同学们,一定不是最好的,但给新手同学们有一个基本的参考。
▲ 主控板以及支架安装示意图
样车验证效果
看完上面的描述,大家一定想看看实际效果啦,下面就通过几个视频来看看单车组样车调试、验证的效果演示。
视频1:前期平衡调试视频
▲ 室外调试单车平衡测试过程
视频2:前期平衡调试视频
▲ 室外单车平衡调试视频
视频3:受控直线行驶
▲ 车库内调试单车受控直线行驶
视频4:室内受控转圈行驶测试
▲ 室内转圈调试过程
视频5:原装舵机巡线测试
下图显示了原装舵机在控制车模电磁巡线运行时,车模动态特性。在方向修正过程中可以看到车模摆动较大。
▲ 原装舵机巡线测试
视频6:更换S3010后巡线测试
下面使用相同的程序,仅仅是更换了S3010控制舵机,车模在电磁巡线时的动态特性。可以看到车模在转弯过程中比较平稳。
▲ 更换S3010后车模运行情况
四、结束语
同样,单车拉力组的样车仅用于赛题验证和证明以上推荐均经过逐飞验证,同时也是对我们设想的基础方案以及逐飞核心板、传感器产品的验证。也许对新手入门能有一点帮助,对这个组别的任务实现做一个简单的梳理,提供一个基础的参考。
样车上的学习用PCB板,样车应用程序,均不公开,不出售,不赠送,只分享思路。这些内容并不复杂,是完全符合大学生能力定位的。所以根据我们分享的思路做自己的小车,编写自己的代码都是可以实现的,希望每个参赛的同学都能知其然并知其所以然,不偷懒,不走捷径,理解到了,自己做了,知识才是自己的。
并且我们的样车一定不是最优方案,更好的方法、算法等都需要车友们去思考和发现,这样你才能成为一名合格的工程师,将来才能有一技之长。所谓的工程实践活动,就是需要你去实践,根据比赛要求设计小车,亲手制作,才会有收获,最后,祝愿车友们制作出满意的小车,最终能在竞赛中取得自己满意的成绩!
转载:https://blog.csdn.net/zhuoqingjoking97298/article/details/115479574