💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
⛳️赠与读者
👨💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。当哲学课上老师问你什么是科学,什么是电的时候,不要觉得这些问题搞笑。哲学是科学之母,哲学就是追究终极问题,寻找那些不言自明只有小孩子会问的但是你却回答不出来的问题。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。
或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎
💥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资源获取