从控制理论的根轨迹法和稳定性分析谈到舵机PD控制代码实现

2023-11-05

在上一次谈到基于MPU6050的基于一阶互补滤波算法实现后,本来想接着就自适应一阶互补滤波和卡尔曼滤波再写一篇的,但是卡尔曼滤波算法我自己写出来并进行姿态解算后发现效果不很好,才疏学浅,等我调好了再写吧,昨天花了半下午做了一个基于MPU6050的舵机云台自稳定系统,采用PD控制,下面就从控制理论原理到代码实现来谈一谈。
1.P项对系统性能影响的分析
假设现在我们有如下一个系统:
在这里插入图片描述

这个系统采用简单的比例控制,当kp=1时,我们来分析一下他的稳定性,从奈奎斯特曲线的角度来分析:

num=[1];
kp=1;
den=[1 1 -2];
sys=tf(num,den);
nyquist(sys);

在这里插入图片描述
由P-Z=N这个奈奎斯特判据来看,P作为开环传递函数在右半平面的极点数等于1,N作为奈奎斯特曲线逆时针绕(-1,0j)这个点的圈数等于0,所以Z等于1,意味着闭环传递函数在右半平面的极点数为1,系统不稳定。我们可以通过时域响应来验证一下:
在这里插入图片描述
我们扩大kp值,将kp变为10:

num=[10];
kp=10;
den=[1 1 -2];
sys=tf(num,den);
nyquist(sys);

在这里插入图片描述
由P-Z=N可以,P=1,N=1,所以Z=0,闭环系统稳定。老规矩验证一波:
在这里插入图片描述
可以看出,时域响应确实是稳定的,但是存在稳态误差。
现在我们可以得到一个结论:单纯的比例控制,增大或者减小比例系数kp可以改变系统的稳定性。
我们再次增大kp值,这次我们将kp增大到50:
在这里插入图片描述
与上面kp等于10的时域响应比较可得,其稳态误差减小了但是瞬态响应振荡加剧了。所以我们又可以得到一个结论:在系统稳定前提下,增大比例系数kp可以减小稳态误差,但是会导致系统振荡加剧。
下面从数学角度分析一下:
首先求出系统的闭环传递函数:
在这里插入图片描述
总所周知,在拉普拉斯变换中有一个终值定理,假设输入为一个阶跃响应,由终值定理可得:
在这里插入图片描述
当t趋近于无穷时,s趋近于0,所以此时输出为:
在这里插入图片描述
由于输入为r(t)=1,所以y(t)-r(t)为:
在这里插入图片描述

当kp增大时,稳态误差减小,这是有数学依据的。
那么为什么会导致系统的振荡加剧呢,这次我们感性一点分析。我们知道了系统的闭环传递函数为:
在这里插入图片描述
输入为阶跃值1,那么系统的时域表达式可写作:
在这里插入图片描述
λ1和λ2为闭环传递函数的两个极点,如果λ1和λ2实部都小于0那么系统稳定,如果有虚部存在,那么就会产生振荡。由韦达定理可以求得两个极点为:
在这里插入图片描述
当kp>9/4时根号下的部分为负数,会出现虚数,在e的指数部分出现虚数i,怎么这么熟悉,咦咦咦,记得有位大神叫欧拉,提出了一个强的一批的欧拉公式,把指数和三角函数联系在了一起,下面来看看这个伟大的公式:
在这里插入图片描述
那么一切都好理解了,如果特征值存在虚部项,那么y(t)里就会存在由特征值实部决定的eλt衰减项以及由特征值虚部决定的三角函数振荡项,实部大小决定收敛速度,虚部(虚部也是实数啊)大小决定振荡剧烈程度。当kp>9/4时,kp越大,实部永远等于-0.5,衰减速度不变,虚部绝对值越大,三角函数部分系数越大,振荡越剧烈,所以从数学上证明了kp越大,振荡越剧烈。在这个系统里,我们可以总结一下,kp=2和kp=9/4是两个分界点。
当kp<2,系统不稳定(前面提到过);
当2<kp<9/4,系统稳定且不振荡,当kp=2.2时;
在这里插入图片描述
当kp>2时,系统稳定且存在振荡,kp越大振荡越剧烈但稳态误差较小。
以上便是对单纯的比例控制对系统影响的分析,大家还可以从开环bode图的角度去分析系统的稳定性,其实在奈奎斯特曲线中也能看出相位裕度和幅值裕度从而进行稳定性分析,这里我就贴一个kp=10时这个系统的开环bode图:

num=[10];
kp=2.2;
den=[1 1 -2];
sys=tf(num,den);
bode(sys);

开环伯德图分析系统性能不外乎幅值裕度和相位裕度,当幅频特性曲线与横坐标相交时对应的频率为截止频率,当相频特性特性曲线通过-(2k+1)π时对应的频率为穿越频率,在截止频率点处求相位裕度,在穿越频率点处求幅值裕度,公式就不细说了,说下结论,相位裕度越大,幅值裕度越大,系统越稳定,截止频率越大,系统响应也越快,幅值裕度越大,系统对输入信号跟随性越好,感性上来认识就是越像输入曲线,各位同志们可以下来自己在MATLAB里按照这个规律实验一下。有机会的话下次详细讲讲bode下的系统稳定性分析。
D项对系统性能的影响分析:
老规矩,先看仿真结果,再做数学分析。既然没有做任何计算,上来就随便搞一个数字,让比例系数kp=50,这样静态误差小一点,然后让微分项系数kd=20。仿真一波:
在这里插入图片描述
在这里插入图片描述
图中黄线为加入微分控制的时域响应,蓝色线为纯比例控制,我们发现加入微分量后超调量减小了,振荡也消失了,但是系统的响应速度降低了,这只是一个感性的认识,在工程中使用纯PD控制也很少,毕竟这玩意对噪声太敏感,你要是拿这个控制器去控制电机或者舵机,如果把传感器和主控制器放在电机或舵机附件,那你就会体验到什么叫蹦蹦床的快乐了。所以工程中一般都使用一个叫做超前补偿器的玩意,然后整个控制方法也就被称为不完全微分PD控制(其实不完全微分PID控制用的比较多),好了,先说到这里,总结一下我们现在遇到的问题,
1.怎么从数学角度来证明微分项加入后对系统性能的影响;
2.为什么要使用超前补偿器,他对系统会带来什么影响,为什么超前补偿器噪声不敏感。
下面我们从根轨迹的角度来分析问题1,根轨迹法是经典控制理论中分析系统性能,设计系统模态的一个令人赏心悦目的方法,这里不介绍根轨迹法如何绘制,因为我们有matlab,记得有位大佬说过,matlab为低能的用户提供方便的程序集成,确实,没有matlab,我这种低能的大学生还真就不能进行大量的科研计算,仿真建模,只能在实操中碰壁,没法用仿真指导实操,我总不能遇到什么问题就自己用C编一个函数吧,没那能耐,泰勒展开,快速傅里叶,根轨迹,bode图,那个不得写半天,matlab一个函数的事,咱们不是搞数学的,整那么多事干嘛。扯远了,下面来看看纯比例控制下的根轨迹图:

num=[1];
%kp=50;
%kd=20;
den=[1 1 -2];
sys=tf(num,den);
%bode(sys);
rlocus(sys);%求根轨迹
axis([-2.5 2 -6 6]);

在这里插入图片描述
在这里插入图片描述

我们可以看出,当增益为2时,为临界点,随着增益kp的增大,系统都为负根,系统稳定,但是随着kp的增大,根进入两条与x轴垂直的线内,大家可以看到,根在这两条直线上时,实部为-0.5,是不是和我们之前算的特征值的实部一样,这时候再增大kp,对不起,实部不会变了,虚部绝对值一直增大而已,然后这会造成什么现象,振荡加剧啊,那作为未来的工程师,现在的大学生,是不是要想办法改善一下这种情况,我不就是想让根的实部往左移吗,让根的虚部绝对值越小吗,贪心点的话,我想让根都落在负实轴上,离原点越远越好。既然我们有这样的想法,那我们可以假设让根落在哪个位置,然后用根轨迹上的根与零点连线与实轴正方向夹角-根与极点连线与实轴正方向的夹角=-180°的定理来确定零点应该放在哪个位置,如果我们是加一个微分项,那么就会增加一个零点,只要零点安放位置合适,按照上述原理,就会导致根轨迹的左移,达到我们想要的结果,不信我们验证一波:
加入微分项后系统变为如下(上面部分为pd控制,下面部分为p控制):
在这里插入图片描述

num=[1 2.5];
%kp=50;
%kd=20;
den=[1 1 -2];
sys=tf(num,den);
%bode(sys);
rlocus(sys);
axis([-2.5 2 -6 6]);

在这里插入图片描述
随着kp增益的增大,我们可以看到根的实部几乎是向左移动的,说明系统稳定性越好而且瞬态响应快,并且虚部没有明显增加,说明振荡是可控的,不再像之前纯比例控制一样,为了增加增益就要无限制的扩大振荡,在加入纯微分项后的系统性能得到明显改善。来看看时域响应就知道了,我们把增益kp设置为20:
在这里插入图片描述
可以看出,经过加入微分项后,系统的时域响应性能得到了极大的改善。这就是理论指导实践的威力。我们从根轨迹的角度分析了微分项对系统性能的改善。但是纯微分项对噪声太敏感了,那我们要引出问题2了。
超前补偿器,顾名思义,就是把系统的相位往前拉一拉,增加系统的相位裕度,减小系统的滞后性,把纯微分项改成不完全微分然后在和比例项一起控制系统的控制方法就叫做不完全微分控制,下图展示了纯微分到不完全微分的变化过程(纯微分到不完全微分项):
在这里插入图片描述
与kp项合并可得控制器表达式(这个表达式整体被称为超前补偿器):
在这里插入图片描述

可以看到,不完全微分PD控制和纯PD控制(下面我用超前补偿器来代替不完全微分PD控制,可以说是一个东西)相比,给系统增加了一个极点,那么如何才能保证相位超前呢,也就是说,我纯PD控制给系统增加了一个零点,但是我超前补偿器在增加一个零点的同时还增加了一个极点。这里直接给出结论,零点绝对值小于极点绝对值,就可以保证相位超前,并且由根轨迹的之前说过的-180°定理可以保证根轨迹左移,提高系统稳定性和瞬态响应性能,那么零点绝对值大于极点绝对值呢,那就叫做滞后补偿器了,如果相等怎么办,相等那不就零极点相消了嘛,对系统无影响,顺便第一下,众所周知,系统增加一个零点,相位提前90°,增加一个极点,相位滞后90°,所以纯微分PD控制也是超前补偿器,只是相位超前了90°罢了。总结一下,这里只要零点绝对值小于极点绝对值,就是一个超前补偿器。可以看出,上式零点绝对值永远小于极点绝对值,所以咱这确实是一个超前补偿器。那么下一个问题就是,为什么超前补偿器对低频噪声不敏感,看看这是啥:
在这里插入图片描述
把kds看做输入,进过一个1/1+Ts后输出,1/1+T*s是一个一阶惯性低通滤波器啊,输入经过这个滤波器后会把高频的微分噪声过滤掉,我们来看看这个一阶低通滤波器的bode图就知道了,设T为2:
在这里插入图片描述
可以看出,这个低通滤波器的截止频率为0.5rad/s,当w>0.5rad/s时,幅频特性曲线快速下降,高频噪声被滤除。这就是不完全微分对高频噪声不敏感的原因,进而得知整个超前补偿器对高频噪声不敏感。那么问题2也已经说完了,来看看仿真效果吧:
在这里插入图片描述
在这里插入图片描述
黄线为不完全微分PD控制,橙线为原始输入数据,蓝线为纯比例控制。
当采用纯PD和不完全微分PD比较时,得出下图:
在这里插入图片描述
图中蓝色线为不完全微分PD控制,黄色线为纯PD控制,可以看出不完全微分PD控制对噪声有很大的抑制作用,输出比较稳定且平滑。
我之前写了一篇一阶互补滤波的文章,如果对本文中滤波部分有不明白的读者可以去看我写的上一篇文章。
PD控制C代码实现:

/*舵机的控制方法二:固定参数的舵机Pd控制*/
/*函数目的:获取控制舵机的PWM设定值*/
/*输入参数:中线平均偏差*/
/*输出参数:舵机PWM的设定值*/
int servopdcn2(float cha)
{
	float nr,kp=500/90.0f;
	float kd=1.2;
	int PDOUT;
	static int pr;
	nr=cha;
	PDOUT=(int)(kp*nr+kd*(nr-pr));
	pr=nr;
	if(PDOUT>250)
		PDOUT=250;
	else if(PDOUT<-250)
		PDOUT=-250;
	return(PDOUT);
}

以上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从控制理论的根轨迹法和稳定性分析谈到舵机PD控制代码实现 的相关文章

  • 无监督学习K-means文本聚类实践

    无监督学习 Unsupervised Learning 希望能够发现数据本身的规律和模式 与有监督学习相比 无监督不需要对数据进行标记 这样可以节约大量的人力物力成本 某种程度上说 机器学习的终极目标就是无监督学习 从功能上看 无监督学习可
  • C++中对ODBC的API详解和使用

    本文构成 定义 API 实例 实例在最下面 一 ODBC 1 定义 即开放数据库连接 Open Database Connectivity ODBC 是数据库API的规范 该API独立于任何一个DBMS或操作系统 是为解决异构数据库间的数据

随机推荐

  • iptables Permission denied (you must be root)

    环境 Docker容器 操作 iptables L 现象 iptables v版本 can t initialize iptables table filter Permission denied you must be root 原因 i
  • 【PyTorch】冻结网络参数

    方法一 将需要固定的那部分参数的requires grad置为False 在优化器中加入filter根据requires grad进行过滤 requires grad置为False for p in net XXX parameters p
  • python开发面试刷题指南

    1 装饰器 详解Python的装饰器 装饰器的作用就是给原有函数或对象添加额外的功能 不需要变动原有代码 用于有切面需求的场景 如插入日志 性能测试等产经 返回值是一个函数对象 优点 抽离出函数功能本身无关的雷同代码 可以重用 缺点 经过装
  • 模版之编译期断言

    title 模版之编译期断言 date 2023 02 20 20 28 08 permalink pages 83d2a5 categories 通用领域 编程语言 C tags C 元编程 author name zhengzhibin
  • Redhat6.x bond配置

    bin bash cat gt etc sysconfig network scripts ifcfg bond0 lt
  • 区间预测

    区间预测 MATLAB实现基于QRCNN GRU Multihead Attention多头注意力卷积门控循环单元多变量时间序列区间预测 目录 区间预测 MATLAB实现基于QRCNN GRU Multihead Attention多头注意
  • SpringCloud Stream 消息同步和异步

    1 异步的形式有 通知 单向请求 只管发送不关心结果 请求 异步响应 一对一的交互 请求的信息不回立马返回 而是过一段时间再返回结果 消息 利用消息可以实现一对多形态的交互 2 MQ的应用场景 异步处理 流量削锋 日志处理 应用解耦 3 p
  • 网络安全实验室6.解密关

    6 解密关 1 以管理员身份登录系统 url http lab1 xseclab com password1 dc178aa12e73cfc184676a4100e07dac index php 进入网站点击忘记密码的链接 进入到重置密码的
  • 开源进展

    作为连接实体对象 人或物 的现实身份与链上身份的可信映射 实现实体对象之间安全可信的数据授权与交换 分布式身份技术解决方案在推动区块链应用繁荣及可信数据流转的过程中扮演着重要角色 WeIdentity是由微众银行自主研发并完全开源的一套分布
  • 用python读取txt文件中的数据并画各类图形展示

    捣腾了一下午 终于整出来了 帮助和我一样的菜鸟解决数据读取问题 这是所有做实验的第一步 如果这步都没有解决 下面部分如何展开 这里每一步都很详细的解释了如何操作 我的文件内容 读取数据和画图都在本文末尾都有展示 import pandas
  • 【TensorFlow-windows】(二) 实现一个去噪自编码器

    主要内容 1 自编码器的TensorFlow实现代码 详细代码注释 2 该实现中的函数总结 平台 1 windows 10 64位 2 Anaconda3 4 2 0 Windows x86 64 exe 当时TF还不支持python3 6
  • nvidia-smi 命令详解

    nvidia smi 命令详解 1 nvidia smi 面板解析 2 显存与GPU的区别 Reference nvidia smi命令详解 相关文章 nvidia smi nvcc V 及 CUDA cuDNN 安装 nvidia smi
  • 用Java实现简单计算器

    实训题 8 简单计算器 一 项目说明 实训目的 掌握 Java GUI 开发中的布局管理和事件处理机制 实训要求 1 要使用 java 的 GUI 设计出计算器界面 2 通过界面按钮 可以实现整数或浮点数的四则运算 并能将结果显示在界面中
  • 2020-01-24

    新年快乐 祝各位粉丝以及csdn的朋友 新年快乐 2020没有解决不了的问题 加油
  • Linux/Centos源码安装python3任意版本

    首先安装编译工具 sudo yum y install cmake3 glib2 devel libpcap libpcap devel libgcrypt devel glib2 devel qt devel qt5 qtbase dev
  • js小学生图区_多种方式实现js图片预览

    js多种方式图片预览 持续更新 设置自己的变量存储区 var Util file file image show img show Util file nchange function f if this files 0 type inde
  • IDEA 使用技巧

    1 idea展开折叠类中所有方法 展开 ctrl shift 折叠 ctrl shift 2 Idea中设置注释位置 自动缩进到合适位置
  • 【PID控制算法】

    PID控制小解 比例环节 P 成比例的反映偏差信号 偏差一旦产生 控制器立即产生控制作用 较小误差 积分环节 I 主要用于消除静态误差 提高系统得无差度 积分作用的强弱取决于积分时间常数 Ti Ti越 大 积分作用越弱 反之越强 微分环节
  • 如何改进研发项目文档内容质量?

    书接上回 研发项目文档重要吗 个人以为 改进研发项目文档内容质量 需要深入研发流程 梳理研发流程中的信息需求和依赖关系 完善相关的内容规范 模板 和评审规范 从系统上保障研发文档的质量 所以这段时间 协调痛点场景作为改进试点 参与到研发设计
  • 从控制理论的根轨迹法和稳定性分析谈到舵机PD控制代码实现

    在上一次谈到基于MPU6050的基于一阶互补滤波算法实现后 本来想接着就自适应一阶互补滤波和卡尔曼滤波再写一篇的 但是卡尔曼滤波算法我自己写出来并进行姿态解算后发现效果不很好 才疏学浅 等我调好了再写吧 昨天花了半下午做了一个基于MPU60