探索船舶航向控制:基于Norrbin与Nomoto模型的PID与ADRC控制之旅
船舶航向控制 基于Norrbin或者Nomoto船舶模型 PID控制/ADRC控制 (2选一)
在船舶航行的广袤世界中,精确的航向控制犹如船只的“导航之星”,至关重要。今天咱们就一起来深入探讨基于Norrbin或者Nomoto船舶模型,运用PID控制以及ADRC控制实现船舶航向精准把控的奇妙过程。
Norrbin与Nomoto船舶模型简介
Norrbin模型
Norrbin模型是一种对船舶动力学进行描述的模型。它以一种较为简洁却有效的方式,捕捉船舶在水中运动时的关键特性。例如,它会考虑到船舶受到的水动力、舵角与船舶航向变化之间的关系等,通过一系列的数学公式来建立起模型,使得我们能够在理论层面模拟船舶的运动。
Nomoto模型
Nomoto模型同样赫赫有名,它基于船舶的一阶线性微分方程,对船舶的转向响应进行建模。简单来说,它能将船舶的转向动作,像一个具有惯性的系统那样进行描述,这对于我们理解船舶在不同舵角输入下如何改变航向提供了非常直观的视角。
PID控制在船舶航向控制中的应用
PID控制,即比例 - 积分 - 微分控制,是自动化控制领域的经典之作。在船舶航向控制中,它的原理也并不复杂。
假设我们设定一个目标航向 $\theta{d}$,当前船舶实际航向为 $\theta$。比例环节(P)的作用就像一个放大镜,它根据航向偏差 $e = \theta{d} - \theta$ 来成比例地输出控制信号。如果偏差大,输出就大,促使船舶快速向目标航向调整。
积分环节(I)则是负责处理系统中的稳态误差。想象一下,船舶在航行过程中可能会受到一些持续的干扰,比如水流的影响,这可能导致即使船舶一直在调整,但仍然与目标航向存在一个小偏差。积分环节就会将这个偏差随着时间进行累积,然后输出一个额外的控制信号,逐渐消除这个稳态误差。
微分环节(D)关注的是偏差的变化率。比如船舶已经接近目标航向,但速度过快,微分环节就能根据偏差变化的快慢,提前给出一个反向的控制信号,让船舶能够平稳地“停靠”在目标航向上,不至于冲过头。
船舶航向控制 基于Norrbin或者Nomoto船舶模型 PID控制/ADRC控制 (2选一)
下面咱们来看一段简单的Python代码来模拟基于Nomoto模型的船舶航向PID控制:
import numpy as np
import matplotlib.pyplot as plt
# Nomoto模型参数
K = 0.1
T = 2.0
# PID控制器参数
Kp = 0.5
Ki = 0.1
Kd = 0.2
# 时间参数
dt = 0.1
t = np.arange(0, 100, dt)
# 初始化变量
theta = np.zeros(len(t))
theta_d = np.ones(len(t)) * np.pi / 4 # 目标航向45度
e = np.zeros(len(t))
e_integral = 0
e_derivative = 0
delta = np.zeros(len(t))
for i in range(1, len(t)):
e[i] = theta_d[i] - theta[i - 1]
e_integral += e[i] * dt
e_derivative = (e[i] - e[i - 1]) / dt
delta[i] = Kp * e[i] + Ki * e_integral + Kd * e_derivative
theta[i] = theta[i - 1] + (K / T) * delta[i - 1] * dt - (1 / T) * theta[i - 1] * dt
plt.plot(t, np.degrees(theta), label='实际航向')
plt.plot(t, np.degrees(theta_d), label='目标航向')
plt.xlabel('时间(s)')
plt.ylabel('航向(度)')
plt.legend()
plt.show()
在这段代码中,我们首先定义了Nomoto模型的参数 K 和 T,以及PID控制器的参数 Kp、Ki 和 Kd。然后,通过循环不断计算当前的航向偏差 e,积分项 eintegral 和微分项 ederivative,进而得到舵角 delta。再根据Nomoto模型更新船舶的实际航向 theta。最后绘制出实际航向与目标航向随时间的变化曲线。
ADRC控制为船舶航向保驾护航
自抗扰控制(ADRC)是一种较为新颖且强大的控制策略。它的核心思想是将系统中的未知干扰和未建模动态看作一个“总扰动”,然后通过扩张状态观测器(ESO)对这个总扰动进行实时估计,并在控制律中给予补偿,从而实现对系统的有效控制。
在船舶航向控制场景下,ADRC有着独特的优势。船舶在航行时,会面临各种各样复杂的干扰,像风浪、水流等,这些干扰的精确建模几乎是不可能的。ADRC就能够自适应地处理这些不确定因素,使得船舶航向控制更加鲁棒。
以下是一个简单的基于Norrbin模型的ADRC控制Python代码框架(为简化,仅展示关键部分):
# 假设Norrbin模型相关参数
# 这里简单示意,实际参数需更精确测定
a1 = -0.5
a2 = -0.3
b0 = 0.2
# ADRC参数
beta01 = 30
beta02 = 100
beta03 = 1000
beta1 = 0.5
beta2 = 0.05
# 初始化状态和估计状态
x1 = 0
x2 = 0
z1 = 0
z2 = 0
z3 = 0
# 假设的目标航向
theta_d = np.pi / 4
for _ in range(some_iterations):
# 计算扩张状态观测器
e1 = x1 - z1
z1_dot = z2 - beta01 * e1
z2_dot = z3 - beta02 * e1 + b0 * u
z3_dot = -beta03 * e1
z1 += z1_dot * dt
z2 += z2_dot * dt
z3 += z3_dot * dt
# 计算非线性状态误差反馈控制律
e2 = theta_d - z1
u0 = beta1 * e2 - beta2 * z2
u = (u0 - z3) / b0
# 更新船舶状态
x1_dot = x2
x2_dot = a1 * x1 + a2 * x2 + b0 * u
x1 += x1_dot * dt
x2 += x2_dot * dt
在这段代码框架里,我们先设定了Norrbin模型的一些假设参数,以及ADRC中的关键参数,如扩张状态观测器的参数 beta01、beta02、beta03 等。通过循环不断更新扩张状态观测器对系统状态和总扰动的估计 z1、z2、z3,然后根据估计值计算出控制律 u,并更新船舶的实际状态 x1 和 x2,以此来实现船舶航向的控制。
无论是基于经典的PID控制,还是更具适应性的ADRC控制,在船舶航向控制这个大舞台上,它们都凭借自身独特的优势,为船舶在茫茫大海中指引着精确的航向,确保航行的安全与高效。未来,随着技术的不断发展,相信船舶航向控制技术会更加先进和智能。

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

所有评论(0)