
简介面向自主水下航行器AUV定位控制中的速度形式问题这份资源提供基于 LPV线性参数变化与 MPC模型预测控制的 Matlab 程序及配套案例数据适合计算机、电子信息工程、数学等专业学生用于课程设计、期末大作业或毕业设计也可作为控制方向入门者的参考实现。压缩包共 14 个文件主体为 8 个 .m 主程序与函数模块涵盖预测矩阵、状态空间、求解器等关键环节另有 .zbak 备份文件、1 个 Python 脚本、1 个 zip 案例数据以及 md 说明文档资源包整体约 13KB。程序采用参数化编程参数便于调整注释详细代码思路清晰并兼容 Matlab2014、2019a、2024a 等多个版本可直接运行。已有 72 人浏览学习。借助这套程序可快速理解 LPV-MPC 在 AUV 动态环境中的建模与求解流程获得可扩展的仿真框架和排错参考便于在此基础上开展二次开发与论文实验。1. 为什么是“速度形式 LPV-MPC”AUV 定位控制的真实痛点自主水下航行器AUV在深水定位和航迹保持时面临的不只是“跑不跑得直”那么简单航速从 2 节拉到 5 节时水动力系数跟着变固定增益的 PID 控制器在低速段整定好的参数到高速段就开始相位滞后、极限环振荡。LPV-MPC 的思路是把航速这类调度变量显式写进预测模型让控制器随工况自动换增益而速度形式velocity form则是在预测控制器内部嵌进积分作用用来消掉海流扰动和模型失配造成的稳态定位偏差。这套方法尤其适合做 AUV 制导控制方向的课题研究、湖试海试的工程调试以及想从经典 PID 升级到模型预测控制的从业者。如果你手头有 Matlab 程序与案例数据需要跑通并复现控制效果这篇文章按建模、推导、代码、数据、避坑的顺序给你一条可落地的路径。2. 先把运动模型砍到能算水平面三自由度与调度变量选择2.1 六自由度砍到水平面三个状态量、两个输入AUV 的完整运动方程是六自由度纵荡、横荡、垂荡、横摇、纵摇、艏摇。但在定位控制这个任务里垂向深度通常由单独的深度控制器负责横摇和纵摇在定深/定航向工况下是小量一般做小角度假设忽略掉。所以我们在水平面内留下三个自由度北向位置 x、东向位置 y、艏向角 ψ再加三个速度量前向速度 u、横向速度 v、艏摇角速度 r。如果你看到的模型里还带着惯性坐标和机体坐标之间的旋转矩阵那是正常操作别被那一大堆 sin 和 cos 吓到它只是坐标变换。水平面运动学部分写成dx/dt u * cos(ψ) - v * sin(ψ) dy/dt u * sin(ψ) v * cos(ψ) dψ/dt r这一组方程本身是严格非线性的因为姿态角出现在三角函数里。LPV 建模的常见做法是保留这个旋转矩阵把航速 U sqrt(u² v²) 作为调度变量从而把非线性项嵌进参数依赖的矩阵中。这样我们得到的模型是x_dot A(ρ) x B(ρ) u_ctrl其中 ρ 是调度变量u_ctrl 是执行器指令向量——在水平面定位控制里通常就是舵角 δ_r方向舵和螺旋桨转速指令/纵向推力 T。如果案例数据给的是推力百分比而不是转速你在建模时要先做一次标定把百分比映射成稳态前向速度否则后面 MPC 的预测模型会产生系统性偏差。下面这个符号表建议贴在 Matlab 脚本头部注释里能避免后续两天找 bug符号含义单位x, y惯性系水平位置mψ艏向角radu载体前向速度m/sv载体横向速度m/sr艏摇角速度rad/sδ_r方向舵舵角radT纵向推力指令N 或 %U合速度 sqrt(u²v²)m/sβ侧滑角 atan2(v,u)rad2.2 调度变量怎么选航速、侧滑角与海流扰动LPV 模型的关键在于调度变量 ρ 的选择。AUV 水平面模型中水动力系数附加质量、阻尼阵随前向速度 u 变化显著所以最常见的调度变量是前向速度 u 或合速度 U。另一个常被考虑的是侧滑角 β。侧滑角反映海流对航行器的影响角度在低速或强流环境下不可忽略。这里有一个工程上的取舍调度变量必须是实时可测或可估计的量。u 可以直接从 DVL多普勒测速仪得到β 却往往需要靠观测器估计因为它涉及 v 的测量。你不一定非要同时把 U 和 β 都作为调度变量——调度空间的维度每增加一维你需要在多大一个网格上做线性化、存多少个顶点模型复杂度是按指数涨的。我一般会遵循两个原则一是优先选对系统动态影响最大的变量通常就是合速度 U二是在“可测性”和“可辨识性”之间找平衡。如果案例数据里只有航向、位置和舵令没有直接的速度记录你就要做一个简单的状态估计器先重建 u 和 v。这里有个更隐蔽的点海流引起的相对速度而不是对地速度才是真正作用于流体动力的量。在你做湖试案例数据分析时如果定位传感器记录的是对地位置而控制器里用的速度是 DVL 测的绝对声速积分两者之间会差一个海流速度。解决方法是把海流视为慢变常数扰动并靠速度形式的积分作用去压掉它而不是强行去测。2.3 离散化与参数边界零阶保持、采样周期与调度率限制LPV-MPC 最终要在数字控制器里运行所以必须把连续模型离散化。标准做法是零阶保持ZOH离散化假设在每个采样周期内调度变量 ρ 和输入向量 u_ctrl 保持不变直接把矩阵指数算出来。Matlab 里用 c2d 就能完成但要注意选项里指定 zoh而不是默认的 tustin。AUV 控制系统的采样率一般在 10 Hz 到 50 Hz 之间。航速低、机械舵机响应慢的10 Hz 足够舵机快、需要抗高频海浪干扰的可以提到 20 Hz。调度率限制也在这里起作用MPC 在做滚动优化时默认认为 ρ(k)、ρ(k1)、ρ(k2) 都是可提前获取的未来序列。如果你的调度变量在相邻两个周期之间突跳超过某个阈值比如 0.2 m/s那么预测模型和实际系统就脱节了。所以在工程实现中要给 ρ 加低通滤波器或者干脆在 MPC 预测里显式限制 ρ 的变化率。离散化得到的状态转移矩阵是 A_d(ρ(k)) exp(A_c(ρ(k)) * Ts)输入矩阵是 B_d(ρ(k)) integral exp(A_c * τ) dτ * B_c。这里有一个很容易翻车的地方Matlab 的 c2d 不支持调度参数作为可变输入——它要求一个固定的状态空间对象。所以你在写脚本时一定要在每个采样周期内重新生成 A_c(ρ(k))再调用 c2d 得到当前的离散模型而不能只算一次。这个细节我们会在第 4 章的程序实现里用具体代码说明。3. 速度形式 MPC控制增量进代价函数是稳态精度的分水岭3.1 为什么不用“位置形式”静差和抗扰能力的缺失MPC 有两种常用的公式化写法。一种是位置形式决策变量直接是控制量 u(k)代价函数里写的是 u(k) 和参考值的偏差另一种是速度形式决策变量是控制增量 Δu(k)实际发送到执行器的控制量通过 u(k) u(k-1) Δu(k) 累加得到。速度形式的本质是在控制器内部嵌入一个离散积分器。对于 AUV 这类存在海流扰动、模型不确定性和传感器缓慢漂移的系统这个积分作用几乎是刚需如果没有它即使 MPC 的预测模型能精确描述名义系统真实海流带来的常值扰动也会让最后的位置误差稳定在一个非零值上也就是静差。你可以通过增大 Q 矩阵硬压它但代价是噪声被放大控制量抖动。位置形式还有一个问题如果执行器饱和了MPC 求出的 u(k) 超出物理限幅你必须把饱和后的值重新喂回状态预测否则预测和控制会越偏越远。速度形式天然把这个问题拆成了两步每次只约束增量 Δu再由累加环节保证控制量在饱和限幅内。这对 AUV 舵机保护特别重要——舵角到了 ±20° 机械限位时位置形式还在傻傻计算更大的舵角而速度形式知道你上一拍已经在限幅处这一拍只能往回收。3.2 预测模型的代数变换增广状态与控制律写法把速度形式落实到状态空间模型需要对原状态进行增广。原模型x(k1) A_d x(k) B_d u(k)定义增广状态 x_a(k) [x(k); u(k-1)]其中 u(k-1) 是上一拍的控制量。从预测时域内递推x(k1) A_d x(k) B_d (u(k-1) Δu(k)) u(k) u(k-1) Δu(k)把第二个式子升维后代入第一个得到增广状态方程x_a(k1) [A_d, B_d; 0, I] x_a(k) [B_d; I] Δu(k)输出方程保持 y(k) C x(k)其中 C 把位置和航向挑出来。这里最关键的一步是把预测时域 Np 内的所有输出展开成关于 Δu 序列的线性函数Y F x_a(k) G ΔU。其中的系数矩阵 F 和 G 是通过反复递推组装出来的。G 是“下三角块”结构——第 k 时刻的控制增量只影响第 k 时刻及以后的输出这是因果性的体现你可以把它当作验证程序正确性的标准如果 G 矩阵的元素出现在下三角之外说明你的递推索引错了。代价函数写成J (Y - Y_ref).T Q_bar (Y - Y_ref) ΔU.T R_bar ΔU U.T S_bar U三个代价项的权重不同作用也完全不同。Q 项保证定位精度R 项抑制舵机频繁动作S 项限制控制量的绝对值。很多初做 MPC 的人只设 Q 和 R结果仿真能跑实测时舵机一直在小幅度抖振问题就出在缺了 S 项。注意 U 是要用“名义上可能达到的最大舵角”来做归一化的否则 S 的取值会变成玄学。3.3 约束与权重物理限幅、增量限幅和软约束AUV 执行器约束分三类。第一类是舵角位置限幅例如 δ_r ∈ [-20°, 20°]第二类是舵机速率限幅通常用每步最大增量表示比如 20 Hz 采样率下每步增量不超过 0.5°第三类是纵向推力/转速限幅例如 0%~100% 推进器指令。在 MPC 的 QP 问题里位置限幅和增量限幅要分开写进不同的约束行。有人图省事只约束绝对舵角忽略增量约束结果快速转向时舵机跟不上响应滞后航迹出现蛇形。权重矩阵的经验初始值Q 位置项的加权系数可以取 1~10按位置误差的归一化参考尺度航向角项取 0.5~2R 增量项的数值通常比 Q 小一到两个数量级比如 0.01~0.1S 绝对值项取 0.1~1。为什么 Q 大 R 小因为 AUV 的定位精度是主要指标舵机动作不是成本项。但如果你发现闭环出现高频抖振先把 R 往大调一个数量级往往比调 Q 更见效。约束还有一个坑当状态偏差过大比如定位误差超过 3 米、航向偏了 30°位置硬约束会直接让 QP 问题无可行解。正确做法是给位置和航向误差加软约束也就是在代价函数里增加松弛变量 εJ J_标称 ρ_soft * ||ε||²。松弛变量的权重 ρ_soft 要取得足够大——一个常见的量级是 1000——这样正常工况下 ε 会被推到近似为 0只在超调时被激活。注意位置硬约束在 AUV 工况里几乎没有意义因为你很难保证预测模型在极限工况下还能保持约束可行。保留舵角的硬约束、位置误差用软约束表达是最稳妥的组合。4. Matlab 程序与案例数据把控制闭环跑起来的落地细节4.1 主脚本骨架模型参数、调度序列、MPC 对象三件套拿到一份 AUV 定位控制的速度形式 LPV-MPC Matlab 程序与案例数据建议先不要一头扎进 MPC 函数里读而是从主脚本看起。一个结构清晰的工程包主脚本只做三件事加载模型参数、构造调度序列、调用 MPC 求解器。下面给出一段可复用的主脚本模板。%% AUV LPV-MPC velocity form - main script clear; clc; close all; % 1) 模型参数案例数据包通常给出 in ertial 坐标系下的名义值 params.L 2.0; % 艇长/m params.m 1200; % 质量/kg params.Xu -30; % 纵荡阻尼/N/(m/s) params.Yv -90; % 横荡阻尼/N/(m/s) params.Nr -50; % 艏摇阻尼/Nm/(rad/s) params.dr_max 20*pi/180; % 舵角限幅 /-20° params.ddr_max 0.5*pi/180; % 每步增量限幅 0.5°/step 20Hz % 2) 采样与预测时域 Ts 0.05; % 20 Hz 控制周期 Np 20; % 预测时域 1 s Nc 8; % 控制时域 % 3) 加载案例数据替换为数据包里的文件路径即可 data load(auv_case1_turning.mat); % 内含 t, yaw, pos_x, pos_y, rudder, speed t data.t; yaw data.yaw; pos_x data.pos_x; pos_y data.pos_y; u_speed data.speed; % 前向速度序列 / m/s % 4) 构造调度变量序列合速度做低通滤波防止调度率突变 rho movmean(u_speed, 5); % 5 点滑动平均抑制传感器噪声造成的调度跳变 rho_min min(rho); rho_max max(rho); % 5) 逐时刻调用 LPV-MPC 求解器 x_hist [pos_x(1); pos_y(1); yaw(1); u_speed(1); 0; 0]; u_prev 0; rudder_cmd zeros(length(t), 1); for k 1:length(t)-1 % 从案例数据取当前调度值供预测模型参数化 rho_k rho(k); % 组装当前时刻的 LPV 离散模型 [Ad, Bd, C] lpv_auv_model(rho_k, Ts, params); % 调用 MPC 求解器速度形式内部完成增广和 QP 求解 delta_u lpv_mpc_solve(Ad, Bd, C, x_hist, u_prev, ... yaw(k), Np, Nc, params); u_new u_prev delta_u; u_new max(-params.dr_max, min(params.dr_max, u_new)); % 舵角饱和 rudder_cmd(k) u_new; % 用案例数据中的真实状态作为下一拍反馈回放模式 x_hist [pos_x(k1); pos_y(k1); yaw(k1); u_speed(k1); 0; 0]; u_prev u_new; end这段脚本的逻辑结构是先定义模型参数和执行器限幅再加载案例数据集随后用滑动平均处理好调度变量最后在循环里逐个时刻求解 MPC 的增量舵角。代码里第 95 行的movmean非常关键——它把调度变量的高频抖动滤掉保证 LPV 模型矩阵不会在两个相邻周期之间突跳。采样周期取了 0.05 秒对应 20 Hz是因为方向舵伺服机构通常能跟上这个速率如果你的舵机是船用级别的慢舵机响应时间大于 0.5 秒建议把 Ts 下拉到 0.1 秒。4.2 手写 Hildreth 投影还是工具箱两条路线我各给一套骨架实现速度形式 LPV-MPC 时Matlab Model Predictive Control Toolbox 有现成的 MPC 对象但它对“调度参数依赖的模型”支持有限——它的 LTI 对象不能在滚动优化内实时切换 A_d(ρ)。你当然可以用多个 LTI 模型组 switch 逻辑但代码会非常别扭。另一个选择是手写 QP。对于 AUV 这种状态维数低6~8 维、约束少几个线性约束的问题手写 QP 的稳定性和可读性反而更好而且后续从仿真转到 C 代码移植时没有工具箱依赖问题。常见做法是使用 Hildreth 投影法求解带约束的 QP它的核心是解对偶问题的迭代。下面这个函数是速度形式 MPC 的核心求解器输入当前离散模型、上一拍控制量和参考航向输出控制增量function delta_u lpv_mpc_solve(Ad, Bd, C, x_hist, u_prev, y_ref, Np, Nc, params) % 状态与输入维度 nx size(Ad, 1); nu 1; % 只考虑方向舵单输入 % 组装预测矩阵 F 和 GY F*x G*delta_U F zeros(Np, nx); G zeros(Np, Nc); x_pred zeros(nx, Nc1); x_pred(:,1) x_hist; for i 1:Np F(i,:) C * Ad^i; % 只取控制量为零时的自由响应 for j 1:min(i, Nc) % 下三角结构第 j 个增量只影响 ij 的输出 G(i,j) C * Ad^(i-j) * Bd; end end % 代价函数 Hessian 与线性项Q_bar, R_bar, S_bar 已在外部组装 Q_bar 1e2 * eye(Np); % 输出误差权重 R_bar 1e-2 * eye(Nc); % 增量权重 S_bar 1e-1 * eye(Nc); % 绝对舵角权重 H 2 * (G*Q_bar*G R_bar S_bar); f 2 * G * Q_bar * (F*x_hist - y_ref*ones(Np,1)); % 约束舵角位置限幅 - 增量形式的左乘矩阵 % u(ki) u_prev cumsum(delta_u) 展开成 D * delta_u dr_max D tril(ones(Nc, Nc)); lb_u -params.dr_max - u_prev; ub_u params.dr_max - u_prev; Aineq [D; -D]; % 上下限统一转为不等式 bineq [ub_u*ones(Nc,1); -lb_u*ones(Nc,1)]; % 增量限幅 ddr_max Aineq [Aineq; eye(Nc); -eye(Nc)]; bineq [bineq; params.ddr_max*ones(Nc,1); params.ddr_max*ones(Nc,1)]; % Hildreth 投影求解 QP标量控制输入迭代 50 次足够收敛 lambda zeros(size(Aineq,1), 1); for iter 1:50 for i 1:length(lambda) tmp H \ f; % 无约束解的修正基准 v tmp (H \ (Aineq * lambda)); % 逐个乘子做梯度投影 lambda(i) max(0, lambda(i) - (Aineq(i,:)*v - bineq(i)) / ... (Aineq(i,:) * (H \ Aineq(i,:)) 1e-10)); end end delta_U -H \ (f Aineq * lambda); delta_u delta_U(1); % 只取当前时刻的控制增量 end这段代码把速度形式 MPC 的核心数学结构完整呈现出来了。F和G的组装是整个实现的“黑匣子”之处——注意G矩阵的下三角特性如果你在调试时发现某个元素出现在上三角区域说明递推公式里的指数项写错了。约束部分用tril生成累积和矩阵把绝对舵角限幅转换成增量线性不等式这是速度形式的一个巧妙转换原本的非线性饱和问题被线性不等式精确表达。Hildreth 迭代的收敛速度对H的条件数很敏感如果你调参时发现求解抖动先在H的对角元素上加一个小量1e-8 * eye改善条件数。4.3 案例数据的导入与对齐时间戳、单位、坐标系案例数据包的常见结构是状态记录文件包括时间、位置、航向、前向速度、横荡速度和控制指令文件时间、舵令、推进器指令。两份文件的采样率往往不一致——状态记录可能是 5 Hz 或 10 Hz控制指令可能是 20 Hz。Matlab 里做时间对齐最简单的方案不是卖弄interp1而是用timetable的synchronize函数ttState timetable(seconds(state_time), pos_x, pos_y, yaw, u_speed, ... VariableNames, {x,y,psi,u}); ttCmd timetable(seconds(cmd_time), rudder_cmd, ... VariableNames, {delta_r}); ttSync synchronize(ttState, ttCmd, union, linear);对齐之后再统一检查单位和坐标系。单位问题是最容易踩的坑有的案例数据速度给的是节kn需要乘以 0.5144 转成 m/s舵角有的给度有的给弧度如果你不统一MPC 的限幅约束直接失效。坐标系问题则更隐蔽船载传感器输出的往往是经纬度需要先做高斯投影或使用geodetic2ned转换为北东地NED坐标系否则位置反馈和模型的惯性坐标对不上。检测方法很简单让 AUV 从起点绕一个矩形航迹回到起点附近看终点的位置偏差是否在传感器噪声范围内。如果偏差是几十米不要先怀疑 MPC先去查单位换算和坐标系转换。还有一个数据质量陷阱案例数据里的航向角可能是在 [-π, π] 或 [0, 2π] 区间跳变的。如果你直接用原始数据做差分或插值会在跳变点产生一个巨大的尖峰。要在预处理阶段用wrapToPi把角度连续化。很多仿真表现良好的控制器一到真实数据处理就发散问题往往就出在这个看似不起眼的角度跳变上。5. 避坑清单LPV-MPC 最容易翻车的五个地方5.1 现象仿真零误差湖试第一圈就发散这个现象在 LPV-MPC 里比在普通 MPC 里更常见原因在于调度变量穿帮了。在做仿真时如果你直接从模型内部把真实的纵向速度 u 取出来作为调度变量这等于把“答案”告诉给了控制器。到了真实系统DVL 测速噪声、水流干扰、时延叠加在一起你喂给 MPC 的 ρ 和模型内部的真实调度值对不上预测模型整个错位。解决方法是在仿真阶段就给调度变量加带限白噪声幅度取真实传感器噪声的 1.5 倍并做低通滤波。我一般习惯用截至频率为 0.5 Hz 的一阶低通先看加了噪声后 MPC 还能不能稳。5.2 现象QP 求解时提示 Hessian 矩阵奇异或非正定这在手写 QP 里几乎是必踩的坑。原因基本是权重矩阵对角线元素的量级悬殊位置误差权重 Q 取了 1e4增量权重 R 取了 1e-5四个数量级的差距会让 Hessian 矩阵条件数破千Hildreth 迭代收敛极慢甚至震荡。另外矩阵组装时如果状态维数不匹配比如把 6 维状态向量和 4 维的 C 矩阵乘在一起Matlab 会直接报错但有时候是广播机制悄悄把维度补齐了Hessian 就悄悄多出一行零特征值。解决方法是在调用求解器前加一行assert(min(eig(H)) 0)把非正定问题拦在外面。5.3 现象控制量高频抖振舵面一直在小幅摆动多数情况下不是 MPC 参数问题而是你缺了 S_bar 这一项。只惩罚增量 Δu不惩罚绝对舵角 u控制器会利用“串”的等效性在稳态时输出一个可以让 Δu 为零的任意舵角于是对噪声的响应被放大成高频小幅摆动。解决方式是把 S_bar 从远小于 R_bar 的值起步逐步调大直到抖动消失。还有一个佐证指标如果抖振频率接近采样频率20 Hz 的 1/4 以上基本可以断定是惩罚项缺失而不是模型不准。5.4 现象案例数据回放时航迹对不上误差越差越大这个坑我愿意称之为“数据清洗的代价”。案例数据里的时间戳可能是 GPS 时间秒加纳秒也可能是从脚本运行开始的相对时间。如果你的对照组和控制组用的是不同起点的时间基准对齐之后就会产生积分漂移。再一个是位置坐标系传感器矩阵输出的经纬度如果没做投影就用直接进入 MPC 的 NED 模型航向参考会有几百米的偏差。解决方法是在数据加载后立刻做五项检查——时间基准是否一致、经纬度是否投影、速度单位是否 m/s、舵角单位是否弧度、角度是否连续化。前四项用一条 if 判断就能拦下 90% 的问题。5.5 现象调度变量跳变MPC 可行域突然消失当 AUV 经过强流区域或螺旋桨加速调度变量 ρ 在相邻两步之间猛地从 2 m/s 跳到 2.8 m/s预测模型里的状态转移矩阵就跨了一大格。在 LPV 的稳定工况假设下这种跳变会让预测轨迹完全偏离真实动态甚至导致约束无解。解决方法是限制调度率在调度变量进入 MPC 之前给它加一个限速器——每一步的 ρ 变化量不得超过 ρ_dot_max × Ts。如果你的案例数据里包含湍流明显的航段这个限速器必须放在低通滤波之后。否则低通只能滤噪声滤不掉真正的强流突变。6. 验证进阶离线回放、扰动扫描与无迹平滑当 LPV-MPC 在仿真和案例数据上都能稳定运行后下一步不是急着装艇而是做三类验证。第一是离线回放。把案例数据记录的真实状态序列按采样周期送入你写好 MPC 控制器但把控制输出只记录下来、不回写到系统。然后对比 MPC 预测的输出轨迹与真实轨迹的残差。残差曲线的均值接近零、方差在一定范围内说明你的预测模型在真实工况下的置信度足够。如果残差在某个航段系统性偏移去检查那个航段的调度变量是不是超出了建模范围——这种情况通常发生在航速超过模型辨识区间时。第二是扰动扫描。海流方向和速度是 AUV 定位控制的最大干扰源而案例数据往往只覆盖其中一种工况。把海流方向从 0° 到 360°、速度从 0 到 1 m/s 做一个网格扫描每一个网格点跑一次闭环仿真记录定位均方根误差。画成热力图后如果误差云图在某一个方向或速度区间出现“尖刺”说明你的 LPV 模型或权重在这个工况下存在薄弱点。这个做法花费不大却能在湖试前把控制器短板暴露出来。第三是无迹卡尔曼平滑。案例数据里的位置和航向来自传感器存在测量噪声。如果你直接把这些带噪的测量值作为 MPC 状态反馈预测模型的输入就已经带上了随机性。常见做法是在做离线分析时用无迹卡尔曼滤波UKF对整个轨迹做一次双向平滑用平滑后的状态序列评估 MPC 的真实性能。UKF 的调参只有一个核心过程噪声协方差 Q 取多大。取太小平滑结果会紧贴测量值等于没滤波取太大轨迹会被过度拉直掩盖真实机动。经验值是从该 AUV 已知的 DVL 噪声水平出发Q 取 0.01×I 到 0.05×I 试跑两遍看残差自相关性消失即可。这个流程跑完你基本能确认这套控制系统是“可以在湖试台上放手一搏”的状态。我自己在调案例数据时单位不统一和数据时间戳错位这两个低级错误分别让我多踩了两天和两天半的坑。后来学乖了脚本开头固定放一段五连检查谁也别想改掉。LPV-MPC 这套东西模型比 PID 精细、效果比固定增益控制器好但它对数据质量的敏感度也更高——把数据前置检查做扎实比调权重大一天都省时间。希望这些过程和方法能帮到你。本文还有配套的精品资源点击获取