船舶运动控制器及仿真程序

  将船舶视为刚体,其动力学在平衡点经3阶展开如下式所示

egin{equation}
left[egin{array}{ccc}
m-X_{i} & 0 & 0 \
0 & m-X_{i} & m x_{g}-Y_{i} \
0 & m x_{g}-N_{i} & I_{z}-N_{dot{r}}
end{array} ight]
left[egin{array}{c}Delta dot{u} \
dot{v} \
dot{r}
end{array} ight] = left[egin{array}{c}
X \
Y \
N
end{array} ight]
end{equation}

egin{equation}
left{egin{matrix}
X= & X_{u} Delta u +X_{uu} Delta u^2+X_{uu} Delta u^3+X_{vv} Delta v^2+X_{rr} Delta r^2 + X_{rv} rv\
&+ X_{delta delta } Delta delta ^2 + X_{udelta delta } Delta u delta ^2 + X_{v delta } v delta+ X_{uv delta } Delta uv delta quad quad quad quad quad quad \
Y= & Y_{v} v +Y_{r} r+Y_{vvv} v^3+Y_{vvr} rv^2+Y_{vu} Delta u + Y_{ru} rDelta u qquad qquad \
&+ Y_{delta} Delta + Y_{delta delta delta } delta ^3 + Y_{u delta } Delta u delta+ Y_{uu delta } Delta u^2 delta +Y_{vdelta delta } vdelta ^2+Y_{vvdelta } v^2delta \
N= & N_{v} Delta v +N_{r} Delta r+N_{vvv} Delta v^3+N_{vu} vDelta u+N_{ru} rDelta u + N_{delta } delta qquad \
&+ N_{delta delta delta } Delta delta ^3 + N_{udelta } Delta u delta + N_{uu delta } Delta u^2 delta+ N_{v delta delta } v delta ^2 +N_{vvdelta } v^2delta quad
end{matrix} ight.
end{equation}

   式中 ( [Delta u quad v quad r] ) 分别表示纵向速度偏差、横漂速度偏差和舵向速度偏差,( Delta u = u-U_0 ) ,( Delta v = v ) ,( Delta r = r ) ,( U_0 ) 为经济航速,m为质量, ( I_z ) 为转动惯量,( x_g ) 为中心中心矩 ( [X quad Y quad N] ) 为舵力, ( X_u ), ( X_{uu} ),( Y_v ),( N_v )等是动力学泰勒展开时的系数。船舶动力学方程如下:

egin{equation}
left{egin{matrix}
dot{x} = ucos psi - vsin psi +U_ccos gamma _c \
dot{y} = usin psi - vcos psi +U_csin gamma _c \
dot{psi } = r qquad qquad qquad qquad qquad quad\
dot{delta } = dot{delta } qquad qquad qquad qquad qquad quad
end{matrix} ight.
end{equation}

  式中, ( psi ) 为偏航角, ( U_c ) 为流速, ( gamma_c ) 为流向,( x )为北向坐标,( y )为东向坐标, ( delta ) 为舵偏角。控制器方程式如式

egin{equation}
delta =
left{egin{matrix}
left | delta ight | < delta _{max} & -Kleft ( left ( psi -psi _0 ight ) + T_d imes r ight ) \
left | delta ight | > delta _{max} & delta _{max},-delta _{max}
end{matrix} ight.
end{equation}

  式中 ( delta ) 为舵偏角, ( delta_{max} ) 为允许的最大舵偏角,  ( K_p ) 为PD控制器P增益,T_d为PD控制器D增益,( psi_0 ) 为目标偏航角。船舶控制逻辑为:通过控制舵偏角使得船舶偏航角达到指定角度,控制器采用PD算法。

% 主函数,文件名为boat_PD
t_f = 600;   % 仿真事件设定
h   = 0.1;   % 采样时间
Kp = 1;      % 控制器P增益
Td = 10;     % 控制器D增益
 
% 状态x = [ u v r x y psi delta ]' 赋初值
x = zeros(7,1);   
 
N = round(t_f/h);               % 采样量
xout = zeros(N+1,length(x)+2);    %  输出变量赋初值

% 分支结构流程控制
for i=1:N+1,
    time = (i-1)*h;                   
    r   = x(3);
    psi = x(6);
    
    psi_ref = 5*(pi/180);            % 控制目标角度
    delta = -Kp*((psi-psi_ref)+Td*r);  % PD控制器
 
    % 调用M函数文件
    [xdot,U] = mariner(x,delta);       % 船舶模型
    
    % 存储数据以便后续调用
    xout(i,:) = [time,x',U]; 
    
    % 数值积分,欧拉算法   
    x = x + h*xdot
end

% 从存储的数据中给变量赋值
t     = xout(:,1);
u     = xout(:,2); 
v     = xout(:,3);          
r     = xout(:,4)*180/pi;   %  pi为Matlab特殊常量,表示圆周率
x     = xout(:,5);
y     = xout(:,6);
psi       = xout(:,7)*180/pi;
delta     = xout(:,8)*180/pi;
U     = xout(:,9);
 
% 作图
% 如果要作多个图,用figure(i),i = 123,…来实现
figure(1)
% 作完图之后,利用axis,xlabel等来丰富和定制图形的信息
plot(y,x),grid,axis('equal'),xlabel('East'),ylabel('North'),title('Ship position')
 
figure(2)
% 如果要求在一个图中作多个小图,用subplot来完成
subplot(221),plot(t,r),xlabel('time (s)'),title('yaw rate r (deg/s)'),grid
subplot(222),plot(t,U),xlabel('time (s)'),title('speed U (m/s)'),grid
subplot(223),plot(t,psi),xlabel('time (s)'),title('yaw angle psi (deg)'),grid
subplot(224),plot(t,delta),xlabel('time (s)'),title('rudder angle delta (deg)'),grid
boat_PD.m
function [xdot,U] = mariner(x,ui,U0)
% [xdot, U] = mariner(x,ui) 返回真实速度U in m/s 以及状态变量x = [ u v r x y psi delta n ]'
%的偏差
% 
%输入变量有:
% u     = 与常规速度Uo之间的偏差,U0默认值为U0 = 7.7175 m/s = 15 knots. 
% v     = 摇摆速度与0之间的偏差 (m/s)
% r     = 偏航角速度与0之间的偏差 (rad/s)
% x     = x方向的位置 (m)
% y     = y方向的位置 (m)
% psi   = 偏航角与0之间的偏差 (rad)
% delta  = 真实的舵偏角 (rad)
% ui    = 控制舵角指令(rad),即控制器输出
% U0    = 常规速度 (m/s)

% 输出变量
% xdot为状态变量的微分
% U    = 真实速度 (m/s)

% 确认输入值是否符合要求
% 如果输入不是7维,则输出错误信息
if (length(x)  ~= 7),error('x-vector must have dimension 7 !'); end  
% 如果控制舵角指令不是1维,则输出错误信息
if (length(ui) ~= 1),error('ui must be a scalar input!'); end
% 如果没有输入U0信息,则采用默认值
if nargin==2, U0 = 7.7175; end
 
% 对变量赋值及归一化
L = 160.93;
U = sqrt((U0 + x(1))^2 + x(2)^2);  % 真实速度
delta_c = -ui;   
u     = x(1)/U;   
v     = x(2)/U;  
r     = x(3)*L/U; 
psi    = x(6); 
delta  = x(7); 
delta_max  = 40;           % 最大舵角      (deg)
Ddelta_max = 5;            % 最大舵角速度  (deg/s)
m  = 798e-5;
Iz = 39.2e-5;
xG = -0.023;
% 舵力及力矩在0值附近展开系数赋值
Xudot  =  -42e-5;       Yvdot =  -748e-5;           Nvdot = 4.646e-5;
Xu    = -184e-5;       Yrdot =-9.354e-5;           Nrdot = -43.8e-5;
Xuu   = -110e-5;       Yv    = -1160e-5;       Nv    =  -264e-5;
Xuuu  = -215e-5;       Yr    =  -499e-5;       Nr    =  -166e-5;
Xvv   = -899e-5;       Yvvv  = -8078e-5;       Nvvv  =  1636e-5;
Xrr    =  18e-5;       Yvvr  = 15356e-5;       Nvvr  = -5483e-5;
Xdd   =  -95e-5;       Yvu   = -1160e-5;       Nvu   =  -264e-5;
Xudd  = -190e-5;       Yru   =  -499e-5;       Nru   =  -166e-5;
Xrv   =  798e-5;       Yd    =   278e-5;       Nd    =  -139e-5;
Xvd   =   93e-5;       Yddd  =   -90e-5;       Nddd  =    45e-5;
Xuvd  =   93e-5;       Yud   =   556e-5;       Nud   =  -278e-5;
                       Yuud  =   278e-5;       Nuud  =  -139e-5;
                   Yvdd  =    -4e-5;       Nvdd  =    13e-5;
                   Yvvd  =  1190e-5;       Nvvd  =  -489e-5;
                   Y0    =    -4e-5;       N0    =     3e-5;
                   Y0u   =    -8e-5;       N0u   =     6e-5;
                   Y0uu  =    -4e-5;       N0uu  =     3e-5;
% 等式(1-1)左边变量
m11 = m-Xudot;
m22 = m-Yvdot;
m23 = m*xG-Yrdot;
m32 = m*xG-Nvdot;
m33 = Iz-Nrdot;
 
% M文件流程控制中的分支结构
if abs(delta_c) >= delta_max*pi/180,
% 如果计算得舵角大于舵角允许最大值,则采用舵角允许最大值
   delta_c = sign(delta_c)*delta_max*pi/180; 
end
% 舵角速度等于现在的舵角值减去上次舵角值
delta_dot = delta_c - delta;
if abs(delta_dot) >= Ddelta_max*pi/180,
% 如果计算得舵角速度大于舵角速度允许最大值,则采用舵角速度允许最大值
   delta_dot = sign(delta_dot)*Ddelta_max*pi/180;
end
 
% 等式(1-2)
X = Xu*u + Xuu*u^2 + Xuuu*u^3 + Xvv*v^2 + Xrr*r^2 + Xrv*r*v + Xdd*delta^2 +...
    Xudd*u*delta^2 + Xvd*v*delta + Xuvd*u*v*delta;
Y = Yv*v + Yr*r + Yvvv*v^3 + Yvvr*v^2*r + Yvu*v*u + Yru*r*u + Yd*delta + ...
    Yddd*delta^3 + Yud*u*delta + Yuud*u^2*delta + Yvdd*v*delta^2 + ...
    Yvvd*v^2*delta + (Y0 + Y0u*u + Y0uu*u^2);
N = Nv*v + Nr*r + Nvvv*v^3 + Nvvr*v^2*r + Nvu*v*u + Nru*r*u + Nd*delta + ...
    Nddd*delta^3 + Nud*u*delta + Nuud*u^2*delta + Nvdd*v*delta^2 + ...
    Nvvd*v^2*delta + (N0 + N0u*u + N0uu*u^2);
 
detM22 = m22*m33-m23*m32;
% 分量计算
xdot = [           X*(U^2/L)/m11
        -(-m33*Y+m23*N)*(U^2/L)/detM22
         (-m32*Y+m22*N)*(U^2/L^2)/detM22
           (cos(psi)*(U0/U+u)-sin(psi)*v)*U
           (sin(psi)*(U0/U+u)+cos(psi)*v)*U   
                    r*(U/L)
                    delta_dot                  ];
mariner.m

  仿真结果如下:

 

  由图可看出,设计的控制器能够使船舶偏航角达到的指定角,控制器是有效的。

参考文献

[1]  施梨.MATLAB工程仿真与应用30例[M].北京:电子工业出版社,2015.5.

原文地址:https://www.cnblogs.com/jianle23/p/13913408.html