基于PID控制器的循迹小车简单演示

本文瀏覽次數

发布日期

2024年1月29日

PID演示程序

变量 数值
比例控制系数(\(P\))
积分控制系数(\(I\))
微分控制系数(\(D\))
受控制量(灰度)
小车前进速度
场地宽度
场地高度

我已经把程序的初始参数调到一个比较舒服的状态😉。但你可以试著挑战下更高的车辆速度或更窄的场地高度。

修改输入参数,按下“提交参数”按钮,下方的画面会按新参数输出仿真结果。

抱歉,此浏览器不支持HTML5

PID简介

本页面以控制小车沿著规定蓝色轨道外沿行走为例,演示了PID控制算法的运用。上方的画面展示了仿真环境中小车的运行过程。读者可以修改输入参数,按下“提交参数”按钮,重新输出仿真结果。

仿真程序在小车的前方设置了一个虚拟的灰度传感器。画面的左上角显示了它接收到的灰度信号大小。假设在初始状态下小车位于轨道上。如果小车右转,那么灰度传感器将覆盖蓝色轨道,使得灰度增大。反之,传感器覆盖白色地面,灰度减小。因此,只要能平滑地控制小车的转向,使灰度值始终保持在适中的数值附近,就能使小车始终沿著轨道边缘运动。

总而言之,在这个仿真的例子中,我们直接控制的量是小车的前进角度,而观测的量是灰度传感器的数值。

仿真采用了经典的PID控制方法。伪代码为

/*
全局变量:
 - ierror:误差的累积,初始化为0;
 - error_pre:初始误差,初始化为0;
输入  
 - value:观测到的灰度值;
 - target:目标灰度值;
 - PID参数(P、I、D);
*/
var verror = value - target;  //  误差,越暗值越大
ierror += verror;
var derror = verror - error_pre;  //  数值的变化率 
va = verror * P + ierror * I + derror * D;
error_pre = verror;

其中P参数可以说是最为重要的,它决定了误差大小和控制量之间的比例。
参数I则用于消除累计误差。设想这样一种情况:车辆的方向盘歪了一点。因此当你想摆正方向的时候,车辆实际上却在悄悄地左转。这样微小的转向也许一开始看不出来,但是随著时间的累积,方向的偏差会越来越大。参数I将误差的累积反馈到控制量,从而抑制误差的累积;
参数D则可以用来加快控制系统的反应速度。D将误差的变化率作用于控制量,使得车辆可以在感知到偏差增大的时候,提前采取措施。

后记

本文最初写于2017年五月30日,那时我还是学生。我在一堂实验课上调著PID参数,效果离预期还有一定差距就下课了。课后没有办法拿实物再做实验,于是就简单写个程序模拟下。当时比较菜(当然现在也是),所以写完程序的时候很开心。稍微冷静下来看一看,这个仿真在很多方面并不完善。 首先车辆在运动、转弯的时候都有惯性。我的仿真没有考虑这点。如果能加一个运动模型到程序里会更好; 其次,在真实的车辆/机器人上,受控制的是轮胎的转速差、车辆的转向机构,从而间接控制车辆的运动方向。受能力所限,这个仿真也没法准确模拟这些细节。

今天将这篇文章重新整理一下,但也不去过分修饰了。回头看这份粗糙的作品,还是能感觉到当时的趣味,足矣。

By @執迷 in
Tags : #自動控制原理, #PID,