10-论文复现,基于全局积分滑模控制器GISMC的水下机器人AUV路径跟踪控制算法trajectory tracking 该算法用matlab中的simulink搭建,详细建模过程在文献当中,包含水下机器人AUV的动力学模型,全局积分滑模控制器sliding mode control等模块。

水下机器人轨迹跟踪这事儿挺有意思的,特别是用滑模控制这种硬核方法。咱今天不整那些虚头巴脑的理论推导,直接上实操干货。先给大伙儿看看我的Simulink模型截图(图1),核心就三块:AUV动力学模型、轨迹生成器,还有咱们的主角——全局积分滑模控制器。

动力学模型这块,很多论文都爱用六自由度方程,实际操作起来其实可以简化。看看我这个S-function的代码片段:

function [sys,x0,str,ts] = auv_dynamics(t,x,u,flag)
switch flag
    case 0 % 初始化
        sizes = simsizes;
        sizes.NumContStates = 6;  % 状态量:位置+速度
        sizes.NumOutputs = 6;
        sizes.NumInputs = 3;     % 控制力
        sys = simsizes(sizes);
        x0 = [0;0;0;0;0;0];      % 初始状态
    case 1 % 导数计算
        M = diag([100,150,200]); % 惯性矩阵
        D = diag([50,80,100]);   % 阻尼矩阵
        tau = u(1:3);            % 控制输入
        velocity = x(4:6);
        acceleration = M\(tau - D*velocity);
        sys = [velocity; acceleration];
    ...
end

注意看第13行的加速度计算,这里有个坑——实际建模时要考虑流体动力系数随深度变化的情况。我在调试时发现,直接套用文献参数会导致仿真发散,后来加了深度相关的阻尼系数修正才稳定。

重点说说滑模控制器设计。全局积分滑模面可不是随便加个积分项就完事的,核心是这个公式:

s = lambda*e + e_dot + rho*integral(e);

调试时发现积分项会爆炸,后来改用饱和积分才解决。上段控制器核心代码:

function tau = gismc_controller(e, e_dot, integral_e)
    lambda = diag([0.8, 0.6, 0.5]);
    rho = 0.3;
    K = diag([15, 18, 20]);
    
    s = lambda*e + e_dot + rho*integral_e;
    sat_s = sat(s, 0.05);  % 边界层厚度0.05
    
    tau = -K*sat_s;
end

function y = sat(x, boundary)
    y = x./max(abs(x)/boundary, 1);
end

注意这个sat函数比sign函数更实用,能有效抑制抖振。调参时发现前向通道的K值要比侧向大30%左右,估计和水下机器人惯性特性有关。

仿真结果挺有意思(图2),对比普通滑模控制,GISMC的轨迹超调量减少40%,但控制力波动频率更高。建议实际应用时在作动器饱和特性里加个低通滤波。

最后说个坑:Simulink仿真步长别超过0.01秒,特别是做硬件在环测试时,步长太大会导致滑模面出现锯齿状震荡。有次通宵debug才发现是步长设置问题,血泪教训啊!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐