可能部分读者在读完《PID控制原理 一(开闭环控制)》,《PID控制原理 二(PID使用详解)》后依然会有很多疑问:

比如Ep(小车距离目标路径的实际距离)是怎么得到的?Sa(小车的控制转角)是被谁控制的,怎么实现的?PID控制器是在什么硬件上被执行的?等等问题。为了解决你的疑虑,现在跟着笔者一起准备起来,制作一个‘小车追踪目标路径’ 的项目吧!

先说需求:

有一辆小车(上电后会驱动后轮,速度恒定,类似小时候玩过的四驱车);另有一条路径,如下图蓝线所示,是用激光投影打出来的。现在需设计一个控制系统,使得上电小车在行进中可以自行追踪到目标路径:

在《PID控制原理 二(PID使用详解)》一文中笔者已经设计一套控制系统。确定了控制系中PID控制器的输入输出。其中输入为Ep(小车距离目标路径的实际距离--最近距离),输出为Sa(小车每次的控制转角)被控对象是“小车”

规定Ep方向:当小车在目标路径右边,则Ep>0;若小车在目标路径左边,则Ep<0

规定Sa方向:当Sa>0时,小车向左拐(小车前进方向的左);当Sa<0时,小车向右拐(小车前进方向的右)

1.真实的控制系统

为达到小车追踪目标路径的目的,设计控制系统逻辑图如下:

实际上,在真实设计时,考虑到硬件情况,我们其实无法直接使用控制器(单片机)输出Sa,对于小车转角控制来说我们必须加入一个执行器。而且为了监控Ep,需要一个距离监控器。此外在实际中被控对象不仅受到执行器的输出控制,还会受到扰动干扰(比如在《PID控制原理 二(PID使用详解)》一文中,就介绍了,行走在目标路径的小车由于受到地面石子的干扰而导致输出Ep变化)

因此,重新设计后的控制逻辑框图如下所示(这样更符合实际情况,执行器的输入暂时无法确定,因此为“?”,它取决于我们所用的真实执行器):

2.硬件篇

有了更遵循实际状况的控制逻辑图,接下来我们开始对硬件进行选取

① 被控对象:小车,使用如下小车

② 执行器:舵机

如上图所示,舵机一共有三根线,其中VCC、GND是用来为舵机供电的。PWM是用来控制舵机的,控制方式如下:

舵机的详细学习可以参考以下网址

注:由于执行器确定了,也就确定了执行器的输入为PWM波

③ 控制器:既然选定了使用舵机作执行器,那么就需要一个可以发送脉冲编码调制(PCM)的物件,笔者推荐Arduino UNO(PID的控制算法程序就加载到Arduino UNO的芯片了里面

推荐Arduino的原因是:Arduino内置了舵机控制的servo类成员函数,可以参考以下连接:

当然读者也可以选择使用51单片机,用其可编程I/O口控制输出占空比为1%~2%,频率为50Hz的PWM波形,但就是编程要麻烦很多

④ 距离监控器:使用激光雷达扫描测距

当然要想得到小车距离目标路径的最近距离光有激光雷达可能是不够的,这其中或许还需要一堆算法的支持。首先路径的识别可能就是个麻烦,雷达不会直接把小车距离目标路径的最近距离告诉控制器,而是需要读者进行解算。但是我们现在主要考虑的是控制器的设计,那就假设“路径识别”,“距离测量Ep(有方向)”这件事情已经有大神帮我们办好了,OK这样的话,我们就直接拿Ep来用就行。

现在,我们将硬件加入到控制逻辑图中:

所以,只有小车和一条路径的我们,就需要去采购了!

一个舵机,一个激光雷达外加一个Arduino UNO控制板,有了这些我们就可以实现让小车追踪路径了!

3. 仿真篇

但采购之前,笔者想验证下我们的PID控制器的好坏,最好能对PID参数进行一个简单调节。但是没有硬件该怎么验证该控制逻辑和PID控制器的合理性呢?Simulink仿真请了解下:

我们知道,在真实的系统中,被控对象小车的输出Ep(t)会随着Sa(t)的变化而变化【t 是控制周期】

Ep(t)会随着Sa(t)的变化而变化的特性也叫被控对象特性:指被控对象输入与输出之间的关系,即当被控对象的输入量发生变化时,对象的输出量是如何变化、变化的快慢程度以及最终变化的数值等。对象的输入量有控制作用和扰动作用,输出量是被控变量,因此,讨论对象特性,就要分别讨论控制作用通过控制通道对被控变量的影响,和扰动作用通过控制通道对被控变量的影响。定量地表达对象输入输出关系的数学表达式,称为该对象的数学模型

因此为了仿真需要,我们必须建立被控对象特性的数学模型,以使得仿真接近真实

笔者经过推算得出了Ep(t)与Sa(t)的关系建立了以下数学模型(该模型考虑当目标路径为直线时,且比较简单,属于理想状态 - 即不考虑摩擦力,控制器硬件响应,扰动作用等问题):

其中t为控制周期,单位为秒,t为正整数(取0,1,2,3.....)

N为小车距离目标路径的初始距离

M为小车每秒行进的距离

Ep的单位为“m”

舵机控制时Sa的单位为“ °”,计算时需要转换为弧度

3.1 仿真准备

接下来我们假设Arduino UNO的控制周期为1s,即t=1

小车距离目标路径的初始距离N=15m

小车每秒行走M=12m

那么小车多久能走到目标路径呢?

3.2 仿真开始

为了解决小车多久能走到目标路径的问题,现在我们使用Simulink进行仿真:如下图所示,首先设定仿真步长(控制周期)为1:

然后按照控制逻辑图建立以下模型:

其中PID模块为simulink自带模块,Controlled Object模块按照被控对象特性的数学模型建立,其内部如下图(Control period是一个计数器模块)

Control period模块:

如图中所示,我们令N=15,M=12;另外PID控制器,只使用P项(P=5.5),设定如下:

最终仿真结果:

当有小车距离目标路径为 15m,小车速度为12m/s。则使用PID控制器控制小车转角Sa且只使用P项,且P=5.5时,那么 5s 后,小车会到达目标路径

实际在进行控制系统的开发过程中,为了验证控制逻辑和控制器算法的可行性,在没有硬件支撑的状况下,仿真是一个特别好的验证环境。当然,读者应该也发现了,仿真最大的难点就是对被控对象的数学模型建立模拟,这实在是由于真实的环境太过复杂,所以在进行模拟仿真时,一般都会对被控对象进行简化,只建立与控制系统关联性最大的那部分。

而最终PID参数调节还是得放在真实环境中。但是如果仿真环境建立的特别牛的话,利用仿真调整一个基础的PID参数,也是非常不错的选择。