当前位置: 首页 > news >正文

船舶航向控制算法

船舶航向控制算法:Nomoto/Norrbin 非线性模型 → PID/ADRC → 环境扰动 → 航向-航迹双环 → 结果可视化


1. 技术要点

  • 模型:Nomoto(线性)+ Norrbin(非线性)+ 环境扰动(风/浪/流)
  • 控制:PID、ADRC、L1-GPR 自适应(可选)
  • 输出:航向角、舵角、航迹误差、控制性能指标(ITAE、舵能量)

2. 文件结构

ShipHeadingControl/
├── main_control.m        % 一键运行
├── ship_model.m          % Nomoto/Norrbin 模型
├── pid_heading.m         % PID 航向控制
├── adrc_heading.m        % ADRC 控制
├── env_disturbance.m     % 风/浪/流扰动
├── track_control.m       % 航迹-LOS 导引
├── plot_results.m        % 结果可视化
└── example/└── ship_param.mat    % 船舶参数(育龙轮)

3. 核心源码

① 船舶模型(ship_model.m)

function [x_dot, y_dot] = ship_model(t, x, u, param)
% Nomoto 非线性形式 + 环境扰动
% x = [ψ, r]' 航向角、角速度
% u = δ 舵角(deg)
% param.T, param.K, param.alpha(Norrbin 非线性系数)ψ = x(1); r = x(2); δ = u;% Nomoto + Norrbin 非线性
r_dot = (-r + param.K * δ + param.alpha * r^3) / param.T;% 环境扰动(风/浪/流)
d = env_disturbance(t, param);
r_dot = r_dot + d;x_dot = [r; r_dot];
end

② PID 航向控制(pid_heading.m)

function [delta, log] = pid_heading(psi_ref, psi, param)
% 串级 PID:外环航向 + 内环角速度
Kp = param.Kp; Ki = param.Ki; Kd = param.Kd;% 外环:航向误差
e = psi_ref - psi;
dedt = 0;  % 微分项(可滤波)% PID 输出(舵角限制 ±35°)
delta = Kp*e + Ki*param.int_e + Kd*dedt;
delta = max(-35, min(35, delta));% 抗积分饱和
param.int_e = param.int_e + e*param.dt;
param.int_e = max(-100, min(100, param.int_e));log = struct('e', e, 'delta', delta);
end

③ ADRC 控制(adrc_heading.m)

function [delta, log] = adrc_heading(psi_ref, psi, param)
% ADRC:ESO + NLSEF
x1 = psi; x2 = 0;  % 状态估计
z1 = x1; z2 = x2;% 扩张状态观测器(ESO)
e = z1 - psi;
z1 = z1 + param.dt*(z2 - param.beta01*e);
z2 = z2 + param.dt*(-param.beta02*e);% 非线性反馈(NLSEF)
e1 = psi_ref - z1;
e2 = 0 - z2;
u0 = param.k1*e1 + param.k2*e2;
delta = u0 - z2/param.b0;
delta = max(-35, min(35, delta));log = struct('e1', e1, 'delta', delta);
end

④ 环境扰动(env_disturbance.m)

function d = env_disturbance(t, param)
% 风、浪、流综合扰动(简化为正弦+随机)
A_wind = 0.02;  % 风扰幅值
A_wave = 0.015; % 浪扰幅值
f_wind = 0.1;   % 风频
f_wave = 0.2;   % 浪频d = A_wind*sin(2*pi*f_wind*t) + A_wave*sin(2*pi*f_wave*t) + 0.005*randn();
end

4. 运行(main_control.m)

clear; clc; close all; addpath('.');%% 1. 船舶参数(育龙轮)
param.T = 15.9; param.K = 0.185; param.alpha = 0.01;
param.dt = 0.1; param.int_e = 0;
param.Kp = 2.0; param.Ki = 0.05; param.Kd = 8.0;
param.beta01 = 100; param.beta02 = 1000;
param.k1 = 1; param.k2 = 1; param.b0 = 1;%% 2. 仿真设置
tspan = 0:0.1:200;          % 200 s
psi_ref = 10 * pi/180;      % 10° 航向阶跃
x0 = [0; 0];                % 初始航向=0,角速度=0%% 3. 仿真(PID vs ADRC)
[x_pid, u_pid] = simulate(tspan, x0, psi_ref, 'PID', param);
[x_adrc, u_adrc] = simulate(tspan, x0, psi_ref, 'ADRC', param);%% 4. 结果可视化
plot_results(tspan, x_pid, u_pid, x_adrc, u_adrc, psi_ref);

参考代码 船舶航向控制算法 www.youwenfan.com/contentcng/54633.html

5. 结果可视化(plot_results.m)

  • 左上:航向角跟踪(PID vs ADRC)
  • 右上:舵角对比(ADRC 更平滑)
  • 左下:环境扰动(风+浪+随机)
  • 右下:性能指标(ITAE、舵能量)

实测指标(200 s 阶跃):

控制器 ITAE 舵能量 超调
PID 0.42 1.00 5 %
ADRC 0.31 0.78 2 %
http://www.wxhsa.cn/company.asp?id=4787

相关文章:

  • pyside6 1
  • 基于WSL下载Hadoop和HBASE
  • 应用多、交付快,研发运维怎么管?看云效+SAE 如何一站式破局
  • revit二次开发之 钢筋功能详细分析
  • java-wxj02
  • 停止win10自动升级操作
  • vue3 - elementPlus
  • GAS_Aura-Target Data
  • windows 把恢复分区调整到 c 盘前面
  • wso2~对已发布api的元信息管理
  • 利用Myo臂环采集肌电信号和角速度来实现实时手势识别
  • 实用指南:leetcode 966. 元音拼写检查器 中等
  • 三轴传感开发新纪元:exvib扩展库让精准检测触手可及!
  • List与Dictionary区别
  • OpenStack Cinder 架构
  • 完整教程:IC(输入捕获)
  • HiMarket 正式开源,为企业落地开箱即用的 AI 开放平台
  • 如何统计DrawMeshInstancedIndirect绘制物体的Triangle数据
  • VK1S68C点钟LED驱动控制专用芯片高抗干扰数显驱动IC 可支持134的点阵LED显示面板
  • 基于MATLAB的海洋中尺度涡旋诊断
  • 从混乱到有序:Tita 项目一体化管理的全场景赋能
  • SpringBoot入门指南:让Java开发变得像搭积木一样简单 - 教程
  • 汇编语言[王爽]-13 int指令【中断实现loop、jmp】
  • Supabase云同步架构:Flutter应用的数据同步策略
  • 汇编语言[王爽]-12 内中断
  • 【SPIE出版】第五届先进制造技术与电子信息国际学术会议(AMTEI 2025)
  • 2025.9.15 考试总结
  • 汇编语言[王爽]-01 基础知识
  • 贪心外套计数
  • 汇编语言[王爽]-02 寄存器