1、前言

文章将基于上一篇博客倒立摆自动控制学习笔记(二)的数学模型,设计PID控制器,即
在这里插入图片描述

符号 含义 符号 含义
M M M 小车质量 m m m 摆杆质量
b 1 b_1 b1 小车移动阻尼 b 2 b_2 b2 摆杆转动阻尼
x x x 小车位置(水平向右为正) θ \theta θ 摆杆摆动的角度(逆时针转动为正)
F F F 作用到小车的外力(水平向右为正) l l l 转动关节到摆杆质心的长度
N 车 N_车 N 摆杆对小车的力水平分量 I I I 摆杆绕质心的转动惯量
N 杆 N_杆 N 小车对摆杆的力水平分量 P 杆 P_杆 P 小车对摆杆的力竖直分量
f f f 空气阻力 C d C_d Cd 阻力系数
ρ \rho ρ 空气密度 A A A 摆杆的特征面积

F − N 车 − b 1 x ˙ = M x ¨ N 杆 − f = m ( x ¨ − θ ¨ l c o s θ + θ ˙ 2 l s i n θ ) P 杆 − m g = − m ( θ ¨ l s i n θ + θ ˙ 2 l c o s θ ) P 杆 l s i n θ + N 杆 l c o s θ − b 2 θ ˙ = I θ ¨ N 车 = N 杆 f = 1 2 C d ρ x ˙ ∣ x ˙ ∣ A 直立 c o s θ (1-1) \begin{align*} &F-N_车-b_1\dot{x}=M\ddot{x}\\ &N_杆-f=m(\ddot{x}-\ddot{\theta}lcos\theta+\dot{\theta}^2lsin\theta)\\ &P_杆-mg=-m(\ddot{\theta}lsin\theta+\dot{\theta}^2lcos\theta)\\ &P_杆lsin\theta+N_杆lcos\theta-b_2\dot{\theta}=I\ddot{\theta}\\ &N_车=N_杆\\ &f=\frac{1}{2}C_d\rho \dot{x}|\dot{x}|A_{直立}cos\theta \end{align*} \tag{1-1} FNb1x˙=Mx¨Nf=m(x¨θ¨lcosθ+θ˙2lsinθ)Pmg=m(θ¨lsinθ+θ˙2lcosθ)Plsinθ+Nlcosθb2θ˙=Iθ¨N=Nf=21Cdρx˙x˙A直立cosθ(1-1)

2、级联PID控制器设计

微分方程直接参考上一篇文章倒立摆自动控制学习笔记(三):LQR控制器设计的结果:
θ ¨ = 19.6 θ − 0.4 x ˙ + 1.33 F x ¨ = 3.27 θ − 0.27 x ˙ + 0.89 F (2-1) \begin{align*} &\ddot{\theta}=19.6\theta-0.4\dot{x}+1.33F\\ &\ddot{x}=3.27\theta-0.27\dot{x}+0.89F \end{align*} \tag{2-1} θ¨=19.6θ0.4x˙+1.33Fx¨=3.27θ0.27x˙+0.89F(2-1)
将等号两边拉氏变换,得到
Θ ( s ) = 1.33 s 2 − 19.6 F ( s ) − 0.4 s s 2 − 19.6 X ( s ) X ( s ) = 0.89 s 2 + 0.27 s F ( s ) + 3.27 s 2 + 0.27 s Θ ( s ) (2-2) \begin{align*} &\Theta(s)=\frac{1.33}{s^2-19.6}F(s)-\frac{0.4s}{s^2-19.6}X(s)\\ &X(s)=\frac{0.89}{s^2+0.27s}F(s)+\frac{3.27}{s^2+0.27s}\Theta(s) \end{align*} \tag{2-2} Θ(s)=s219.61.33F(s)s219.60.4sX(s)X(s)=s2+0.27s0.89F(s)+s2+0.27s3.27Θ(s)(2-2)
可以得到传递函数
G θ ( s ) = 1.33 s 2 − 19.6 G x ( s ) = 0.89 s 2 + 0.27 s (2-3) \begin{align*} &G_\theta(s)=\frac{1.33}{s^2-19.6}\\ &G_x(s)=\frac{0.89}{s^2+0.27s} \end{align*} \tag{2-3} Gθ(s)=s219.61.33Gx(s)=s2+0.27s0.89(2-3)
注意:这里 θ \theta θ x x x有很强的耦合,两个传递函数不能看做两个系统。
如果要控制摆角的同时控制小车位移,那么倒立摆就是一个控制输入 F F F控制两个控制量 θ \theta θ x x x,一般有两种方案:一个外环+一个内环的级联PID控制,以及权重混合的PID控制,在中文互联网能找到的主要是前者,不过后者在谷歌学术找到的论文中采用的更为常见一些。
本文将以级联PID控制方案进行设计,级联PID控制流程图如下:
在这里插入图片描述
其中带下标 d d d 的是给定量。这是摆角控制优先级大于位置控制的情况,也可以反过来(A New Approach on Stabilization Control of an Inverted Pendulum, Using PID Controller)。

内环

我们先看内环。
− 0.4 s s 2 − 19.6 X ( s ) -\frac{0.4s}{s^2-19.6}X(s) s219.60.4sX(s)视作干扰信号,所以要将其补偿掉。
F ( s ) = P I D ( s ) [ Θ d ( s ) − Θ ( s ) ] + 0.3 s X ( s ) (2-4) F(s)=PID(s)[\Theta_d(s)-\Theta(s)]+0.3sX(s)\tag{2-4} F(s)=PID(s)[Θd(s)Θ(s)]+0.3sX(s)(2-4)

在这里插入图片描述
(红色部分为系统固有属性,无法进行任何修改)
显然,系统 G θ ( s ) G_\theta(s) Gθ(s)有一个右半平面极点。
设计PD控制器的 K p = 25 K_p=25 Kp=25 K d = 5 K_d=5 Kd=5,并绘制奈奎斯特图:

% 画出内环(带控制器)开环传递函数的奈奎斯特图、伯德图
clear
clc
f1 = [5 25];%分子
f2 = [0 1.33];%分子
f3 = [0 1];%分母
f4 = [1 0 -19.6];%分母
%conv的用处是把他们求成多项式的形式
num = conv(f1,f2);%求多项式
den = conv(f3,f4);%求多项式
sys = tf(num,den)
%画出所有参数
figure(1)
margin(sys);
% grid on;
%不画,直接给参数赋值出来
%[Gm,Pm,Wcg,Wcp] = margin(sys);%Gm幅值裕度 Pm相角裕度 Wcg穿越频率 Wcp剪切频率
figure(2)
nyquist(sys);  % 画奈奎斯特图
% grid on;

在这里插入图片描述
在这里插入图片描述
奈奎斯特图绕(-1, j0)点圈数和 G θ ( s ) G_\theta(s) Gθ(s)右半平面极点个数相同,系统稳定。稳定裕度在Bode图中也可以得到。
其实如果想调细一点,可以用相位超前校正来调(根据伯德图计算pid参数方法原理),或者参考《现代控制工程》,直接根据误差系数、相位裕度指标解出一组PID参数,我这里比较偷懒。

外环

在这里插入图片描述
这控制框图比我预想中还要复杂一些,第一反应就是上梅森增益公式。但是我们有强大的matlab,用下面的代码可以硬算出蓝色方框里的传递函数。

clear; clc;
syms s x F theta theta_d % 参数

eq1 = F == (theta_d-theta)*(5*s+25) + 0.3*s*x;
eq2 = theta == F*1.33/(s^2-19.6) - x*0.4*s/(s^2-19.6);
eq3 = s*x == theta*3.27/(s+0.27) + F*0.89/(s+0.27);
eqns = [eq1, eq2, eq3];

vars = [x F theta];

% 解方程
sol = solve(eqns, vars);

theta_sol = sol.theta
x_sol = sol.x

% 整理传递函数
G_theta_d_x = x_sol / theta_d;

% 使用collect函数按s的幂次合并同类项
[G_theta_d_x_num, G_theta_d_x_den] = numden(G_theta_d_x);  % 提取分子分母
G_theta_d_x_num_collected = collect(G_theta_d_x_num, s);  % 按s合并分子
G_theta_d_x_den_collected = collect(G_theta_d_x_den, s);  % 按s合并分母
G_theta_d_x = G_theta_d_x_num_collected / G_theta_d_x_den_collected

得到
G θ d − x ( s ) = 4.45   s 3 + 22.25   s 2 − 65.47   s − 327.37   s 4 + 6.65   s 3 + 13.67   s 2 + 0.02   s (2-5) G_{\theta_d-x}(s)=\frac{4.45\,s^3 +22.25\,s^2 -65.47\,s-327.37}{\,s^4 +6.65\,s^3 +13.67\,s^2 +0.02\,s} \tag{2-5} Gθdx(s)=s4+6.65s3+13.67s2+0.02s4.45s3+22.25s265.47s327.37(2-5)
特征方程
D ( s ) =   s ( s 3 + 6.65   s 2 + 13.67   s + 0.02 ) (2-6) D(s)=\,s(s^3 +6.65\,s^2 +13.67\,s +0.02) \tag{2-6} D(s)=s(s3+6.65s2+13.67s+0.02)(2-6)
为简单起见,我们直接看括号里那一部分即可,画劳斯表:

第1列 第2列
s 3 s^3 s3 1 13.67
s 2 s^2 s2 6.65 0.02
s 1 s^1 s1 13.67 0
s 0 s^0 s0 0.02

第一列没有出现变号的情况,说明 G θ d − x ( s ) G_{\theta_d-x}(s) Gθdx(s)没有右半平面的极点,有一个在虚轴上的极点。
设计控制器
K ( s ) = − 0.01 s 10 s + 1 (2-7) K(s)=-\frac{0.01s}{10s+1} \tag{2-7} K(s)=10s+10.01s(2-7)
(控制器看着又怪又四不像,但是我实在搞不出更好的来了)
画出奈奎斯特图:
在这里插入图片描述
放大后:
在这里插入图片描述
绕(-1, j0)点0圈,系统稳定。
仿真一下看看:
在这里插入图片描述
位移有不小的稳态误差,只能说效果很一般。
仿真包括main.m和pendulum_friction_double.slx两个文件,将两个文件放到同一路径,用2024a或更高版本的matlab打开main.m,将代码中的语句:

simout = sim("pendulum_friction_PID", 2);  % 参数为模型名和仿真时间

中的模型名称改为你想要运行的,修改仿真时间,然后运行main.m即可。

仿真文件路径:Pendulum-Control

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐