在Python环境下构建火箭控制系统:基础控制理论解析与应用实践

译文 精选
开发 前端
构建任何类型的控制系统,包括火箭控制系统,均涉及到将控制理论与编程技术相结合的过程。

译者 | 刘涛

审校 | 重楼

控制理论是一门研究如何通过输入信号使系统以期望方式运行的学科。

飞机、汽车、火车、电路及火箭等多种系统,都需要一个类似于大脑的核心控制单元或内部架构。

控制理论正是对这些复杂系统的控制架构进行深入研究的领域。

在本文中,我们提供了一个关于如何构建复杂系统架构的基础指南,将探讨如何运用控制理论,并借助Python编程语言来构建一个火箭控制系统。

你将深入了解以下内容:

  • 火箭系统与烘焙蛋糕之间的趣味类比
  • 简化火箭控制原理:深入理解PID控制器
  • 代码示例:设计一个简单的PID控制器
  • 结论:非线性控制系统备注:本文假定火箭系统是时间不变的,即其运行轨迹不会随时间发生改变。若要处理随时间变化的动态特性,将不在本文的讨论范围之内

一、火箭系统与烘焙蛋糕之间的趣味类比

什么是火箭控制系统

让我们用一个烤蛋糕的比喻来解释。设想你正在制作一个蛋糕,你的食谱提供了制作蛋糕所需的步骤和材料。

在这个类比中:

  • 蛋糕代表火箭
  • 食谱对应火箭的飞行计划
  • 烘焙师的操作则象征着火箭控制系统正如你通过调整烤箱温度或搅拌时间来制作出最佳的蛋糕,火箭控制系统也会调整火箭的各项参数,确保其沿着预定轨道飞行并保持稳定。

为什么控制系统在编程中至关重要

理解控制系统可以帮助你在算法设计和系统思维方面变得更加熟练。

此外,它还允许你在反馈回路中调整过程,这在编程的众多领域中都非常关键。

你主要会在以下软件开发中应用控制理论和控制系统:

  • 机器人与自动化领域:控制系统通过基于传感器输入的反馈回路,实现机器人的精确运动和自适应能力。
  • 信号处理与通信领域:它们优化数据传输、错误校正和信号过滤,以确保通信的可靠性。
  • 嵌入式系统与物联网:控制系统负责管理设备与环境的交互,处理传感器输入,并高效地调整输出。

如何创建一个火箭控制系统

以烤蛋糕的类比来阐述:

  1. 选择蛋糕与食谱:挑选一种简单的控制策略,就如同选择一份基础的蛋糕食谱。PID控制器是常见的选择,因其简洁而高效。
  2. 深入理解原料:对火箭的特性及其轨迹进行数学建模,这类似于深入研究食谱及其原料。这样做可以帮助我们清晰地认识系统。
  3. 准备初始原料:设定初始参数,这个过程类似于收集制作蛋糕所需的基本原料。
  4. 混合与烘焙:对系统进行调整和测试,正如混合原料并进行烘焙的过程。这通常涉及到利用各种图表来评估系统的稳定性和性能。
  5. 添加后期修饰:对参数进行微调,以优化控制系统的效率,这就像为蛋糕添加后期的装饰一样。
  6. 严格遵循食谱:将设计转化为实际操作,这就像细致地遵循蛋糕食谱的每一步骤。

二、简化火箭控制原理:深入理解PID控制器

一个简单的控制系统:PID控制器

控制系统图示例(来源)控制系统图示例(来源)

每个控制系统都配备有一个核心组件——控制器,以执行其运行指令。在众多控制器中,PID控制器是最为常用的类型之一。它因其简单性和高效性,在简单控制系统中得到了广泛的应用。

在以下代码示例中,我们将采用PID控制器。选择PID控制器的原因在于,它对于处理基础控制任务来说,不仅易于实现,而且效果显著。

在火箭控制系统中,PID控制器承担着通过对比火箭的实际飞行位置与预定轨迹(即反馈环节)来不断调整飞行路径(即处理环节)的任务。

这一机制确保了火箭能够精确地沿着预定轨道飞行,并最终准确抵达目的地。

PID控制器由三个关键部分组成,它们在系统的处理与反馈环节中协同作用:比例增益(Kp)、积分增益(Ki)以及微分增益(Kd)。

  • 比例增益(Kp):能够对误差进行即时反应,促使系统迅速响应,但有时会导致超调目标。
  • 积分增益(Ki):通过累积历史误差,逐渐进行修正,以消除系统中的任何残余误差。但是,若积分增益设置过高,可能会引发系统的不稳定性。
  • 微分增益(Kd):负责预测未来的误差,有助于防止超调,并使得系统响应更加平缓。这三个环节的协同作用,生成一个精确的控制信号,进而调整火箭的飞行参数。这保证了系统的稳定运行、精确控制以及高效执行。
    通过PID控制器,我们能够精确地操控推力和高度等输入参数对火箭位置和速度的影响,确保火箭稳定飞行,并沿着预定的轨迹准确导航。

稳定性分析

设计PID控制器实质上是在设计一个稳定的控制系统。

将这种设计稳定控制系统的过程称为稳定性分析。

稳定性分析的方法有很多,但在代码示例中我们将主要使用以下三种

  • 根轨迹:该方法可以直观地展示系统的稳定性和响应性。
  • 该方法可显示系统的增益(gain)和相位裕度(phase margins)
  • 奈奎斯特图该方法用于阐述系统的稳定性和潜在的振荡情况。在这种情况下,增益和相位裕度这两个概念表明了控制系统对变化的容忍度。
    增益裕度反映系统在不丧失稳定性前提下,增益可以增加的最大度。所谓增益,是指输入信号被放大的程度,用以生成输出信号。
    相位裕度则反映系统在不丧失稳定性的前提下,可以承受的最大延迟。在控制理论中,延迟指的是输出响应对于输入信号的滞后时间。
    些分析为我们提供了如何调整Kp、Ki和Kd的参数,以确保PID控制器能够有效地对火箭进行控制。

传递函数的需求:控制火箭和确定组件值

要实现任何控制系统的精确控制,我们需要两传递函数:一类是理论传递函数,另一类是物理传递函数。

传递揭示了输入信号如何通过数学关系转换为输出信号。

在当前的情境中,理论传递函数代表PID控制器的功能

而物理系统传递函数则描述了系统中物理组件在实际工作环境中的动态特性和行为。

通过将这两类传递函数相结合,我们能够深入理解材料和组件值的实际表现,例如:

  • 储能电容器的参数值
  • 用于精确数据测量和反馈的传感器校准值
  • 减震系统的弹簧刚度系数(Spring constants)
  • 燃料和氧化剂储存罐的额定工作压力因此,PID控制器不仅是火箭控制系统的核心,还能够指导我们确定火箭飞行所必需的各个组件的具体参数值

工程师如何找到物理传递函数方程?

首先,我们必须明确火箭的用途和任务需求

它是用于将卫星送入近地轨道或中地球轨道,还是用于执行月球探测等深空任务?

明确了火箭的具体应用场景之后,我们可以通过数学建模和物理分析来推导出传递函数的物理方程。

实际上,存在一个专门的工程领域,称为系统识别,其研究重点就是如何确定系统的传递函数。

接下来,让我们探讨如何针对控制系统,找到其物理传递函数的方法。

三、代码示例:设计一个简单的PID控制器

在接下来的代码示例中,我们将构建一个用于火箭的简易控制系统。

在深入代码细节之前,我们先来讨论一下分贝的概念。

分贝是一种采用对数尺度来衡量声音强度的单位。在控制理论领域,分贝被用来以更直观的方式在图表上表示增益。

这样,我们可以在可范围内看到更多大大小小的一系列增益值。

换句话说,通过对数尺度的增益,我们可以清晰地看到输入信号在何种程度上被放大并转化为输出信号。

此外,我还将解释根轨迹、波德图和奈奎斯特图如何辅助工程师进行系统的稳定性分析。

接下来,让我们看看代码然后我们将逐块对其进行详细分析

# Step 1: Import libraries
import matplotlib.pyplot as plt
import control as ctrl
# Step 2: Define a new rocket transfer function with poles closer to the imaginary axis
num = [10] 
den = [2, 2, 1] 
G = ctrl.TransferFunction(num, den)
# Step 3: Design a PID controller with new parameters
Kp = 5
Ki = 2
Kd = 1
C = ctrl.TransferFunction([Kd, Kp, Ki], [1, 0])
# Step 4: Applying the PID controller to the rocket transfer function
CL = ctrl.feedback(C * G, 1)
# Step 5: Plot Root Locus for Closed-Loop System
plt.figure(figsize=(10, 6))
ctrl.root_locus(C * G, grid=True)
plt.title("Root Locus Plot (Closed-Loop)")
# Step 6: Plot Bode Plot for Closed-Loop System
plt.figure(figsize=(10, 6))
ctrl.bode_plot(CL, dB=True, Hz=False, deg=True)
plt.suptitle("Bode Plot (Closed-Loop)", fnotallow=16)
# Step 7: Plot Nyquist Plot for Closed-Loop System
plt.figure(figsize=(10, 6))
ctrl.nyquist_plot(CL)
plt.title("Nyquist Plot (Closed-Loop)")
plt.show()

第1步:导入库

import matplotlib.pyplot as plt
import control as ctrl

在这里我们导入两个库:

  • matplotlib库:用于创建各种类型可视化的绘图库
  • 控制库:用于分析和设计控制系统的库

2步:定义火箭系统的传递函数

num = [10] 
den = [2, 2, 1] 
G = ctrl.TransferFunction(num, den)

在这段代码中,我们定义了物理系统的传递函数

  1. num=[10]:将系统增益设置为10。
  2. den=[2,2,1]:定义分母。
  3. G = ctrl.transferFunction(num, cen):构造传递函数。

以下是我们要用PID控制的传递函数:

<!DOCTYPE html>

Black-Scholes Equation
$$\frac{\partial V}{\partial t} + \frac{1}{2}\sigma^2 S^2 \frac{\partial^2 V}{\partial S^2} = rV - rS \frac{\partial V}{\partial S}$$

火箭传递函数

在本代码示例中,所展示的火箭方程对应的传递函数被极大地简化了。然而,在现实应用场景中,火箭的传递函数并非属于时不变线性系统。实际上,它们往往表现出极高的复杂性,属于典型的非线性系统。

第3步:设计具有新参数的PID控制器

Kp = 5
Ki = 2
Kd = 1
C = ctrl.TransferFunction([Kd, Kp, Ki], [1, 0])

此代码设置具有特定增益的PID控制器并创建传递函数:

  • Kp = 5:将比例增益设置为5。
  • Ki = 2:将积分增益设置为2。
  • Kd = 1:将导数增益设置为1。
  • C = ctrl.TransferFunction([Kd, Kp, Ki], [1, 0]):创建PID控制器的传递函数

第4步:将PID控制器应用于火箭传递函数

CL = ctrl.feedback(C * G, 1)

PID控制器在火箭传递函数中的应用PID控制器在火箭传递函数中的应用

  • C * G:表示将PID控制器C与系统G(即火箭)相乘,从而构成开环传递函数。该传递函数在没有反馈机制介入的情况下,对系统的行为进行建模,其性能表现依赖于预先设定的参数配置。
  • ctrl.feedback(C * G, 1):此步骤通过施加反馈,并利用反馈信号来表征系统的行为,进而计算出闭环传递函数。这一过程使得系统能够根据输入信号自动调整,以实现误差的自动纠正。
  • CL:代表存储生成的闭环系统模型,该模型通过反馈机制将控制器与火箭相结合,以维持所需的性能指标。该闭环系统模型可用于进一步的性能分析或仿真研究。

第5步:增益分析的根轨迹

在此代码中:

plt.figure(figsize=(10, 6))
ctrl.root_locus(C * G, grid=True)
plt.title("Root Locus Plot (Closed-Loop)")

创建根轨迹图

我们生成这个图:

简单根轨迹图简单根轨迹图

这是一幅根轨迹图,它是工程师们为了研究控制系统稳定性而采用的一种分析工具。

图中所示的十字标记,被称作极点,其在根轨迹图中的位置至关重要。

当极点位于图的左侧时,表明系统处于稳定状态;反之,若极点位于右侧,则意味着系统是不稳定的。

极点越偏向左侧,系统在遭受干扰后恢复至正常状态的速度越快,从而系统的稳定性越高。

然而,极点过度左移可能会导致系统产生过多的振荡,其稳定性取决于极点的具体位置。

综上所述,关键在于:

  • 通过调整比例系数Kp、积分系数Ki和微分系数Kd,使极点尽可能地向左移动,而不会引发振荡。然而,仅凭根轨迹图并不能充分确保系统的稳定性。为此,我们还需借助波德图和奈奎斯特图进行分析。只有结合这些图表,我们才能精确地确定火箭控制系统中PID控制器的最佳参数值。

第6步:稳定性分析的波德图分析

当前代码中:

plt.figure(figsize=(10, 6))
ctrl.bode_plot(CL, dB=True, Hz=False, deg=True)
plt.suptitle("Bode Plot (Closed-Loop)", fnotallow=16)

创建波德图创建波德图

我们生成如下图:

简单波德图简单波德图

波德图的创制旨在辅助工程师深入掌握系统对变化的响应特性,以及其在不同工况下的稳定性能。

此外,波德图亦能揭示系统的稳定状态及其安全裕度(safety margins)

以下,我们将探讨波德图的工作原理

波德图细节波德图细节

上述图表中的上方图像被称为幅度图,而下方图像则称为相位图。

幅度图用于衡量系统在各个频率下的增益大小。较高的增益值表示系统具有更迅速且强烈的响应,这对于实现精确控制是有益的。

相位图则用于测量系统在各个频率下所引入的相位移。当增益降至零时,我们可以观察到相位移的情况。

在此情形下,我们可以通过绿线确定增益为零的时刻,以及与红线相对应的相位移,其数值大约为63度。

理想情况下,相位移的范围应控制在30到60度之间,这一范围能够在系统的稳定性和响应速度之间取得平衡。

若相位移超过60度,系统将表现出极高的稳定性,但可能会降低系统对变化的响应速度。

综上所述,通过对该图表的分析,我们可以得出结论,该PID控制器是处于稳定状态的。

第7步:用于稳定性分析的奈奎斯特

以下代码中:

plt.figure(figsize=(10, 6))
ctrl.nyquist_plot(CL)
plt.title("Nyquist Plot (Closed-Loop)")

创建奈奎斯特绘图创建奈奎斯特绘图

我们生成如下图:

奈奎斯特绘图奈奎斯特绘图

奈奎斯特图是一种辅助工程师迅速评估控制系统稳定性的工具。

其原理如下:

  • 若在点(-1, 0)处不存在围绕红十字的封闭曲线,则表明系统是稳定的。
  • 在点(-1, 0)处存在围绕红十字的封闭曲线,且该曲线为顺时针方向,则表明系统是不稳定的。从上图来看,由于在红十字周边并没有封闭曲线,因此可以判定该控制系统是稳定的。

火箭控制系统设计的最终阶段

在完成PID控制系统的设计之后,我们可以利用诸如Simulink之类的工具来确定众多组件所需的确切参数。

换句话说,在确定了最佳的PID控制器参数之后,便进入了确定火箭物理组件参数的阶段。

这些参数包括:

  • 控制电流的电阻器参数
  • 储能电容器的参数
  • 管理电磁干扰的电感器参数
  • 用于精确数据测量与反馈的传感器校准参数
  • 火箭机身及尾翼材料的强度与耐久性参数
  • 伺服电机的扭矩与速度要求
  • 减震系统的弹簧常数
  • 燃料与氧化剂罐的额定压力

得益于Simulink,我们能够根据火箭的任务需求,获得设计火箭所需的所有这些参数。

通过构建一个稳定的控制系统,并基于PID控制器来控制火箭的物理传递函数,我们能够确定每个组件所需的所有关键参数。

结论:非线性控制系统

对于线性时不变系统(LTI)的优化,我们拥有多种方法:

  1. 根轨迹法:通过调整系统极点来减少振荡现象。
  2. 波德图分析:确保系统的相裕度和稳定性得以维持。
  3. 奈奎斯特图分析:确认系统的整体稳定性。

利用这些工具,我们可以构建出一个有效的控制系统。

然而,在这一过程中,最好采用诸如Ziegler-Nicholas方法,以便更快速地确定最佳的PID控制器参数。

在本次研究中,我们以一个极为简化的火箭系统为对象进行探讨。

在现实情况中,我们通常仅使用非线性工具,因为所有的火箭系统本质上都是非线性系统

以自适应控制为例,控制系统会实时调整自身以应对不断变化的环境条件。

另一个例子是Lyapunov方法。还是在以上情况下,它被用于稳定性分析,而非上述三种图形分析。

尽管如此,构建这些控制系统的过程始终保持一致。本文详细阐述了这一过程的工作原理,以及它是如何应用于线性时不变系统的。

https://github.com/tiagomonteiro0715/freecodecamp-my-articles-source-code

译者介绍

刘涛,51CTO社区编辑,某大型央企系统上线检测管控负责人。

原文标题:How to Build a Rocket Control System: Basic Control Theory with Python,作者:Tiago Monteiro

责任编辑:华轩 来源: 51CTO
相关推荐

2021-07-29 18:48:55

办公

2011-04-08 18:00:19

GitSubversion版本控制系统

2022-08-29 10:53:48

云路由家庭内网Wi-Fi

2021-12-08 14:06:19

Python语音识别开发

2009-04-01 17:58:28

MercurialPython版本控制

2017-12-13 12:21:57

数据中心环境系统

2011-12-15 01:01:48

ibmdw软件开发

2022-03-17 00:07:00

工业控制系统

2009-03-23 09:53:47

LinuxGNOMEGit版本

2020-09-27 09:50:35

自动化

2011-02-17 18:39:34

2023-05-24 14:58:23

2023-10-16 12:42:00

物联网IOT

2021-02-04 06:54:09

DevOpsGitLab系统

2017-09-01 06:45:37

2014-06-23 10:22:18

2020-06-15 10:53:16

工控安全工业控制网络安全

2022-09-14 09:18:52

SubversionLinux系统

2010-09-14 14:22:22

2023-10-24 20:41:28

物联网控制系统
点赞
收藏

51CTO技术栈公众号