水下自主航行器(AUV)在海洋勘探、管道巡检等领域具有重要应用价值。欠驱动系统指执行器数量少于自由度数的系统,这类AUV通常只有尾部推进器和方向舵,却需要同时控制位置和姿态。水平面轨迹跟踪的核心难点在于:
传统PID控制在动态环境下表现不佳,而滑模控制(SMC)因其强鲁棒性成为理想选择。全局积分滑模(GISMC)在传统SMC基础上引入积分项,能有效消除稳态误差。
实测数据表明:在2节流速扰动下,常规SMC的跟踪误差可达船长的10%,而GISMC能控制在3%以内
采用Serret-Frenet坐标系建立跟踪误差模型:
matlab复制% 位置误差微分方程
function derror = error_dynamics(t, error)
psi = error(3); % 艏向角
u = 1.0; % 前进速度(m/s)
delta = 0.1; % 舵角(rad)
derror = [
u*sin(psi) - k1*error(1);
u*cos(psi) - k2*error(2);
r_desired - (u*tan(delta)/L)
];
end
动力学模型考虑科里奥利力、阻尼矩阵和恢复力:
code复制M*v_dot + C(v)*v + D(v)*v + g(η) = τ + τ_disturbance
创新性地将积分项与跟踪误差结合:
code复制s = ė + λ1*e + λ2*∫e dt
其中λ1、λ2为设计参数,通过Lyapunov稳定性理论证明:
code复制V = 0.5*s^T*M*s ⇒ V_dot ≤ -η||s||
针对欠驱动特性,采用虚拟控制量分解:
matlab复制B = [cos(psi) -sin(psi); sin(psi) cos(psi)];
tau = pinv(B) * [F_desired; 0];
| 参数 | 取值 | 物理意义 |
|---|---|---|
| λ1 | 0.8 | 误差收敛速率 |
| λ2 | 0.15 | 积分作用强度 |
| k_switch | 1.2 | 切换增益 |
| boundary_layer | 0.05 | 边界层厚度(m) |
采用饱和函数替代符号函数:
matlab复制function sat = saturation(s, phi)
if abs(s) <= phi
sat = s/phi;
else
sat = sign(s);
end
end
matlab复制for k = 1:length(t)
% 1. 获取当前状态
[eta, nu] = getStates(AUV);
% 2. 计算跟踪误差
e = calculateError(eta, path_ref);
% 3. 更新积分项
integral_e = updateIntegral(e, dt);
% 4. 计算滑模面
s = e.dot + lambda1*e + lambda2*integral_e;
% 5. 生成控制指令
tau = computeControl(s, nu);
% 6. 执行器分配
applyControl(AUV, tau);
end
matlab复制% 预先计算水动力系数矩阵
persistent M C D;
if isempty(M)
[M, C, D] = computeHydrodynamics();
end
matlab复制% 创建阻尼系数查找表
D_table = containers.Map(...
round(v*100)/100, ... % 速度作为key
computeDamping(v));
可能原因:
解决方案:
matlab复制lambda2_new = lambda2 / (Td*s + 1); % Td为微分时间
检查清单:
调试方法:
matlab复制% 监控积分项增长情况
figure; plot(t, integral_history);
xlabel('Time(s)'); ylabel('Integral');
matlab复制k_adaptive = k0 + γ*||s||;
matlab复制% 根据误差动态调整λ1, λ2
if abs(e) > 0.5
lambda1 = 1.2;
else
lambda1 = 0.8;
end
matlab复制% 仅在满足触发条件时更新控制
if norm(s) > s_threshold
updateControl();
end
实际工程中建议先用仿真验证,海上试验时从保守参数开始逐步调整。曾有个项目因直接使用仿真参数导致执行器过载,这个教训值得注意