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

2023-10-29

在上一次谈到基于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控制代码实现 的相关文章

  • 最受推荐的10本Python书籍

    Python是一种通用的解释型编程 主要用于Web开发 机器学习和复杂数据分析 Python对初学者来说是一种完美的语言 因为它易于学习和理解 随着这种语言的普及 Python程序员的机会也越来越大 如果你想学习Python编程 市场上就有

随机推荐

  • C++ 单例模式

    原创文章 转载请注明出处 目录 C 单例模式介绍 一 单例是什么 二 C 实现单例 2 1 基础要点 2 2 C 实现单例的几种方式 C 单例模式介绍 单例可能是最简单的一种设计模式 实现方法很多种 同时单例也有其局限性 本文对C 单例的常
  • 项目开发过程文档

    1 项目开发计划 项目开发计划内容覆盖项目整个开发周期内的人员调度 所属阶段 需求 设计 编码 测试 实施 模块划分 开始和结束时间 计划 实际 2 需求规格说明书 需求规格说明书是对客户需求的理解形成的文档 为了确定与客户需求一致 在此基
  • 人物专访

    撰写 亿欧网 木木 大模型的出现 正在开启着国内新一轮AI热潮 某种程度上 当下真正决定AI企业成败的 是能否尽早实现 技术 场景 的双轮驱动 以最近大火的大模型为例 在很多人看来 OpenAI成功的关键因素之一 正是他们在GPT 3 5模
  • java 自定义比较器用法

    什么是比较器 比较器实质就是重载比较运算符 比较器可以很好的应用在特殊标准的排序上 比较器可以很好的应对在根据特殊标准排序的结构上 代码变得异常容易 还用于范型编程 自己定义比较器是自己设置的比较类实现了 Comparator 接口 代码如
  • devc运行窗口不显示_任务栏不显示打开的窗口怎么解决

    任务栏就是指位于桌面最下方的小长条 并且可以按照个人喜好拖动并更改 可以存放大部分正在运行的程序窗口 可是近来却有朋友遇到任务栏不显示打开的窗口了 这是怎么回事呢 有没有解决办法呢 下面小编就介绍一下任务栏不显示窗口的解决方法 大家有没有遇
  • chatgpt赋能python:Python高精度计算:介绍

    Python 高精度计算 介绍 在计算机科学中 高精度计算是指可以处理更高位数的数字和更精确的计算结果 这在很多领域中都是必需的 比如金融 科学计算 密码学等等 Python 是一个支持高精度计算的语言 它的高精度计算库可以轻松地进行各种高
  • idea中@Test不能在控制台输入

    Test不能控制台输入 使用Junit的 Test测试时无法使用控制台输入 解决办法 在idea的Help gt Edit Custom VM Options 中添加如下代码 添加以下内容 不要忘了 重启idea 使用Junit的 Test
  • 11.函数

    函数 接下来开始学习函数 函数这个知识点很重要 需要认真学习 先来了解下什么是函数 函数是组织好的 可重复使用的 用来实现单一或相关功能的代码块 如何使用函数 函数是组织好的 可重复使用的 用来实现单一 或相关联功能的代码段 函数能提高应用
  • 堆与栈的区别详细总结

    1 堆与栈的区别详细总结 Fighting 的博客 CSDN博客 堆和栈的区别 2 堆和栈的区别 江雨牧 博客园 3 堆和栈的区别 内外皆秀的博客 CSDN博客 堆和栈的区别 4 一文读懂堆与栈的区别 恋喵大鲤鱼的博客 CSDN博客 堆和栈
  • FastDFS部署

    概述 FastDFS是一个开源的轻量级分布式文件系统 它对文件进行管理 功能包括 文件存储 文件同步 文件访问 文件上传 文件下载 等 解决了大容量存储和负载均衡的问题 特别适合以文件为载体的在线服务 如相册网站 视频网站等等 FastDF
  • 如何在编译器(vs2010)里设置调用别人写好的lib和dll

    这是网上找的 但是实际使用时 我只添加了红色矩形标注出来的3项就可以用 补充1 2015 9 19 22 35 这里再将自己在别的地方找到的资料补充在这里吧 如何在编译器 vs2013 里设置调用别人写好的lib和dll步骤 1 Tools
  • OpenCV - 灰度直方图绘制

    以下为借鉴的图像直方图的绘制方法 做此纪录 参考 https blog csdn net sinat 36264666 article details 78754897 void calcHist const Mat images int
  • 如何将本地代码提交到git上

    如何将本地代码提交到git上 1 首先在github上新建一个仓库 https gitee com projects new 2 在项目文件夹里右击打开Git Bash Here 设置全局名称和邮件 git config global us
  • 电脑提示vcruntime140.dll如何修复

    在我们打开游戏或者软件的时候 电脑提示vcruntime140 dll丢失该如何修复 vcruntime140 dll是Windows系统中非常重要的组件 丢失会导致很多游戏跟软件无法打开运行 小编今天就把修复的方法分享给大家 修复方法如下
  • 中文大模型评估数据集——C-Eval

    C EVAL A Multi Level Multi Discipline Chinese Evaluation Suite for Foundation Models https arxiv org pdf 2305 08322v1 pd
  • 有500块钱现金,做什么生意能一个月能赚到1万左右?

    只有500块钱的现金 就想一个月赚1万块钱 如果你没有特殊的才能没有特殊的技术 是很难实现的 500块钱说不定连试错的成本都不够 很多生意看起来赚钱很容易 但当你真正自己去体验的时候你才会发现那些表面看起来很容易赚钱的东西 到了你手里说不定
  • 【AI with ML】第 5 章 :自然语言处理简介

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • python面向对象的介绍

    面向对象的概念 python是一门面向对象的编程语言 面向对象编程中 最常见的表现就是基于类来表现 什么是类 class 类是用来描述具有相同属性和方法对象的集合 类 属性 行为 属性 特征 方法 行为 什么是对象 对象是类的实例 世间万物
  • 广义线性模型——Logistic回归模型简单绘图(2)

    使用R语言绘制超级实用的logistic回归模型图 library AER 数据 library ggplot2 作图 library ggsci 修饰图片风格 没有上述安装包的 自己安装一下 data Affairs package AE
  • 从控制理论的根轨迹法和稳定性分析谈到舵机PD控制代码实现

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