【利用母船和牵引风箬在飞行中回收微型飞行器(MAVs)的方法】使用高斯原理推导了电缆-风箬系统的动力学模型(Matlab、Simulink仿真实现)

  💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

 ⛳️赠与读者

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码、数据、文章


 ⛳️赠与读者

👨‍💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。当哲学课上老师问你什么是科学,什么是电的时候,不要觉得这些问题搞笑。哲学是科学之母,哲学就是追究终极问题,寻找那些不言自明只有小孩子会问的但是你却回答不出来的问题。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。

     或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎

💥1 概述

参考文献1:

摘要:本文提出了一种利用母船和牵引风箬在飞行中回收微型飞行器(MAVs)的方法。基于高斯原则提出了母船-电缆-风箬系统动力学建模的方法。利用系统的微分平整性质计算从期望的风箬轨道到母船轨迹的方法,并提出了基于李亚普诺夫原理的控制器,实现了准确的母船轨迹跟踪。此外,还描述了用于风箬的基于阻力的控制器。讨论了使MAV估计和跟踪风箬轨道的方法。通过仿真和飞行结果展示了建模和控制方法。

关键词: 无人空中车辆;MAVs;微型飞行器;动态建模;轨迹跟踪;多车辆;空中回收;牵引体系统;反步法;轨道估计;轨道跟踪;自主系统。

参考文献2: 

摘要-本文提出了一种利用大型母船和回收风箬进行微型飞行器(ARMAVs)空中回收的新概念。母船拖曳着连接着电缆的风箬,并控制风箬以匹配MAV的飞行模式。本文使用高斯原理推导出电缆-风箬系统的动态模型。在有风条件下,可控制的风箬在回收MAV中起着关键作用。我们开发了一种利用风箬阻力系数的控制方法。基于多连杆电缆-风箬系统的仿真结果展示了空中回收概念的可行性和风箬的可控性。 

牵引车辆(母船)被命令按照一个圆形轨道行驶,从而使得被牵引物体(风箬)也在一个较小半径和较低速度相对于母船的圆形轨道上运行。要被回收的微型飞行器(MAV)被规划为跟随风箬轨道,并以相对较低的空速接近风箬。在MAV对接风箬后,牵引电缆和物体(风箬和MAV)被缠绕进母船完成空中回收过程。
使用高斯原理推导了电缆-风箬系统的动力学模型。

📚2 运行结果

运行视频:

链接:https://pan.baidu.com/s/1LBLYt8IN9dIXrBSJGyrTHw 
提取码:4cia 
--来自百度网盘超级会员V5的分享

部分代码:

% end mdlInitializeSizes
%
%=======================================================================
% mdlUpdate
% Handle discrete state updates, sample time hits, and major time step
% requirements.
%==============================2=========================================
%
function [xup,fig_joint,fig_cable] = mdlUpdate(t,x,uu,P,fig_joint,fig_cable)

  initialize        = x(1);      % initial graphics
  fig_mothership    = x(2);      % mothership handle
  fig_drogue        = x(3);      % drogue handle
  fig_mav           = x(4);      % mav handle
  
  NN = 0;
  mothership.n     = uu(1+NN);  % north position
  mothership.e     = uu(2+NN);  % east position
  mothership.d     = uu(3+NN);  % down position
  mothership.psi   = uu(4+NN);  % heading angle
  mothership.phi   = uu(5+NN);  % roll angle
  mothership.theta = uu(6+NN);  % flight path angle
  
  NN = 9;  % ignore mothership accelerations
  drogue.n  = uu(1+NN);
  drogue.e  = uu(2+NN);
  drogue.d  = uu(3+NN);
  drogue.vn = uu(4+NN);
  drogue.ve = uu(5+NN);
  drogue.vd = uu(6+NN);
  drogue.phi  = uu(7+NN);
  drogue.theta = uu(8+NN);
  drogue.psi   = uu(9+NN);
  
  NN = NN+9; %
  mav.n     = uu(1+NN);
  mav.e     = uu(2+NN);
  mav.d     = uu(3+NN);
  mav.psi   = uu(4+NN);
  mav.V     = uu(5+NN);
  mav.phi   = uu(6+NN);
  mav.theta = uu(7+NN);
  
  if (P.cable.N>=2)
      % cable states
      for i = 1:(P.cable.N-1)
          NN = 6*(i-1) + 9 + 9 + 9;
          cable.n(i)  = uu(1+NN);
          cable.e(i)  = uu(2+NN);
          cable.d(i)  = uu(3+NN);
          cable.vn(i) = uu(4+NN);
          cable.ve(i) = uu(5+NN);
          cable.vd(i) = uu(6+NN);
      end
      
      X(1,1:2) = [mothership.n, cable.n(1)];
      Y(1,1:2) = [mothership.e, cable.e(1)];
      Z(1,1:2) = [mothership.d, cable.d(1)];

      NN = P.cable.N ;
      X(NN,1:2) = [cable.n(NN-1), drogue.n];
      Y(NN,1:2) = [cable.e(NN-1), drogue.e];
      Z(NN,1:2) = [cable.d(NN-1), drogue.d];
      
      if P.cable.N >= 3
          for i = 2:(P.cable.N-1)
              NN = i ;
              X(NN,1:2) = [cable.n(NN-1), cable.n(NN)];
              Y(NN,1:2) = [cable.e(NN-1), cable.e(NN)];
              Z(NN,1:2) = [cable.d(NN-1), cable.d(NN)];
          end
      end
  end
  
  NN = P.cable.N - 1;
  ell = [...
      cable.n(NN) - drogue.n;...
      cable.e(NN) - drogue.e;...
      cable.d(NN) - drogue.d;...
      ];
  drogue.psi = atan2(ell(2),ell(1));
  
  
    
  if initialize==0, 
      % initialize the plot
      initialize = 1;

      %%%%%%%%%%%%%%%%%%
      % create figure
      figure(1), clf, hold on
      axis([P.x_min, P.x_max, P.y_min, P.y_max, P.z_min, P.z_max]);

      % plot mothership, cable, drogue
      fig_mothership = drawUav(mothership, P.mothership.size, P, [], 'normal');
      fig_drogue     = drawUav(drogue, P.drogue.size, P, [], 'normal');
      fig_mav        = drawUav(mav, P.mav.size, P, [], 'normal');
      
      % Plot cable with multiple links

      for i = 1:P.cable.N
          fig_cable(i) = drawCable(X(i,1:2),Y(i,1:2),Z(i,1:2), P, [], 'normal');
      end
      
      for i = 1:(P.cable.N-1)
          fig_joint(i) = drogueJoint([cable.e(i); cable.n(i); -cable.d(i)], P.joint_size, [], '.red', 'normal');
      end

      grid on
      
      title('Aerial Recovery Demo')
      xlabel('East,m');
      ylabel('North,m');
      zlabel('Altitude,m');
      %view(-154,50)
      view(24,50)

  else  % do this at every time step

      % plot mothership, cable, drogue
      drawUav(mothership, P.mothership.size, P, fig_mothership);
      drawUav(drogue, P.drogue.size, P, fig_drogue);      
      drawUav(mav, P.mav.size, P, fig_mav);
      
%       plot3(mothership.e, mothership.n, -mothership.d);hold on;
%       plot3(drogue.e, drogue.n, -drogue.d);
%       plot3(mav.e, mav.n, -drogue.d);hold on;      
      
      for i = 1:P.cable.N
          drawCable(X(i,1:2),Y(i,1:2),Z(i,1:2), P, fig_cable(i));
      end
      
      for i = 1:(P.cable.N-1)
          drogueJoint([cable.e(i); cable.n(i); -cable.d(i)], P.joint_size, fig_joint(i));
      end
      drawnow
%      drawBreadcrumb(mothership.n,mothership.e,mothership.d,'r');
%      drawBreadcrumb(drogue.n,drogue.e,drogue.d,'g');
      
      % plot the trails of the system
      plot3(mothership.e, mothership.n, -mothership.d);hold on;
      plot3(drogue.e, drogue.n, -drogue.d);hold on;
      plot3(mav.e, mav.n, -mav.d);hold on; 

  end
  xup(1) = initialize;
  xup(2) = fig_mothership;
  xup(3) = fig_drogue;
  xup(4) = fig_mav;
%   xup = [initialize; fig_mothership; fig_drogue; fig_mav];


%end mdlUpdate

%=======================================================================
% mdlOutput
%==============================2=========================================
%
function sys = mdlOutput(t,x,u,P)

  sys = [];
  
%----------------------------------------------------------------------
%----------------------------------------------------------------------
% User defined functions
%----------------------------------------------------------------------
%----------------------------------------------------------------------

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function handle =drawCable(X, Y, Z, P, handle, mode);
  % cablePlot:  plot cable between mothership and drogue
  
  if isempty(handle)
      handle = plot3(Y,X,-Z,...
          'color','b',...
          'EraseMode', mode);
  else
      set(handle,'XData',Y,'YData',X,'ZData',-Z);
%       drawnow
  end

  
function handle = drogueJoint(z, size, handle, color, mode)

  if isempty(handle),
    handle = plot3(z(1), z(2), z(3), color, 'EraseMode', mode);
  else
    set(handle,'XData',z(1),'YData',z(2),'ZData',z(3));
%     drawnow
  end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function handle=drawUav(uav, size, P, handle, mode);
  % uavPlot:  plot UAV attitude at Euler angles phi, theta, psi

  [Vert_uav,Face_uav,colors_uav] = uavVertFace(P);
  % rescale vertices
  Vert_uav = size*Vert_uav;
  % rotate vertices by phi, theta, psi
  Vert_uav = rotateVert(Vert_uav, pi-uav.phi, -uav.theta, uav.psi);
  % transform vertices from NED to XYZ
  R = [...
      0, 1, 0;...
      1, 0, 0;...
      0, 0, 1;...
      ];
  Vert_uav = Vert_uav*R;
  % translate vertices in XYZ
  Vert_uav = translateVert(Vert_uav, [uav.e; uav.n; -uav.d]);

  % collect all vertices and faces
  V = [...
      Vert_uav;...
      ];
  F = [...
      Face_uav;...
      ]; 
  patchcolors = [...
      colors_uav;...
      ];


  if isempty(handle),
  handle = patch('Vertices', V, 'Faces', F,...
                 'FaceVertexCData',patchcolors,...
                 'FaceColor','flat',...
                 'EraseMode', mode);
  else
    set(handle,'Vertices',V,'Faces',F);
%     drawnow
  end

 
%%%%%%%%%%%%%%%%%%%%%%%
function [V,F,patchcolors] = uavVertFace(P);
  % uavData:  define patch faces of uav


 
  % vertices of the fuselage
  Vert_fuse = [...
        P.drawuav.l_fuse/2, P.drawuav.w_fuse/2, P.drawuav.h_fuse/2;...
        P.drawuav.l_fuse/2, P.drawuav.w_fuse/2, -P.drawuav.h_fuse/2;...
        P.drawuav.l_fuse/2, -P.drawuav.w_fuse/2, -P.drawuav.h_fuse/2;...
        P.drawuav.l_fuse/2, -P.drawuav.w_fuse/2, P.drawuav.h_fuse/2;...
        -P.drawuav.l_fuse/2, P.drawuav.w_fuse/2, -P.drawuav.h_fuse/2;...
        -P.drawuav.l_fuse/2, P.drawuav.w_fuse/2, P.drawuav.h_fuse/2;...
        -P.drawuav.l_fuse/2, -P.drawuav.w_fuse/2, -P.drawuav.h_fuse/2;...
        -P.drawuav.l_fuse/2, -P.drawuav.w_fuse/2, P.drawuav.h_fuse/2];    
  % define faces of fuselage
  Face_fuse = [...
        1, 2, 3, 4;... % front
        5, 6, 8, 7;... % back
        2, 3, 7, 5;... % top
        1, 2, 5, 6;... % right 
        3, 4, 8, 7;... % left
        1, 4, 8, 6];   % bottom

  Vert_wing_r = [...
        P.drawuav.l_fuse/2-P.drawuav.w_recess, P.drawuav.w_fuse/2, P.drawuav.w_height/2;...
        P.drawuav.l_fuse/2-P.drawuav.w_recess, P.drawuav.w_fuse/2, -P.drawuav.w_height/2;...
        -P.drawuav.l_fuse/2, P.drawuav.w_fuse/2, 0;...
        -P.drawuav.w_back, P.drawuav.w_fuse/2+P.drawuav.w_width, P.drawuav.w_height/2;...
        -P.drawuav.w_back, P.drawuav.w_fuse/2+P.drawuav.w_width, -P.drawuav.w_height/2;...
        -P.drawuav.w_back-P.drawuav.w_tipwidth, P.drawuav.w_fuse/2+P.drawuav.w_width, 0;...
    ];

  Face_wing_r = 8 + [...
        1, 2, 5, 4;... % front
        4, 5, 6, 4;... % side
        2, 3, 6, 5;... % top
        1, 3, 6, 4;... % bottom
    ];

  Vert_wing_l = [...
        P.drawuav.l_fuse/2-P.drawuav.w_recess, -P.drawuav.w_fuse/2, P.drawuav.w_height/2;...
        P.drawuav.l_fuse/2-P.drawuav.w_recess, -P.drawuav.w_fuse/2, -P.drawuav.w_height/2;...
        -P.drawuav.l_fuse/2, -P.drawuav.w_fuse/2, 0;...
        -P.drawuav.w_back, -P.drawuav.w_fuse/2-P.drawuav.w_width, P.drawuav.w_height/2;...
        -P.drawuav.w_back, -P.drawuav.w_fuse/2-P.drawuav.w_width, -P.drawuav.w_height/2;...
        -P.drawuav.w_back-P.drawuav.w_tipwidth, -P.drawuav.w_fuse/2-P.drawuav.w_width, 0;...
    ];

  Face_wing_l = 14 + [...
        1, 2, 5, 4;... % front
        4, 5, 6, 4;... % side
        2, 3, 6, 5;... % top
        1, 3, 6, 4;... % bottom
    ];

  Vert_rud_r = [...
        -P.drawuav.w_back, P.drawuav.w_fuse/2+P.drawuav.w_width, P.drawuav.w_height/2;...
        -P.drawuav.w_back-P.drawuav.w_tipwidth, P.drawuav.w_fuse/2+P.drawuav.w_width, 0;...
        -P.drawuav.w_back-P.drawuav.w_tipwidth, P.drawuav.w_fuse/2+P.drawuav.w_width, -P.drawuav.r_height;...
        -P.drawuav.w_back-P.drawuav.w_tipwidth+P.drawuav.r_top, P.drawuav.w_fuse/2+P.drawuav.w_width, -P.drawuav.r_height;...
    ];

  Face_rud_r = 20 + [...
        1, 2, 3, 4;...
    ];

  Vert_rud_l = [...
        -P.drawuav.w_back,              -P.drawuav.w_fuse/2-P.drawuav.w_width, P.drawuav.w_height/2;...
        -P.drawuav.w_back-P.drawuav.w_tipwidth, -P.drawuav.w_fuse/2-P.drawuav.w_width, 0;...
        -P.drawuav.w_back-P.drawuav.w_tipwidth, -P.drawuav.w_fuse/2-P.drawuav.w_width, -P.drawuav.r_height;...
        -P.drawuav.w_back-P.drawuav.w_tipwidth+P.drawuav.r_top, -P.drawuav.w_fuse/2-P.drawuav.w_width, -P.drawuav.r_height;...
    ];

  Face_rud_l = 24 + [...
        1, 2, 3, 4;...
    ];

V = [Vert_fuse; Vert_wing_r; Vert_wing_l; Vert_rud_r; Vert_rud_l];
F = [Face_fuse; Face_wing_r; Face_wing_l; Face_rud_r; Face_rud_l];


patchcolors = [...
    P.myblue;... % fuselage front
    P.myblue;... % back
    P.myyellow;... % top
    P.myblue;... % right
    P.myblue;... % left
    P.myblue;... % bottom
    P.myblue;... % right wing front
    P.mygreen;... % side
    P.myblue;...  % top
    P.myred;...   % bottom
    P.myblue;... % left wingfront
    P.mygreen;... % side
    P.myblue;...  % top
    P.myred;...   % bottom
    P.mygreen;...% right rudder
    P.mygreen;...% left rudder
    ];

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function cityPlot(P)

    for i=1:P.num_blocks,
      for j=1:P.num_blocks,
        C = [...
            i*P.street_width + (i-1)*P.building_width + 0.5*P.building_width;...
            j*P.street_width + (j-1)*P.building_width + 0.5*P.building_width;...
            ];
        X = [...
            C(1) - 0.5*P.building_width;...
            C(1) - 0.5*P.building_width;...
            C(1) + 0.5*P.building_width;...
            C(1) + 0.5*P.building_width;...
            ];
        Y = [...
            C(2) - 0.5*P.building_width;...
            C(2) + 0.5*P.building_width;...
            C(2) + 0.5*P.building_width;...
            C(2) - 0.5*P.building_width;...
            ];
        fill(X,Y,'g')
      end
    end
    
%%%%%%%%%%%%%%%%%%%%%%%
function Vert=rotateVert(Vert,phi,theta,psi);
% Rotation matrix from body coordinates to vehicle coordinates
 

🎉3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

 

🌈4 Matlab代码、数据、文章

资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取

                                                           在这里插入图片描述

  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值