问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

7个磁悬浮系统组成的网络物理系统分布式控制协议设计与仿真

创作时间:
作者:
@小白创作中心

7个磁悬浮系统组成的网络物理系统分布式控制协议设计与仿真

引用
CSDN
1.
https://blog.csdn.net/m0_73907476/article/details/145791155

本文介绍了一个由7个磁悬浮系统(Maglev)组成的网络物理系统的分布式控制协议设计。通过对比不同网络通信结构(星型、分支、队列)的性能,为实际应用提供了参考。文章详细描述了系统设计、仿真验证和结果分析,并提供了具体的Matlab代码和Simulink模型。

1. 系统概述

在本文中,我们研究了一个由7个磁悬浮系统(Maglev)组成的网络物理系统(Cyber-Physical System)。我们设计了一个分布式控制协议,其中多智能体系统执行协同跟踪任务。考虑到不同的网络通信结构,我们比较了这些不同选择对受控系统的影响。随后,我们选择了一个特定的网络结构,以便突出显示在领导者稳态代理参考行为发生变化的不同场景之间的收敛时间点。此外,我们还分析了在输出测量中引入噪声的影响,以及用于设计控制器和观测器的不同变量的影响。

2. 通信网络

在实验中,我们尝试了不同的网络结构,从最简单的星型连接结构(每个跟随节点都与领导者相连)到更复杂的结构。我们将深入讨论每种情况。

2.1 星型配置

这是最简单的配置。在这种情况下,所有智能体的收敛时间是相同的,因为它们同时接收到相同的信息,因此不需要等待其他智能体。正如预期的那样,这是性能最好的网络结构,但由于其简单性以及每个跟随者的动态特性相同,使得第一个跟随者与其他跟随者无法区分,因此我们决定不在接下来的实验部分中选择它。

2.2 分支配置

在分支版本中,我们创建了两个跟随节点的分支,每个分支的头部都连接到领导者节点。每个分支由3个跟随者组成(分别标记为偶数分支和奇数分支),其中每个节点的行为与其在另一个分支中对应的平行节点相同(1-2,3-4,5-6)。我们尝试通过添加边(例如从6到1)来修改这种结构,并随后改变其权重;这两种变化分别可以在图(3)中看到。前者展示了添加这条边如何将奇数分支向偶数分支的最后一个智能体靠拢,而后者则进一步增加了这种偏移,体现在动态行为中。

2.3 队列配置

在队列版本中,正如其名称所示,每个跟随节点从领导者节点开始依次连接到下一个节点。我们将这种结构称为标准队列。我们测试了一些变化,例如从6到1的边,以及从6到2的边,并分别使用原始权重和修改后的权重;以下图表展示了这些不同配置的动态行为。与分支结构类似,从6到1的边使所有智能体向最后一个智能体靠拢,而从6到2的边则保持第一个智能体的行为不变。在标准队列中,收敛时间明显低于其他两种结构,这是由于耦合增益比其他两种配置要高得多。

3. 运行结果



Simulink版本:2020a,低版本可能会报错。

4. Matlab代码和Simulink仿真模型

部分代码如下:

%Initial conditions  
random = 1;  
if (random == 1)  
x0 = [((rand(1,6)*4)-1)/C(1,1);rand(1,6)/707.27]; %agent  
else  
x0 = [0,0];  
end  
x1 = [0;1/707.27]; %leader  
%Poles for steady-state reference  
pconst = [0 -1];  
psine = [-j +j];  
pramp = [0 0];  
p = psine;  
%%Parameter GRID-SEARCH  
%use cellcomb as combination of values  
% cmul = [1 2 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100];  
% Rval = [0.1 1 2 10 50 100];  
% Qval = [0.1 1 2 10 50 100];  
% val = {cmul,Rval,Qval};  
% cellcomb = cell(1,numel(val));  
% [cellcomb{:}] = ndgrid(val{:});  
% cellcomb = cellfun(@(X) reshape(X,[],1),cellcomb,'UniformOutput',false);  
% cellcomb = horzcat(cellcomb{:})  
cellcomb = 1;  
%%NETWORK STRUCTURES  
% LINE STRUCTURE  
Adj = tril(ones(6),-1) - tril(ones(6),-2);  
Deg = diag(sum(Adj,2));  
Pinning = zeros(6);  
Pinning(1,1) = 1;  
L = Deg- Adj;  
c = 1/(2*min(real(eig(L+Pinning))));  
%% Local Agent state dynamics control  
Kctrl = acker(A,B,[p]);  
A = A-B*Kctrl;  
%Information gathering  
umax = zeros(6,length(cellcomb));  
ut0 = zeros(6,length(cellcomb));  
d = zeros(2,length(cellcomb));  
umaxn = zeros(6,length(cellcomb));  
ut0n = zeros(6,length(cellcomb));  
dn = zeros(2,length(cellcomb));  
ctemp = c;  
w=warning('off','all');  
for i=1:length(cellcomb)  
%Q R and c gridsearch  
% c = ctemp*cellcomb(i,1);  
% Q = eye(2)*cellcomb(i,2);  
% R = cellcomb(i,3);  
%Choose Q and R and cfrom test  
Q = eye(2)*50;  
R = 10;  
c = ctemp*10;  
%SVFB  
%%Feedback GAIN control matrix K  
Pk = are(A,B*inv(R)*B',Q);  
K = inv(R)*B'*Pk;  
%% Observer gain Fn/Fl  
Pn = are(A',C'*inv(R)*C,Q);  
% Fn = Pneigh*C'*inv(R);  
Fn = Pn*C'*inv(R);  
%Local f  
Fl = -Fn;  
%Hurwitz check, if  
if(Hurwitz(A,c,L,Pinning,Fn,C) == 0)  
disp("\t Variables were non Hurwitz\n")  
disp("Variable c:\n")  
disp(c)  
disp("Variable R:\n")  
disp(R)  
disp("Variable Q:\n")  
disp(Q)  
continue;  
end  
simOut = sim('neighbour_generalized');  
%%LOCAL INFOGATHER  
%Get time at with input is 0 for each agent  
ut0(1,i) = simOut.get('u1').time(find( abs(simOut.get('u1').data) >= -1e-3 ,1,'last'));  
ut0(2,i) = simOut.get('u2').time(find( abs(simOut.get('u2').data) >= -1e-3 ,1,'last'));  
ut0(3,i) = simOut.get('u3').time(find( abs(simOut.get('u3').data) >= -1e-3 ,1,'last'));  
ut0(4,i) = simOut.get('u4').time(find( abs(simOut.get('u4').data) >= -1e-3 ,1,'last'));  
ut0(5,i) = simOut.get('u5').time(find( abs(simOut.get('u5').data) >= -1e-3 ,1,'last'));  
ut0(6,i) = simOut.get('u6').time(find( abs(simOut.get('u6').data) >= -1e-3 ,1,'last'));  
%Max input for each agent  
umax(1,i) = max(abs(simOut.get('u1').data));  
umax(2,i) = max(abs(simOut.get('u2').data));  
umax(3,i) = max(abs(simOut.get('u3').data));  
umax(4,i) = max(abs(simOut.get('u4').data));  
umax(5,i) = max(abs(simOut.get('u5').data));  
umax(6,i) = max(abs(simOut.get('u6').data));  
%Delta is global disagreement  
delta6x1 = simOut.get('delta6x1').data;  
delta6x2 = simOut.get('delta6x2').data;  
delta6t = simOut.get('delta6x1').time;  
%Find convergence time for each experiment  
d(1,i) = delta6t( find( abs(delta6x1) >= 1e-3 ,1,'last'));  
d(2,i) = delta6t( find( abs(delta6x2) >= 1e-3 ,1,'last'));  
%%NEIGHBOURHOOD INFOGATHER  
ut0n(1,i) = simOut.get('un1').time(find( abs(simOut.get('un1').data) >= -1e-3 ,1,'last'));  
ut0n(2,i) = simOut.get('un2').time(find( abs(simOut.get('un2').data) >= -1e-3 ,1,'last'));  
ut0n(3,i) = simOut.get('un3').time(find( abs(simOut.get('un3').data) >= -1e-3 ,1,'last'));  
ut0n(4,i) = simOut.get('un4').time(find( abs(simOut.get('un4').data) >= -1e-3 ,1,'last'));  
ut0n(5,i) = simOut.get('un5').time(find( abs(simOut.get('un5').data) >= -1e-3 ,1,'last'));  
ut0n(6,i) = simOut.get('un6').time(find( abs(simOut.get('un6').data) >= -1e-3 ,1,'last'));  
umaxn(1,i) = max(abs(simOut.get('un1').data));  
umaxn(2,i) = max(abs(simOut.get('un2').data));  
umaxn(3,i) = max(abs(simOut.get('un3').data));  
umaxn(4,i) = max(abs(simOut.get('un4').data));  
umaxn(5,i) = max(abs(simOut.get('un5').data));  
umaxn(6,i) = max(abs(simOut.get('un6').data));  

5. 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。(文章内容仅供参考,具体效果以运行结果为准)

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号