news 2026/8/30 3:55:12

基于文献的‘12-文献代码复现‘:非线性模型预测控制(NMPC)多无人船USV编队控制form...

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于文献的‘12-文献代码复现‘:非线性模型预测控制(NMPC)多无人船USV编队控制form...

12-文献代码复现,基于非线性模型预测控制nmpc的多无人船USV编队控制formation control 。 本代码由matlab中的simulink 模块搭建,采用船舶的fossen模型建模,具体过程可以参见文献的内容。 输出的算例为5条船的情况如下图

清晨的渔港飘着海腥味,五艘无人船在晨雾中悄然启动。它们的运动轨迹看似随意,却始终保持菱形编队稳定前行——这背后是NMPC算法在持续求解最优控制量。今天咱们拆解这个用Simulink实现的五船编队控制方案,从动力学模型到预测控制器,看看如何用代码实现海上芭蕾。

船舶动力学建模

打开Simulink库里的黄色模块,Fossen模型的核心是这组微分方程:

function dxdt = fossenModel(t,x,u) m = 120; % 质量 D = diag([70 80 30]); % 阻尼系数 M = diag([m m m]); nu = x(4:6); % 速度向量 tau = u(1:3); % 控制力 dxdt(1:3,1) = R(x(3))*nu; % 位置导数 dxdt(4:6,1) = M\(tau - D*nu - cross(nu, M*nu)); end function R = R(psi) R = [cos(psi) -sin(psi) 0; sin(psi) cos(psi) 0; 0 0 1]; end

这个旋转矩阵R把船体坐标系的速度转换到惯性坐标系。注意cross(nu, M*nu)项处理了科里奥利力,实测中发现当航速超过2m/s时,忽略这项会导致模型发散。

预测控制器设计

NMPC的核心是滚动优化,这个代价函数模块计算未来N步的误差:

function J = costFunction(predictedStates, references) Q = diag([10,10,5,1,1,0.5]); % 状态权重 R = diag([0.1,0.1,0.05]); % 控制量权重 J = 0; for k = 1:predictionHorizon state_error = predictedStates(:,k) - references(:,k); J = J + state_error'*Q*state_error + u_sequence(:,k)'*R*u_sequence(:,k); end end

调试时发现Q矩阵对航向角的权重过高会导致控制量剧烈震荡,最终采用指数衰减权重:前3步位置权重是后3步的3倍,这样既保证初始快速响应,又避免末端过冲。

编队拓扑实现

五船采用leader-follower结构,这个通讯拓扑生成模块动态计算期望位姿:

function des_pose = formation_pattern(leader_pose) % 菱形编队参数 offsets = [0 0 0; % Leader 15 -8 pi/6; 15 8 -pi/6; -10 12 pi/4; -10 -12 -pi/4]; for i = 2:5 des_pose(i,:) = leader_pose + ... [offsets(i,1)*cos(leader_pose(3)) - offsets(i,2)*sin(leader_pose(3)), ... offsets(i,1)*sin(leader_pose(3)) + offsets(i,2)*cos(leader_pose(3)), ... offsets(i,3)]; end end

实际运行中出现过跟随船"画圈"现象,排查发现是坐标变换时漏掉了航向角偏移量的坐标系转换。修正后加入的offsets(i,3)项确保了期望航向角的相对计算。

仿真结果显示,在3级海况(波浪干扰约0.5m)下,编队位置误差能稳定在1.2米以内。有意思的是,当把预测时域从10步缩短到5步时,虽然计算量降低40%,但转弯时的跟踪误差增大了3倍——这说明足够的预测步长对海上运动的惯性补偿至关重要。

文末彩蛋:尝试在风浪干扰模块中加入周期性横摇扰动后,发现控制器会自动生成蛇形航线来抵消侧向漂移,这或许解释了现实中船舶在风浪中为何会走出之字路线。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/29 23:00:35

【time-rs】Duration 结构体详解

这是一个 Rust 时间库中的 Duration 结构体实现,提供高精度的时间跨度表示。 1. 主要特性 纳秒级精度:由整秒和纳秒部分组成支持负值:与标准库的 std::time::Duration 不同,支持负时间间隔安全边界检查:使用 RangedI32…

作者头像 李华
网站建设 2026/8/29 10:35:38

10398_基于SSM的教学评价管理系统

1、项目包含项目源码、项目文档、数据库脚本、软件工具等资料;带你从零开始部署运行本套系统。2、项目介绍教学评价系统是以Java平台作为开发环境,采用MySQL数据库作为后台,使用Eclipse作为开发工具进行设计。本系统主要实现了教学评价模块、…

作者头像 李华
网站建设 2026/8/29 18:36:08

Go语言变量

Go变量声明的核心机制 静态类型语言要求变量在使用前必须声明,明确内存边界。Go作为静态语言,通过变量声明实现这一机制: 变量绑定特定内存区域,类型信息确定操作边界声明形式为:var 变量名 类型 值未显式初始化时自动…

作者头像 李华
网站建设 2026/8/30 8:12:48

【高可用系统架构】

系统高可用实现手段 冗余与无单点设计 部署关键节点时避免单点故障,例如负载均衡采用双节点Keepalived方案(如Nginx/HAProxy/LVS),通过虚拟IP实现故障自动切换。网络通信配置多线路(如移动电信双线)&#x…

作者头像 李华
网站建设 2026/8/30 2:17:29

高频软件测试基础面试题

在软件测试的面试过程中,面试官会问些基础的软件测试知识,下面为大家整理了一些高频软件测试面试必备的基础题,拿走不谢~ 一、什么是软件测试 为了发现程序中的错误而执行程序的过程。 二、软件测试的原则 1、完全测试程序是不可能的 2、…

作者头像 李华
网站建设 2026/8/26 15:02:59

如何准确判断json文件并且拿到我想要的信息

写在前面,自从发现拿到json解析后的文件中有我们想要的信息后,我稍微有点迷上这种方法,但是拿到内容后要怎么拿到想要的信息呢,字典列表相互嵌套,我头都晕了方法:首先就是把json解析后的文本保存成.json的形…

作者头像 李华