华拓科技网
您的当前位置:首页【四旋翼飞行器】约束驱动的生产线植绒方法:V形作为节能策略研究(Matlab代码实现)

【四旋翼飞行器】约束驱动的生产线植绒方法:V形作为节能策略研究(Matlab代码实现)

来源:华拓科技网

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

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

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


💥1 概述

【四旋翼飞行器】约束驱动的生产线植绒方法:V形作为节能策略研究

在过去的二十年里,机器人植绒的研究受到了极大的关注。在本文中,我们提出了一种约束驱动的控制算法,该算法最大限度地减少了单个智能体的能量消耗并产生了紧急V形。由于形成是从代理之间的分散交互中出现的,我们的方法对于自发地向系统添加或删除代理是稳健的。首先,我们提出了固定翼无人机后面尾随上冲的分析模型,并推导出了尾随无人机的最佳空速,以最大限度地提高其行驶耐力。接下来,我们证明了简单地以最佳空速飞行永远不会导致紧急集群行为,我们提出了一种新的分散式“anseroid”行为,可以产生紧急V形。我们将这些行为编码在约束驱动的控制算法中,该算法可最大程度地降低每架无人机的机车功率。最后,我们证明了在我们提出的控制定律下,以近似V或梯队编队初始化的无人机将收敛,并且我们证明了这种出现是在模拟和Crazyflie四旋翼飞行器机队的物理实验中实时发生的。

一、引言

在过去的二十年里,机器人植绒技术因其广泛的应用前景而受到了极大的关注。特别是在四旋翼飞行器领域,如何通过优化编队和飞行策略来减少能量消耗,成为了研究的热点。本文提出了一种约束驱动的控制算法,旨在通过形成紧急V形编队来最大限度地减少单个智能体的能量消耗。

二、研究背景与意义

四旋翼飞行器因其灵活性和可操作性,在多个领域得到了广泛应用。然而,能量消耗问题一直是制约其性能提升的关键因素之一。通过优化飞行编队和策略,不仅可以减少能量消耗,还可以提高飞行器的续航能力和整体性能。因此,本文的研究具有重要的理论意义和实际应用价值。

三、研究方法

四、实验结果与分析

  1. 模拟实验

    • 在模拟环境中,以近似V或梯队编队初始化的无人机在提出的控制定律下逐渐收敛,形成了稳定的V形编队。
    • 通过对比实验,验证了提出的控制算法在减少能量消耗方面的有效性。
  2. 物理实验

    • 在Crazyflie四旋翼飞行器机队上进行了物理实验。实验结果表明,提出的控制算法能够引导无人机自动收敛到V形编队,并显著减少了能量消耗。

五、结论与展望

本文提出了一种基于约束驱动的控制算法,通过形成紧急V形编队来减少四旋翼飞行器的能量消耗。模拟和物理实验结果表明,该算法具有显著的效果和广泛的应用前景。未来,将进一步研究如何优化算法参数和提高算法的鲁棒性,以应对更复杂的环境和任务需求。

📚2 运行结果

 

 

 

部分代码:

clear; close all; clc;

%%% Simulation Parameters
N = 2; % number of agents

%global angle and error tolerance
global thetaG epsilon;
thetaG = 0;
epsilon = 20*pi/180;

%time step
global dt;
dt = 1/30; %002; %333; %0.125; % 0025;%0.05;%125; %0.125;
tf = 20;

L = 5; %domain size (for plots)


%aerodynamic parameters
global omega gamma b rStar CL CF kappa;

%based on the RQ-11 RAVEN 
gamma = 1.3;
rStar = 0.0544;
b = 1.4 / 2; % half span

%friction coefficients
CL = 95;
CF = 5E-3;

%ensures continuity, about 6% of span length
omega = gamma / (2*pi*rStar^2);

%tradeoff between rolling and pitching cost
kappa = 0.25;

%wake length property
global mu sigma;
sigma = 2; %1.25; %2.8; %1.25;
mu = -sigma; %2.75; % %-1.75;

%control constraints
global vmax vmin wmax;
vmax = 15; vmin = 7;
wmax = 1;
epsilon = pi/48/2; %pi/12 = 15 degrees


global cviol;
cviol = 0;


P0 = [(1:N)*0; (1:N)*(2)*b];
th0 = thetaG*ones(1,N);


% visualize ICs
cg = mean(P0,2);

figure(1); clf; hold on;
VisualizeW(P0, th0, cg, L);
colorbar;

%generate time and iterate!
t = 0:dt:tf;
% save position and angle data
P  = nan([length(t), size(P0)]);
TH = nan([length(t), length(th0)]);
U = nan([length(t), size(P0)]);

%% do the simulation!
fprintf('Begin the simulation!\n');
tic;
P(1,:,:)  = P0;
TH(1,:) = th0;

for ti = 2:length(t)
    %extract current state variables
    p  = squeeze(P(ti-1,:,:));   % next position
    th = squeeze(TH(ti-1,:)); % next angle
    %assume v is constant and w is zero
    if ti > 2
        v = squeeze(U(ti-2,1,:))';
    else
        v = zeros(1,N);
    end
    w = zeros(1,N);
  
    for i = 1:N % flip(idx)
        [v(i), w(i)] = OCP(p, th, i, v, w);
    end
    
    %update the dyanmics
    for i = 1:N
        th(i)  = th(i)  + w(i)*dt; %this is first on purpose
        p(:,i) = p(:,i) + v(i)*[cos(th(i)); sin(th(i))]*dt;
    end
    
    P(ti,:,:) = p;
    TH(ti,:) = th;
    U(ti-1,:,:) = [v; w];
    
    if mod(ti, 20) == 0
        fprintf('%g %%\n',  round(100*ti / length(t)) );
    end
    
end


fprintf('Simulation complete after %g sec\n', toc);

%% visualize!
%VIS = true;
%vii = 2;
%J = zeros(N, length(t));
%for ti = 1:length(t)-1 %last element of w is NaN apparently
%for ti = [1, 250, 500]
%    p  = squeeze(P (ti,:,:)); % position
%    th = squeeze(TH(ti,:));   % angle
%    cg = mean(p,2);
%    
%    for k = 1:N
%        [W, M] = Forces(p, th, k);
%        J(k, ti) = abs(M)*kappa - W;
%    end
%    
%    figure(1); clf; hold on;
%    if VIS
%        [W, M] = Forces(p, th, vii);
%        VisualizeW(p, th, cg, L, vii);
%        Ji = abs(M)*kappa - W;
%        text(p(1,vii), p(2,vii)+1, ...
%            ['J = ' num2str(Ji, '%0.2f'), ', v = ', num2str(U(ti,1,vii), '%0.2f')], ...
%            'FontSize', 14); 
%    else
%        VisualizeW(p, th, cg, L);
%    end
%    
%    xlabel('p_x (m)');
%    ylabel('p_y (m)');
%    axis equal square;
%    grid off; box off;
%    text(cg(1)+L - 3, cg(2)+L, ['t = ', num2str(t(ti), '%.2f'), ' s'], ...
%        'HorizontalAlignment', 'left', 'VerticalAlignment', 'bottom');%, ...
     %   'FontSize', 16);
%    set(gca, 'FontSize', 14, 'FontName', 'Times');
%        
%    colorbar;
%    set(gca, 'fontsize', 14, 'fontname', 'times');
   % saveas(gcf, ['figs/sim_', num2str(ti, '%04g'), '.png'])    
%end


fprintf('Violations: %g\n', cviol);

%%

for ti = 1:length(t)
    p  = squeeze(P (ti,:,:)); % position
    th = squeeze(TH(ti,:));   % angle
    cg = mean(p,2);
    
    for k = 1:N
        [W, M] = Forces(p, th, k);
        J(k, ti) = abs(M)*kappa - W;
    end
end

lw = 4;
figure(100); clf; hold on;
plot(t(1:end-1), J(1,1:end-1), '-.', 'linewidth', lw);
plot(t(1:end-1), J(2,1:end-1), 'linewidth', lw);
    %plot(t, max(J), 'r', 'linewidth', lw);
    %plot(t, min(J), 'r', 'linewidth', lw);
    %plot(t, mean(J), 'k', 'linewidth', lw);
legend('Front UAV', 'Rear UAV');
xlabel('Time (s)');
ylabel('Cost (J)');
grid on; box on;
set(gca, 'fontsize', 14, 'fontname', 'times');

saveas(gcf, '/results/CostPlot.png')

    
figure(101); clf; hold on;
sj = sum(J);
plot(t, sj, 'linewidth', lw);
grid on; box on;
     
xlabel('Time [s]');
ylabel('System Cost (J)');
grid on; box on;
     
trapz(t, sj)
     
c1 = trapz(t, J(1,:))
c2 = trapz(t, J(2,:))

%%
figure(102); clf; hold on;
lw = 2.5;
for i = 1:N
    Pi = squeeze(P(:,:,i));
    plot(Pi(:,1), Pi(:,2), '-k', 'linewidth', lw);
   
    xlabel('p_x');
    ylabel('p_y');
    
    grid on; box on;
    axis square equal;
end

saveas(gcf, '/results/Trajectories.png')

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

[1]Logan Beaver (2022) A Constraint-Driven Approach to Line Flocking: The V Formation as an Energy-Saving Strategy

Title

A Constraint-Driven Approach to Line Flocking: The V Formation as an Energy-Saving Strategy

Journal/Conference

IEEE Transactions on Robotics

4 Matlab代码实现

因篇幅问题不能全部显示,请点此查看更多更全内容