Matlab 仿真——单自由度倒立摆(1)系统建模

1. 受控对象与设计要求

该例的系统包含一个装有一个倒立摆的小车。我们的控制目标是通过给小车作用一个力,使顶部的倒立摆不落下来。下图标示出了各个变量的含义。
在这里插入图片描述
对于这个例子,我们有以下参数:
(M) 小车质量 0.5 kg
(m) 倒立摆质量 0.2 kg
(b) 小车的摩擦系数 0.1 N/m/sec
(l) 转动点到倒立摆质心的长度 0.3 m
(I) 倒立摆的转动惯量 0.006 kg.m^2
(F) 小车受到的力
(x) 小车的位置坐标
(theta) 倒立摆与垂线的角度

我们会用不同的方法设计该系统的控制器:PID,根轨迹,频域分析,状态空间。由于PID,根轨迹以及频域分析法最适合SISO系统的分析研究,因此用这三种方法的时候我们不考虑小车的位置,仅仅考虑如何控制好倒立摆的角度。我们会设计一款控制器,使得小车收到一个冲击(1Nsec)时仍能保持倒立摆垂直,设计要求是5s内稳定倒立摆,且倒立摆角度与稳定状态下的角度相比不超过0.05 弧度。倒立摆的初始位置垂直于地面。因此,我们可以总结出我们的设计需求:

  1. θ的稳定时间 < 5s
  2. |θ-θ0| < 0.05 radians

而对于状态空间设计方法,我们得以能够处理多输出系统。因此,在用状态空间设计法的时候我们尝试同时控制倒立摆的角度以及小车的位置。以下是我们的设计需求:

  1. x 与 θ 的稳定时间 < 5s
  2. x 的上升时间 < 0.5s
  3. |θ-θ0| < 0.05 radians (也就是20°)
  4. 对于x和θ来说,稳态误差 < 2%

2. 力分析与系统方程

下图是该系统的受力分析图:
在这里插入图片描述
水平方向对小车进行受力分析得到(1)式:
M x ¨ + b x ˙ + N = F M\ddot{x}+b\dot{x}+N = F Mx¨+bx˙+N=F
你也可以在竖直方向对小车进行受力分析,但没什么卵用。接着在水平方向对倒立摆进行受力分析,得到(2)式 (这一步推导有点快,请参考这个文档):
N = m x ¨ + m l θ ¨ cos ⁡ θ − m l θ ˙ 2 sin ⁡ θ N= m\ddot{x}+ml\ddot{\theta}\cos\theta-ml\dot{\theta}^2\sin\theta N=mx¨+mlθ¨cosθmlθ˙2sinθ
接着把(2)式代入到(1)式得到该系统的第一个动力学公式:
第一个动力学方程 ( M + m ) x ¨ + b x ˙ + m l θ ¨ cos ⁡ θ − m l θ ˙ 2 sin ⁡ θ = F (M+m)\ddot{x}+b\dot{x}+ml\ddot{\theta}\cos\theta-ml\dot{\theta}^2\sin\theta=F (M+m)x¨+bx˙+mlθ¨cosθmlθ˙2sinθ=F
为了得到第二个动力学公式,我们在垂直于倒立摆的方向上列出力平衡方程:
P sin ⁡ θ + N cos ⁡ θ − m g sin ⁡ θ = m l θ ¨ + m x ¨ cos ⁡ θ P\sin\theta+N\cos\theta-mg\sin\theta=ml\ddot{\theta}+m\ddot{x}\cos\theta Psinθ+Ncosθmgsinθ=mlθ¨+mx¨cosθ
左边的三项不难理解,右边的第一项为引起转动加速度的力,第二项为引起平动加速度的力。为了消去P和N,我们再列出关于倒立摆重心的转动惯量方程:
− P l sin ⁡ θ − N l cos ⁡ θ = I θ ¨ -Pl\sin\theta-Nl\cos\theta=I\ddot{\theta} PlsinθNlcosθ=Iθ¨
稍微整合一下上述两个方程得到我们要用的第二个动力学方程:
第二个动力学方程 ( I + m l 2 ) θ ¨ + m g l sin ⁡ θ = − m l x ¨ cos ⁡ θ (I+ml^2)\ddot{\theta}+mgl\sin\theta=-ml\ddot{x}\cos\theta (I+ml2)θ¨+mglsinθ=mlx¨cosθ
上述两个动力学方程是非线性的,为了采用线性系统的方法去设计控制器,还需要把上述两个动力学方程线性化一下。因此我们假设倒立摆的平衡位置 θ \theta θ = π \pi π,且倒立摆只在平衡位置下小范围内摆动。我们用 ϕ \phi ϕ 代表倒立摆与平衡位置的角度偏差,那么倒立摆在任意时刻的位置 θ \theta θ = π \pi π + ϕ \phi ϕ。有了上述线性化假设之后,我们可以得到:

  1. cos ⁡ θ = cos ⁡ ( π + ϕ ) ≈ − 1 \cos \theta = \cos(\pi + \phi) \approx -1 cosθ=cos(π+ϕ)1
  2. sin ⁡ θ = sin ⁡ ( π + ϕ ) ≈ − ϕ \sin \theta = \sin(\pi + \phi) \approx -\phi sinθ=sin(π+ϕ)ϕ
  3. θ ˙ 2 = ϕ ˙ 2 ≈ 0 \dot{\theta}^2 = \dot{\phi}^2 \approx 0 θ˙2=ϕ˙20

将上述结果带入到我们的动力学方程组中得到:
第一个动力学方程 ( M + m ) x ¨ + b x ˙ − m l ϕ ¨ = u (M+m)\ddot{x}+b\dot{x}-ml\ddot{\phi}=u (M+m)x¨+bx˙mlϕ¨=u
第二个动力学方程 ( I + m l 2 ) ϕ ¨ − m g l ϕ = m l x ¨ (I+ml^2)\ddot{\phi}-mgl\phi=ml\ddot{x} (I+ml2)ϕ¨mglϕ=mlx¨

2.1 转换方程

对动力学方程组分别做拉氏变换
( I + m l 2 ) Φ ( s ) s 2 − m g l Φ ( s ) = m l X ( s ) s 2 (I+ml^2)\Phi(s)s^2-mgl\Phi(s)=mlX(s)s^2 (I+ml2)Φ(s)s2mglΦ(s)=mlX(s)s2
( M + m ) X ( s ) s 2 + b X ( s ) s − m l Φ ( s ) s 2 = U ( s ) (M+m)X(s)s^2+bX(s)s-ml\Phi(s)s^2=U(s) (M+m)X(s)s2+bX(s)smlΦ(s)s2=U(s)
要得到输入 U ( s ) U(s) U(s)与输出 Φ ( s ) \Phi(s) Φ(s) 的关系,我们需要消掉 X ( s ) X(s) X(s),于是经过一系列的化简代入我们最终得到:
P p e n d ( s ) = Φ ( s ) U ( s ) = m l q s s 3 + b ( I + m l 2 ) q s 2 − ( M + m ) m g l q s − b m g l q [ r a d N ] P_{pend}(s) = \frac{\Phi(s)}{U(s)}=\frac{\frac{ml}{q}s}{s^3+\frac{b(I+ml^2)}{q}s^2-\frac{(M+m)mgl}{q}s-\frac{bmgl}{q}} \qquad [ \frac{rad}{N}] Ppend(s)=U(s)Φ(s)=s3+qb(I+ml2)s2q(M+m)mglsqbmglqmls[Nrad]
P c a r t ( s ) = X ( s ) U ( s ) = ( I + m l 2 ) s 2 − g m l q s 4 + b ( I + m l 2 ) q s 3 − ( M + m ) m g l q s 2 − b m g l q s [ m N ] P_{cart}(s) = \frac{X(s)}{U(s)} = \frac{ \frac{ (I+ml^2)s^2 - gml } {q} }{s^4+\frac{b(I+ml^2)}{q}s^3-\frac{(M+m)mgl}{q}s^2-\frac{bmgl}{q}s} \qquad [ \frac{m}{N}] Pcart(s)=U(s)X(s)=s4+qb(I+ml2)s3q(M+m)mgls2qbmglsq(I+ml2)s2gml[Nm]
其中:
q = [ ( M + m ) ( I + m l 2 ) − ( m l ) 2 ] q=[(M+m)(I+ml^2)-(ml)^2] q=[(M+m)(I+ml2)(ml)2]

2.2 状态空间

有了线性化之后的动力学方程组,一顿化简得到:
[ x ˙ x ¨ ϕ ˙ ϕ ¨ ] = [ 0 1 0 0 0 − ( I + m l 2 ) b I ( M + m ) + M m l 2 m 2 g l 2 I ( M + m ) + M m l 2 0 0 0 0 1 0 − m l b I ( M + m ) + M m l 2 m g l ( M + m ) I ( M + m ) + M m l 2 0 ] [ x x ˙ ϕ ϕ ˙ ] + [ 0 I + m l 2 I ( M + m ) + M m l 2 0 m l I ( M + m ) + M m l 2 ] u \left[{\begin{array}{c}\dot{x}\\ \ddot{x}\\ \dot{\phi}\\ \ddot{\phi}\end{array}}\right] =\left[{\begin{array}{cccc}0&1&0&0\\0&\frac{-(I+ml^2)b}{I(M+m)+Mml^2}&\frac{m^2gl^2}{I(M+m)+Mml^2}&0\\0&0&0&1\\0&\frac{-mlb}{I(M+m)+Mml^2}&\frac{mgl(M+m)}{I(M+m)+Mml^2}&0\end{array}}\right]\left[{\begin{array}{c}x\\ \dot{x}\\ \phi\\ \dot{\phi} \end{array}}\right]+\left[{\begin{array}{c}0\\\frac{I+ml^2}{I(M+m)+Mml^2}\\0 \\\frac{ml}{I(M+m)+Mml^2}\end{array}}\right]u x˙x¨ϕ˙ϕ¨=00001I(M+m)+Mml2(I+ml2)b0I(M+m)+Mml2mlb0I(M+m)+Mml2m2gl20I(M+m)+Mml2mgl(M+m)0010xx˙ϕϕ˙+0I(M+m)+Mml2I+ml20I(M+m)+Mml2mlu
y = [ 1 0 0 0 0 0 1 0 ] [ x x ˙ ϕ ϕ ˙ ] + [ 0 0 ] u {\bf y} =\left[{\begin{array}{cccc}1&0&0&0\\0&0&1&0\end{array}}\right]\left[{\begin{array}{c} x\\ \dot{x}\\ \phi\\ \dot{\phi}\end{array}}\right]+\left[{\begin{array}{c}0\\0\end{array}}\right]u y=[10000100]xx˙ϕϕ˙+[00]u
该系统的输出有两个,一是小车的位置 x x x ,二是倒立摆的角度 θ \theta θ ,因此 y y y有两项

3. Matlab表达

现在我们就可以在Matlab里面表达出我们的系统了

3.1 转换方程

M = 0.5;
m = 0.2;
b = 0.1;
I = 0.006;
g = 9.8;
l = 0.3;
q = (M+m)*(I+m*l^2)-(m*l)^2;
s = tf('s');

P_cart = (((I+m*l^2)/q)*s^2 - (m*g*l/q))/(s^4 + (b*(I + m*l^2))*s^3/q - ((M + m)*m*g*l)*s^2/q - b*m*g*l*s/q);

P_pend = (m*l*s/q)/(s^3 + (b*(I + m*l^2))*s^2/q - ((M + m)*m*g*l)*s/q - b*m*g*l/q);

sys_tf = [P_cart ; P_pend];

inputs = {'u'};
outputs = {'x'; 'phi'};

set(sys_tf,'InputName',inputs)
set(sys_tf,'OutputName',outputs)

sys_tf

输出:
在这里插入图片描述

3.2 状态空间

M = .5;
m = 0.2;
b = 0.1;
I = 0.006;
g = 9.8;
l = 0.3;

p = I*(M+m)+M*m*l^2; %denominator for the A and B matrices

A = [0      1              0           0;
     0 -(I+m*l^2)*b/p  (m^2*g*l^2)/p   0;
     0      0              0           1;
     0 -(m*l*b)/p       m*g*l*(M+m)/p  0];
B = [     0;
     (I+m*l^2)/p;
          0;
        m*l/p];
C = [1 0 0 0;
     0 0 1 0];
D = [0;
     0];

states = {'x' 'x_dot' 'phi' 'phi_dot'};
inputs = {'u'};
outputs = {'x'; 'phi'};

sys_ss = ss(A,B,C,D,'statename',states,'inputname',inputs,'outputname',outputs)

输出
在这里插入图片描述
我们可以通过把状态空间表达转换为转换方程:

sys_tf = tf(sys_ss)

输出
在这里插入图片描述
我们发现上述转换方程里面有系数非常接近于零,这是由于Matlab在四舍五入的时候带来的小误差。我们完全可以手动把这些系数改为0。完了之后我们这里转换得到的转换方程和之前我们直接得到转换方程表征的应该是完全一样的系统

4. 引用

https://ctms.engin.umich.edu/CTMS/index.php?example=InvertedPendulum&section=SystemModeling

  • 10
    点赞
  • 170
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
倒立摆是一个经典的控制系统问题,在控制理论中有着广泛的应用。它的建模可以使用拉格朗日方程进行描述,通过引入状态变量和输入变量,可以得到倒立摆的状态空间方程。然后可以使用MATLAB进行仿真控制设计。 具体地,建模步骤如下: 1. 定义状态变量:倒立摆可以用两个旋转角度来描述,一个是摆杆与竖直方向的夹角(倾斜角,用theta表示),另一个是摆杆的角速度(用theta_dot表示)。因此我们可以定义状态向量x=[theta;theta_dot]。 2. 定义输入变量:为了控制倒立摆,我们需要给其提供一个输入,一般来说是摆杆底部的水平力。我们可以将水平力作为输入变量u。 3. 拉格朗日方程:用拉格朗日方程可以获得倒立摆系统的动力学模型,即状态空间方程。拉格朗日方程是关于系统能量和力学约束的方程,可以用来描述系统的运动。倒立摆的拉格朗日方程如下: m*L^2*theta_ddot + mgL*sin(theta) = mL^2*u - c*theta_dot 其中,m是摆杆的质量,L是摆杆的长度,g是重力加速度,c是摩擦阻力系数。 4. 状态空间方程的表示:使用状态变量和输入变量,可以得到倒立摆的状态空间方程: x_dot = [theta_dot;-(g/L)*sin(theta) + (1/(m*L^2))*u - (c/(m*L^2))*theta_dot] y = x 其中,x_dot表示状态量的变化率,y表示输出量。 5. MATLAB仿真:使用Simulink可以方便的进行仿真。将状态空间方程建模成一个Simulink模块,再加上控制器和误差反馈,就可以进行仿真控制设计了。 以上就是倒立摆建模MATLAB仿真的基本步骤,希望能帮到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值