
一种基于虚拟执行器和传感器的方法用于多智能体系统的事件触发容错控制研究(Matlab代码实现)
随着对系统安全性和可靠性的日益重视,控制系统对容错能力的需求不断增加。多智能体系统(MASs)中的容错协同控制(FTCC)是其中一个安全问题。本文研究了在执行器和传感器故障存在的情况下,多智能体系统的领导者-跟随者共识控制问题。通过采用虚拟执行器和虚拟传感器的方法,本文在动态事件触发机制(DETM)下提出了一个统一的主动FTCC框架。所提出的DETM旨在减少智能体之间的通信成本。FTCC问题通过线
💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
⛳️赠与读者
👨💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能解答你胸中升起的一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。
或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎
💥1 概述
摘要:随着对系统安全性和可靠性的日益重视,控制系统对容错能力的需求不断增加。多智能体系统(MASs)中的容错协同控制(FTCC)是其中一个安全问题。本文研究了在执行器和传感器故障存在的情况下,多智能体系统的领导者-跟随者共识控制问题。通过采用虚拟执行器和虚拟传感器的方法,本文在动态事件触发机制(DETM)下提出了一个统一的主动FTCC框架。所提出的DETM旨在减少智能体之间的通信成本。FTCC问题通过线性矩阵不等式(LMIs)进行表述,并可以在分布式架构中实现。无需重新调整预设计的基于观测器的控制器,FTCC在故障补偿和系统重构方面表现出显著的效率。数值仿真验证了所提方法的有效性。
关键词:多智能体系统,容错控制,事件触发控制,虚拟执行器,虚拟传感器,线性矩阵不等式方法,网络化系统。
1. 引言
技术的进步促使对多智能体系统(MASs)的研究和应用不断增加,其目标是通过多个自主系统的协作来完成特定任务。其中一个引人注目的课题是领导者-跟随者(L-F)共识问题,旨在确保跟随者智能体能够跟随领导者并达成共识。这一课题已被广泛研究,并可轻松扩展到编队控制和其他进一步的应用中。关于多智能体系统共识问题的最新进展,可参考(Amirkhani和Barshooi(2021))。
随着对系统安全性和可靠性需求的不断增加,容错协同控制(FTCC)在多智能体系统中变得愈发重要。在一个智能体的故障可能通过网络通信传播到其他智能体的背景下,FTCC的重要性愈发凸显。本文重点关注多智能体系统的执行器故障和传感器故障。值得注意的是,当前大多数研究主要关注执行器故障,例如在(Wang等(2021);Li等(2023))中。在(Chadli等(2017);Yadegar和Meskin(2021))中,研究了更一般的非线性多智能体系统的FTCC问题。在(Ju等(2022))中,研究了基于事件触发和观测器的离散FTCC。由于需要一个统一框架来同时处理执行器故障和传感器故障,复合故障的FTCC问题更具挑战性(Gao等(2022))。值得注意的是,关于这一主题的研究仍在进行中,例如(Chen等(2019);Yan等(2019);Wu等(2023))。最近,在(Yang等(2023))中,考虑了加性复合故障,并基于H∞/H⁻故障检测采用DETM。关于FTCC的更全面综述,可参考(Yang等(2020))。
利用虚拟执行器(VA)和虚拟传感器(VS)进行控制重构是FTCC的一种方法(Blanke等(2006))。VA和VS可以在无需重新调整名义控制器的情况下补偿故障信号。这种方法被认为是伪逆技术的推广形式,后者在处理完全失效时表现出显著的局限性。在单智能体系统中的广泛应用表明了VA/VS方法的能力,该方法也被扩展到更一般的线性参数变化(LPV)系统中,如(Tabatabaeipour等(2012);Rotondo等(2014))所示。关于多智能体系统,(Yadegar和Meskin(2021))在LPV系统的FTCC中采用了VA。(Trejo等(2022))探索了基于VA和静态事件触发策略的FTCC,但最终结果并非分布式。值得注意的是,目前关于同时利用VA和VS处理复合故障以及结合基于观测器的事件触发框架的研究相对较少。
如(Yang等(2020))所述,降低通信成本是FTCC的一个重要问题,尤其是在大规模网络化系统中。事件触发机制(ETMs)是解决这一问题的有前景的方法。关于多智能体系统的ETMs已有大量研究,包括用于解决通信延迟的ETMs(Antonio等(2021))、用于数据包丢失场景的ETMs(Viel等(2022))以及具有可调事件间隔时间的动态事件触发机制(DETM)(Wang和Chadli(2023b,a))。值得注意的是,DETM引入了辅助动态变量,从而可以延长事件间隔时间(IET)并减少通信次数。关于多智能体系统的ETMs的更全面综述,可参考(Nowzari等(2019))。
基于上述研究,本文旨在采用VA和VS方法,在基于观测器的DETM下实现多智能体系统的FTCC。本文的主要贡献如下:1)开发了一个统一的动态事件触发FTCC框架,通过VA/VS方法纳入乘性复合故障,并采用DETM减少通信资源的使用;2)所提出的方法不仅可以处理轻微故障,还可以处理严重故障,包括完全失效;3)通过线性矩阵不等式(LMIs)开发了所提方法的综合设计。此外,所提出的控制器、观测器和FTCC方法均为分布式,便于实际应用。
本文的其余部分安排如下:第2节提供符号和基本图论知识;第3节介绍问题表述和名义控制器/观测器设计;第4节详细介绍分布式FTCC策略和DETM;第5节展示数值算例;第6节总结并得出结论。
图2中展示了共识误差的轨迹。请注意,在存在故障的情况下,共识仍然成功实现。当新故障出现时,干扰尤为明显,例如智能体2在t = 5秒时和智能体4在t = 10秒时。重构模块有效地进行了干预,并有助于系统的稳定。值得注意的是,故障的传播得到了有效抑制,如在t = 35秒时,智能体1和智能体5的故障仅对其他智能体造成了轻微的干扰。图3展示了虚拟传感器(VS)误差和虚拟执行器(VA)的内部状态,这与故障场景相对应。请注意,由于智能体3未发生任何故障,其虚拟执行器和虚拟传感器保持未激活状态。
图4描绘了每个智能体的事件间隔时间(IET)。当故障开始发生时,IET达到最小值,这一点尤为明显。尽管动态事件触发机制(DETM)在减少通信次数方面表现出高效性,但故障事件,尤其是故障的发生,仍然需要更多的关注,因此在这些关键时刻,IET会更短。
6. 结论
本文研究了多智能体系统(MASs)的容错协同控制(FTCC)领导者-跟随者共识问题,并提出了一个统一框架,用于处理乘性执行器和传感器故障。通过采用虚拟执行器和虚拟传感器方法,重构后的系统可以在无需重新调整设计的基于观测器的控制器的情况下,容忍执行器和传感器的部分或完全失效。所提出的DETM成功解决了通信成本问题,而分布式策略则使得实际应用更加可行。结果表明,在存在故障的情况下,系统能够渐近地实现共识,且重构模块可以高效地补偿故障的影响。本文还通过一个与多智能体系统相关的数值算例,展示了所提方法的能力。
未来的工作将致力于设计故障诊断策略,并研究系统在外部干扰下的鲁棒性。
详细文章见第4部分。
📚2 运行结果
部分代码:
%% better plot
[all_themes, all_colors] = GetColors();
% 检查,线宽,颜色,字体
%% Consensus error
figure()
margin_up = 0.02; % 总图上边缘
margin_down = 0.12; % 总图下边缘
margin_left = 0.1; % 总图左边缘
margin_right = 0.03; % 总图右边缘
gap = 0.03; % 子图间隔
ywidth = (1-margin_up-margin_down-gap*(N-1))/N;
for i = 1:N
subplot(N,1,i)
plot(t_history, deltaf_history(i*n-n+1:i*n,:), 'LineWidth',1)
set(gca,'xlim',[tstart tfinal]);
set(gca, 'colororder', all_themes{1}(2:end,:));
if i ~= N
set(gca,'xticklabel',[]);
end
margin_sub_down = 1-margin_up-i*ywidth-(i-1)*gap;
set(gca,'position',[margin_left margin_sub_down 1-margin_right-margin_left ywidth])
set(gca, 'Fontname', 'Times New Roman', 'Fontsize',11)
ylabel('$\delta^f_{'+string(i)+'}$','interpreter','latex')
grid on
end
xlabel("Time (s)")
%% Observer error
figure()
margin_up = 0.02; % 总图上边缘
margin_down = 0.12; % 总图下边缘
margin_left = 0.1; % 总图左边缘
margin_right = 0.03; % 总图右边缘
gap = 0.03; % 子图间隔
ywidth = (1-margin_up-margin_down-gap*(N-1))/N;
for i = 1:N
subplot(N,1,i)
plot(t_history, e_history(i*n-n+1:i*n,:))
set(gca,'xlim',[tstart tfinal]);
if i ~= N
set(gca,'xticklabel',[]);
end
margin_sub_down = 1-margin_up-i*ywidth-(i-1)*gap;
set(gca,'position',[margin_left margin_sub_down 1-margin_right-margin_left ywidth])
set(gca, 'Fontname', 'Times New Roman', 'Fontsize',11)
ylabel('$e_{'+string(i)+'}$','interpreter','latex')
grid on
end
xlabel("Time (s)")
%% Virtual actuator error
figure()
margin_up = 0.02; % 总图上边缘
margin_down = 0.12; % 总图下边缘
margin_left = 0.1; % 总图左边缘
margin_right = 0.03; % 总图右边缘
gap = 0.03; % 子图间隔
ywidth = (1-margin_up-margin_down-gap*(N-1))/N;
for i = 1:N
subplot(N,1,i)
plot(t_history, xdelta_history(i*n-n+1:i*n,:),'LineWidth',1)
set(gca,'xlim',[tstart tfinal]);
set(gca, 'colororder', all_themes{1}(2:end,:));
if i ~= N
set(gca,'xticklabel',[]);
end
if i == 3
set(gca,'ylim',[-1 1]);
end
margin_sub_down = 1-margin_up-i*ywidth-(i-1)*gap;
set(gca,'position',[margin_left margin_sub_down 1-margin_right-margin_left ywidth])
set(gca, 'Fontname', 'Times New Roman', 'Fontsize',11)
ylabel('$x^{\Delta}_{'+string(i)+'}$','interpreter','latex')
grid on
end
xlabel("Time (s)")
%% Virtual Sensor error
figure()
margin_up = 0.02; % 总图上边缘
margin_down = 0.12; % 总图下边缘
margin_left = 0.1; % 总图左边缘
margin_right = 0.03; % 总图右边缘
gap = 0.03; % 子图间隔
ywidth = (1-margin_up-margin_down-gap*(N-1))/N;
for i = 1:N
subplot(N,1,i)
plot(t_history, s_history(i*n-n+1:i*n,:),'LineWidth',1)
set(gca, 'colororder', all_themes{1}(2:end,:));
set(gca,'xlim',[tstart tfinal]);
if i ~= N
set(gca,'xticklabel',[]);
end
margin_sub_down = 1-margin_up-i*ywidth-(i-1)*gap;
set(gca,'position',[margin_left margin_sub_down 1-margin_right-margin_left ywidth])
set(gca, 'Fontname', 'Times New Roman', 'Fontsize',11)
ylabel('$s_{'+string(i)+'}$','interpreter','latex')
grid on
end
xlabel("Time (s)")
%% VA VS together
figure()
tiledlayout(5, 2, 'TileSpacing', 'tight','Padding','tight');
for i = 1 : N
nexttile;
% VA
plot(t_history, xdelta_history(i*n-n+1:i*n,:),'LineWidth',0.57)
ylabel('$x^{\Delta}_{'+string(i)+'}$','interpreter','latex')
grid on
if i ~= N
set(gca,'xticklabel',[]);
end
set(gca, 'Fontname', 'Times New Roman', 'Fontsize',11)
set(gca,'xlim',[tstart tfinal]);
set(gca, 'colororder', all_themes{1}(2:end,:));
if i == 3
set(gca,'ylim',[-1 1]);
end
if i == N
xlabel("Time (s)")
end
nexttile;
% VS
plot(t_history, s_history(i*n-n+1:i*n,:),'LineWidth',0.7)
ylabel('$s_{'+string(i)+'}$','interpreter','latex')
grid on
if i ~= N
set(gca,'xticklabel',[]);
end
set(gca, 'Fontname', 'Times New Roman', 'Fontsize',11)
set(gca,'xlim',[tstart tfinal]);
set(gca, 'colororder', all_themes{2}(2:end,:));
if i == N
xlabel("Time (s)")
end
end
%% Event error
figure()
margin_up = 0.02; % 总图上边缘
margin_down = 0.12; % 总图下边缘
margin_left = 0.1; % 总图左边缘
margin_right = 0.03; % 总图右边缘
gap = 0.03; % 子图间隔
ywidth = (1-margin_up-margin_down-gap*(N-1))/N;
for i = 1:N
subplot(N,1,i)
plot(t_history, eps_history(i*n-n+1:i*n,:))
set(gca,'xlim',[tstart tfinal]);
if i ~= N
set(gca,'xticklabel',[]);
end
margin_sub_down = 1-margin_up-i*ywidth-(i-1)*gap;
set(gca,'position',[margin_left margin_sub_down 1-margin_right-margin_left ywidth])
set(gca, 'Fontname', 'Times New Roman', 'Fontsize',11)
ylabel('$\varepsilon_{'+string(i)+'}$','interpreter','latex')
grid on
end
xlabel("Time (s)")
%% Event error with norm
figure()
margin_up = 0.02; % 总图上边缘
margin_down = 0.12; % 总图下边缘
margin_left = 0.1; % 总图左边缘
margin_right = 0.03; % 总图右边缘
gap = 0.03; % 子图间隔
ywidth = (1-margin_up-margin_down-gap*(N-1))/N;
for i = 1:N
subplot(N,1,i)
plot(t_history, vecnorm(eps_history(i*n-n+1:i*n,:)),'Color','k','LineWidth',0.7)
set(gca,'xlim',[tstart tfinal]);
if i ~= N
set(gca,'xticklabel',[]);
end
margin_sub_down = 1-margin_up-i*ywidth-(i-1)*gap;
set(gca,'position',[margin_left margin_sub_down 1-margin_right-margin_left ywidth])
set(gca, 'Fontname', 'Times New Roman', 'Fontsize',11)
ylabel('$\| \varepsilon_{'+string(i)+'} \|$','interpreter','latex')
grid on
end
xlabel("Time (s)")
%% ausxiliary variable
figure()
margin_up = 0.02; % 总图上边缘
margin_down = 0.12; % 总图下边缘
margin_left = 0.1; % 总图左边缘
margin_right = 0.03; % 总图右边缘
gap = 0.03; % 子图间隔
ywidth = (1-margin_up-margin_down-gap*(N-1))/N;
for i = 1:N
subplot(N,1,i)
plot(t_history, eta_history(i,:))
set(gca,'xlim',[tstart tfinal]);
if i ~= N
set(gca,'xticklabel',[]);
end
margin_sub_down = 1-margin_up-i*ywidth-(i-1)*gap;
set(gca,'position',[margin_left margin_sub_down 1-margin_right-margin_left ywidth])
set(gca, 'Fontname', 'Times New Roman', 'Fontsize',11)
ylabel('$\eta_{'+string(i)+'}$','interpreter','latex')
grid on
end
xlabel("Time (s)")
%% IET
figure()
margin_up = 0.02; % 总图上边缘
margin_down = 0.12; % 总图下边缘
margin_left = 0.1; % 总图左边缘
margin_right = 0.03; % 总图右边缘
gap = 0.03; % 子图间隔
ywidth = (1-margin_up-margin_down-gap*(N-1))/N;
for i = 1:N
subplot(N,1,i)
instant_trigger_i = instant_trigger_history{i};
iet_i = instant_trigger_i(2:end) - instant_trigger_i(1:end-1);
plot(instant_trigger_i(2:end), iet_i,'LineWidth',1)
set(gca,'xlim',[tstart tfinal]);
if i ~= N
set(gca,'xticklabel',[]);
end
margin_sub_down = 1-margin_up-i*ywidth-(i-1)*gap;
set(gca,'position',[margin_left margin_sub_down 1-margin_right-margin_left ywidth])
set(gca, 'Fontname', 'Times New Roman', 'Fontsize',11)
ylabel('IET$_{'+string(i)+'}$','interpreter','latex')
grid on
end
xlabel("Time (s)")
%% IET one figure
figure()
tiledlayout(1, 1, 'TileSpacing', 'tight','Padding','tight');
nexttile;
for i = 1:N
instant_trigger_i = instant_trigger_history{i};
iet_i = instant_trigger_i(2:end) - instant_trigger_i(1:end-1);
plot(instant_trigger_i(2:end), iet_i,'LineWidth',1)
hold on
end
set(gca, 'colororder', all_themes{1}(1:end,:));
set(gca, 'Fontname', 'Times New Roman', 'Fontsize',11)
ylabel('IET','interpreter','latex')
grid on
set(gca,'xlim',[tstart tfinal]);
xlabel("Time (s)")
legend('agent 1', 'agent 2', 'agent 3', 'agent 4', 'agent 5')
%%
🎉3 参考文献
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。(文章内容仅供参考,具体效果以运行结果为准)
🌈4 Matlab代码、文章下载
资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取
更多推荐
所有评论(0)