python control控制系统仿真再更新:使用内外环系统进行垂直起降飞行器横向控制仿真

5 篇文章 1 订阅
3 篇文章 2 订阅

control库的安装方法为pip install control
原文链接地址

使用内/外循环设计进行横向控制

注意,无需逐段复制代码,直接跳转到最后复制完整代码即可。
本节演示了矢量推力飞机示例的环路整形控制器的设计。此示例摘自[http://www.cds.caltech.edu/~murray/amwiki Astrom and Murray]的第11章(频域设计)。此处列出的python代码包含在文件pvtol-nested.py中。

为了设计矢量化推力飞机横向动力学的控制器,我们使用了“内/外”环设计方法。我们首先使用框图表示动态

在这里插入图片描述
其中,为了简化,我们令以下物理量:

H θ u 1 = r J s 2 , H x u 1 = J s 2 − m g r J s 2 ( m s 2 + c s ) H _ {{\theta u_ {1}}} = {\frac {r} {Js ^ {2}}},\qquad H _ {{xu_ {1}}} = {\frac {Js ^ {2} -mgr } {Js ^ {2}(ms ^ {2} + cs)}} Hθu1=Js2rHxu1=Js2ms2+csJs2mgr

通过将动力学和控制器分为两个部分来构造控制器:
1、 由侧倾动力学 P i P_i Pi和控制 C i C_i Ci组成的内循环
2、由侧向位置动力学 P o P_o PoE和控制器 C o C_o Co组成的外循环。
在这里插入图片描述

内环 H i H_ {i} Hi使用矢量推力控制飞机的侧倾角,而外环控制器 C o C_ {o} Co命令侧倾角调节侧向位置。

以下代码导入所需的库并定义动力学特性:

from matplotlib.pyplot import * # Grab MATLAB plotting functions
from control.matlab import *    # MATLAB-like functions
#系统参数
m = 4;#飞机质量
J = 0.0475;#围绕俯仰轴的惯性
r = 0.25;#距力中心的距离
g = 9.8;#重力常数
c = 0.05;#阻尼系数(估计值)
#动态传递函数
Pi = tf([r][J,00]; #内部循环(滚动)
Po = tf([1][m,c,0]; #外循环(位置)

对于内层反馈循环,使用超前补偿器

k = 200;a = 2;b = 50
Ci = k * tf([1,a][1,b])#超前补偿器
Li= Pi * Ci

内环的闭环动力学由 H i H_ {i} Hi给出

Hi = parallel(feedback(Ci, Pi), -m*g*feedback(Ci*Pi, 1));

最后,我们使用另一个主补偿器设计横向补偿器

#现在设计横向控制系统
a = 0.02;b = 5;K = 2;
Co = -K * tf([10.3][110]);#另一个主要补偿器
Lo = -m * g * Po * Co;

可以使用灵敏度函数和互补灵敏度函数来表征系统的性能

L = Co*Hi*Po;
S = feedback(1, L);
T = feedback(L, 1);

使用以下命令计算环路传递函数的频率响应和奈奎斯特图

bode(L)
nyquist(L, (0.0001, 1000));
axis([-700, 5300, -3000, 3000]);

gangof4(Hi*Po, Co);

相应的图如下所示:

伯德图

伯德图

奈奎斯特图

在这里插入图片描述

四个图

标准答案是这样的,但是我未能复现这个图。上两个图我都可以复现。
在这里插入图片描述

代码实现

# pvtol-nested.py - inner/outer design for vectored thrust aircraft
# RMM, 5 Sep 09
#
# This file works through a fairly complicated control design and
# analysis, corresponding to the planar vertical takeoff and landing
# (PVTOL) aircraft in Astrom and Murray, Chapter 11.  It is intended
# to demonstrate the basic functionality of the python-control
# package.
#

from __future__ import print_function

import os
import matplotlib.pyplot as plt  # MATLAB plotting functions
from control.matlab import *    # MATLAB-like functions
import numpy as np

# System parameters
m = 4               # 飞行器质量
J = 0.0475          # 俯仰轴惯性
r = 0.25            # 力与质心距离(原文为:distance to center of force
g = 9.8             # 重力加速度
c = 0.05            # 阻尼系数(估计)

# 传递函数
Pi = tf([r], [J, 0, 0])  # inner loop (roll)
Po = tf([1], [m, c, 0])  # outer loop (position)

# Use state space versions
Pi = tf2ss(Pi)
Po = tf2ss(Po)

#
# 内控制环路设计
#
# This is the controller for the pitch dynamics.  Goal is to have
# fast response for the pitch dynamics so that we can use this as a 
# control for the lateral dynamics
#

# Design a simple lead controller for the system
k, a, b = 200, 2, 50
Ci = k*tf([1, a], [1, b])  # lead compensator
Li = Pi*Ci

Si = feedback(1, Li)
Ti = Li*Si

Hi = parallel(feedback(Ci, Pi), -m*g*feedback(Ci*Pi, 1))

a, b, K = 0.02, 5, 2
Co = -K*tf([1, 0.3], [1, 10])  # another lead compensator
Lo = -m*g*Po*Co



# Finally compute the real outer-loop loop gain + responses
L = Co*Hi*Po
S = feedback(1, L)
T = feedback(L, 1)

plt.figure('时域响应')
y,t=step(T,T=np.linspace(0,10,100))
plt.plot(t,y)
plt.xlabel('time/s')
plt.ylabel('y(t)')
plt.grid()

# 对整个系统绘制伯德图
plt.figure('伯德图')
bode(L, np.logspace(-4, 3))

plt.figure('奈奎斯特图')

nyquist(L, (0.0001, 1000))
plt.axis([-4000, 300, -300000, 300000])

plt.figure('四个图')
gangof4(Hi*Po, Co)
plt.show()


  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值