练习PID算法最好的项目——滚球控制系统

目录​​​​​​​


写在前面

机械结构

视觉部分

PID控制算法

舵机幅度系数

确定PID参数的技巧

代码开源


写在前面

 题目来源于2017年电赛的国赛真题——滚球控制系统,题目内容在此不过多赘述,大家可以提前去看一下这个题目。虽然离现在已经过去了很久,但依旧有着练习的必要,其实上网搜一下就可以看到网上很多大神可以很完美的控制小球在一个小平板上滚动而不下落,对此你是否感到惊叹呢?虽然网上有很多的资源,但我觉得依旧没有讲清楚这个系统的核心部分,所以我写下此文,有不足之处欢迎大家指点!

机械结构

该系统的机械结构我认为是最重要的部分,一个好的机械结构能让写程序的时候更加轻松。要么有非常完善的机械结构,要么要非常好的程序算法,二者缺一不可。

首先,我们要控制小球的运动,我们肯定无法直接对小球控制。我们只能通过平板的倾斜,利用小球的重力使它运动,那么如何使平板倾斜就是问题的关键。

其实有很多种方案,本质上就是用舵机或者步进电机带动连杆去顶平板。那么如何优美的去顶板呢?关键是给舵机装上一个“往复式连杆”。淘宝上是有买的,或者直接手搓一个“往复式连杆结构”。我们需要在平板的x轴和y轴各装一个该结构,以便控制小球在x轴和y轴运动。

最后组装起来大概就是这样的:

上图是淘宝店家用3D打印的一个结构,我自己复刻的时候用的是其他装置仿制的该结构。下图是我自己搭建的机械结构,由于学校经费有限,所以用的都是杂七杂八的东西拼接在一起的,必要的时候要一直打胶水(悲)。连杆和平板连接的部分要用万向节,否则舵机会转不动。

视觉部分

视觉部分是基于OpenCv,用Python写了一个识别小球的算法,然后把坐标反馈给主控板。主控板接受到信息再对舵机进行控制。识别小球的算法非常简单,如果小球的颜色比较鲜艳就可以转换成HSV图像后二值化。如果摄像头画面干净用轮廓识别对轮廓面积大小以及比例去筛选也是可行的。代码在这里我就不贴了,我会在文章后面进行开源。

PID控制算法

调PID一定要耐心!调PID一定要耐心!调PID一定要耐心!

PS:在没调好PID参数之前,看到小球一下就飞了出去,一直控制不好,我心都凉了。我一直怀疑是我的硬件太垃圾或者什么因素导致这个项目根本不可能完成,甚至都想放弃了。结果在我不断的坚持下,终于成功啦,坚持和耐心很重要!

PID算法是闭环控制非常重要的算法之一,如果还不了解的小伙伴去搜搜。这里讲解一下我对PID算法的理解,PID就是比例、积分、微分算法。

下面我借助一个例子讲解一下,先讲一下比例P,比如你要往100ml的水桶里注满水,如果P是0.5的话第一次需要注水50ml(100 * 0.5),第二次需要注水25ml(50 * 0.5),第三次需要注水12.5ml(25 * 0.5)……直至加满。就像红绿灯绿了汽车提速一样,司机不会直接一脚把油门踩到目标速度,而是把速度慢慢提上去。想象一下,如果P值太大,我们控制平板的倾斜角度也会突然变得很大,那小球不得立马飞了出去。

那么为什么需要有积分I呢?还是讲水桶注水的例子,如果水桶会漏水,本来应该在比例P的作用下,第n次注水x是可以把水桶加满的,但是因为水桶刚好也会漏水x。每次加了x又漏掉x,那么永远水桶也加不满水,这就造成了一个稳态误差。积分I就是累加每次的误差值再乘上一个积分系数,如果一直加不满水桶,累加的误差值也会越变越大,从而可以打破上述漏水和加水一样多的情况。

那微分D又是什么呢,我为什么叫微分D叫抑制器呢?想必各位在小学二年级的时候都学过微分吧。当比较接近目标时,P的控制作用就比较小了。越接近目标,P的作用越温柔。有很多内在的或者外部的因素,使控制量发生小范围的摆动。D的作用就是让物理量的速度趋于0,只要什么时候,这个量具有了速度,D就向相反的方向用力,尽力抑制住振荡的变化。

舵机幅度系数

该项目调整的是舵机的转角从而使小球运动,但是我们通过摄像头获取到的是小球的坐标与目标点的位置信息。那么很显然我们需要给摄像头反馈出来的像素信息再乘上一个幅度系数k才能成为舵机的转角数据。舵机的转角需要有个阈值,不然很可能在意外情况下损坏机械结构(血的教训)。

这个幅度系数k需要根据当前舵机的情况和摄像头的画面尺寸不断尝试出来的,没有什么技巧可言。

​​​​​​​

确定PID参数的技巧

那么在该项目中,要如何快速调整PID的参数呢?我们先调x轴的PID参数,观察小球是否能在x轴方向回到中点。先调比例P,比例P不能过大,过大的话小球会飞出去,过小也不行,小球半天过不去。调好了比例P就去调节微分D,积分I可以先不调,因为该项目对积分I的需求不是很大。微分D可以防止你的小球一下就飞出去,小球速度非常快的时候可以迅速反应,如果说积分I是代表着过去,那么微分D就是预测着未来。如果你的系统总感觉反应慢一拍,小球的速度非常快,都要飞出去了,平板还是斜的不够多,那么就需要调大一些微分D了。

调好了x轴,就单独调y轴,不要两个维度一起调,不然是那个维度出问题了都不知道。

代码开源

打不开GitHub的小伙伴可以私信我,我会单独发给你,最后是否可以点个赞并且关注一下呢~

https://github.com/KevenDuan/BallControlSystem

  • 24
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Keven1Duan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值