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

文献复现基于非线性模型预测控制NMPC的无人船,无人艇的轨迹跟踪控制和障碍物避碰

文献复现基于非线性模型预测控制NMPC的无人船,无人艇的轨迹跟踪控制和障碍物避碰 该算法包含Matlab编写的非线性模型预测控制Nonlinear model predictive control 的无人船轨迹跟踪和障碍物避碰算法trajectory tracking and collision avoidance ,有详细的注释和参考文献。 附使用说明。

最近在折腾无人船轨迹跟踪控制,发现非线性模型预测控制(NMPC)确实是个好东西。这玩意儿能把轨迹跟踪和避障统一到优化框架里,特别是处理动态障碍物的时候,比传统PID强得不是一星半点。今天咱们就扒一扒Matlab实现的这套算法到底怎么玩。

先看核心结构——船体模型用的是3自由度动力学模型:

function dx = shipDynamics(x, u) % x = [px, py, psi, u, v, r] % u = [thrust, rudder_angle] m = 180; % 船体质量 Iz = 80; % 转动惯量 % 水动力系数矩阵 M = diag([m, m, Iz]); D = [0.1*x(4) 0 0; 0 0.2*x(5) 0; 0 0 0.3*x(6)]; R = [cos(x(3)) -sin(x(3)) 0; sin(x(3)) cos(x(3)) 0; 0 0 1]; nu = x(4:6); tau = [u(1)*cos(u(2)); u(1)*sin(u(2)); 0.5*u(1)*sin(2*u(2))]; dx(1:3,1) = R * nu; dx(4:6,1) = M \ (tau - D*nu); end

这里最妙的是把推力和舵角转化为三维力矩的操作(tau变量那块),直接规避了传统方法需要单独设计航向控制器的麻烦。注意看最后一行力矩的0.5系数,这是根据实验数据调整的经验值,文献里可不会告诉你这种细节。

避障约束的实现更有意思。咱们在NMPC的优化问题里直接塞了个安全距离约束:

function [c, ceq] = obstacleConstraints(u, x0, obstacles) ceq = []; c = zeros(length(obstacles),1); % 预测未来N步的轨迹 pred_traj = simulateTrajectory(x0, u); for k = 1:length(obstacles) % 计算障碍物与预测轨迹的最小距离 min_dist = inf; for t = 1:size(pred_traj,2) dx = pred_traj(1,t) - obstacles(k).x; dy = pred_traj(2,t) - obstacles(k).y; dist = sqrt(dx^2 + dy^2); min_dist = min(min_dist, dist); end c(k) = 1.5 - min_dist; % 安全距离1.5米 end end

这里用了双重循环来预测轨迹与障碍物的最小距离,虽然计算量大了点,但比凸近似的方法更直观。注意安全距离设置要大于船体半径+障碍物半径+安全余量,别傻乎乎直接抄1.5这个数。

实际调试时发现权重矩阵的选取比算法本身还重要。建议先用默认参数跑通,然后重点调整这几个参数:

Q = diag([10, 10, 5, 2, 2, 1]); % 状态权重 R = diag([0.1, 0.5]); % 控制量权重

航向角(第三位)的权重别设太高,不然船体会疯狂扭屁股。推力惩罚系数设小点,让控制器更愿意输出大推力来紧急避障。

最后给个使用忠告:一定要先关掉避障功能单独调跟踪!见过太多新手一上来就开全功能,结果船在原地转圈还说算法不work。建议运行步骤:

  1. 注释掉障碍物约束
  2. 调跟踪效果直到RMSE小于0.3米
  3. 逐步增加静止障碍物
  4. 最后上动态障碍物

这套代码在松花江实测过,对付流速2m/s的情况没问题。不过注意动力学模型里的D矩阵系数得根据实际船型重新标定,别拿我的参数去跑海监船,翻船了别找我。

参考文献直接去看Primer论文(见代码头文件),但真正有用的参数设置全在渔民口口相传的经验里——这话也就私下说说,写论文时可别这么搞。

http://www.cnnetsun.cn/news/69069.html

相关文章:

  • Hello World的深度演进:一个Ascend C标量算子的性能剖析之旅
  • [Python桌面开发] 本地多服务启动神器:Python + Tkinter 构建“进程批量启动与监控工具”(跨平台 GUI + 源码开放)
  • 量子算法的实现路径解析(工业级应用稀缺技术曝光)
  • 揭秘Python最被低估的8个标准库,第6个能省下你一半代码量
  • GraphQL + PHP错误处理全解析,构建高可用API的必备技能
  • 当AI接管代码:哈佛调查显示53%年轻开发者每天用AI,却59%担心被取代,这届程序员太难了!
  • 16、编程中的颜色与图形绘制及HTML基础入门
  • PHP 8.6的JIT缓存机制揭秘:5大策略提升应用执行效率300%
  • 基于微信小程序的动漫社区交流小程序的设计与实现(源码+lw+部署文档+讲解等)
  • 响应格式化踩坑实录:Symfony 8开发者必须避开的5个陷阱
  • PHP 8.6性能监控面板实战(专家级配置全公开)
  • 性能监控在DevOps中的角色
  • RN Hooks 设计规范与反模式清单
  • 《Advanced Science》最新研究:多自由度折纸模块构建可编程机械超材料网络
  • 用梯形图+SCL玩转FactoryIO码垛控制
  • 7、Nagios 安装与功能拓展全解析
  • 读懂 NVIDIA Jetson OP-TEE 官方源码:从目录结构到 JetPack / Yocto 构建与运行的完整指南
  • LobeChat能否实现邀请码注册机制?控制用户增长节奏
  • Angular AOT编译失败?这份官方文档解读帮你10分钟定位问题
  • PHP环境下医疗数据备份怎么做?5种高可用方案对比分析
  • 【Python库选型避坑手册】:5年踩坑经验总结出的7条黄金法则
  • PHP 8.6 JIT编译器重大升级(指令优化黑科技曝光)
  • Keil串口通信全教程:UART初始化、数据收发(中断/查询模式)+串口调试助手验证
  • 揭秘WebSocket频繁断线之谜:3种常见错误码分析与修复方案
  • LPDDR6 JEDEC 原文解读学习—2.4 Data Packet Format(3)(~持续更新)
  • 【PHP性能优化关键一步】:深入PHP 8.6内存泄漏监控与自动预警方案
  • PHP 8.6兼容性测试实战(资深架构师亲授迁移经验)
  • 从入门到精通:用R Shiny打造可交互的多维度数据仪表盘
  • 光伏阵列遇到局部阴影就像吃火锅被隔壁桌抢肉——憋屈得很。今天咱们用Python整活,搞个3×3电池板的阴影仿真模型,重点观察串联结构在阴影下的输出曲线怎么抽风
  • 你还不知道HTTP/3的这5个性能秘密?:资深架构师20年经验倾囊相授