含匹配扰动的多智能体领航跟随一致性Matlab仿真

文章目录

    • @[TOC](文章目录)
  • 前言
  • 一、问题描述
  • 二、基于LQR的观测器和控制器设计
    • 1.观测器设计
    • 2.控制器设计
  • 三、数值仿真
  • 四、参考文献
  • 总结

前言

​本文探讨了带有匹配扰动的多智能体领航跟随一致性控制方法,并提供了相应的Matlab仿真代码。

具体的设计步骤如下:

  1. 将匹配扰动看为系统的扩张状态,设计扩张状态观测器,估计扰动的大小;
  2. 基于邻居节点间的状态误差设计控制器,并更具扰动估计值,在控制器中补偿扰动;
  3. 使用使用线性二次型调节器(Linear Quadratic Regulator,LQR)对控制器增益和观测器增益进行了优化设计。

​本文所涉及到的关于图论和LQR的基础知识可参考如下博客:

  • https://zhuanlan.zhihu.com/p/373435683
  • https://zhuanlan.zhihu.com/p/139145957
  • https://blog.csdn.net/qq_24649627/article/details/104690279

一、问题描述

多智能体系统由一个领航者和 N N N个含有匹配扰动跟随者组成。跟随者动力学模型为:
x ˙ i = A x i + B ( u i + d i ) y i = C x i \begin{array}{l} {{\dot x}_i} = A{x_i} + B({u_i} + {d_i})\\ {y_i} = C{x_i} \end{array} x˙i=Axi+B(ui+di)yi=Cxi
式中, i = 1 , 2 , . . . , N i=1,2,...,N i=1,2,...,N x i x_i xi u i u_i ui d i d_i di y i y_i yi分别是跟随者的状态、控制输入、匹配扰动和系统输出。

​ 领导者动力学模型为:
x ˙ 0 = A x 0 y 0 = C x 0 \begin{array}{c} {{\dot x}_0} = A{x_0}\\ {y_0} = C{x_0} \end{array} x˙0=Ax0y0=Cx0
式中, x 0 x_0 x0 y 0 y_0 y0分别为领航者的状态和系统输出。

二、基于LQR的观测器和控制器设计

1.观测器设计

将扰动 d i d_i di看为跟随者的状态,则模型(1)可重构为:
x ˉ ˙ i = A ˉ x ˉ i + B ˉ u i + E p i y i = C ˉ x ˉ i \begin{array}{c} {{\dot{\bar x}_i} } = \bar A{{\bar x}_i} + \bar B{u_i} + E{p_i}\\ {y_i} = \bar C{{\bar x}_i} \end{array} xˉ˙i=Aˉxˉi+Bˉui+Epiyi=Cˉxˉi
式中, x ˉ i = [ x i d i ] T \bar{x}_i=\left[ x_i \quad d_i \right]^{\rm{T}} xˉi=[xidi]T p i = d ˙ i p_i=\dot{d}_i pi=d˙i A ˉ = [ A B 0 0 ] \bar{A}=\left[ \begin{matrix} A & B \\ \textbf{0} & \textbf{0} \end{matrix} \right] Aˉ=[A0B0] B ˉ = [ B 0 ] T \bar{B}=\left[ B \quad \textbf{0} \right]^{\rm{T}} Bˉ=[B0]T C ˉ = [ C 0 ] \bar{C}=\left[ C \quad \textbf{0} \right] Cˉ=[C0],其中 0 \textbf{0} 0是适度维度的零矩阵。
假设模型(3)中 ( A ˉ , C ˉ ) (\bar{A},\bar{C}) (Aˉ,Cˉ)是可观的,可设计一个龙伯格扩张状态观测器为:
x ˉ ^ ˙ i = A ˉ x ˉ ^ i + B ˉ u i + G ( y i − C ˉ x ˉ ^ i ) \dot{\hat{\bar{x}}}_i = \bar A{\hat{\bar x} }_i + \bar B{u_i} + G({y_i} - \bar C{\hat{\bar x} }_i) xˉ^˙i=Aˉxˉ^i+Bˉui+G(yiCˉxˉ^i)
式中, x ˉ ^ i = \hat{\bar{x}}_i= xˉ^i=是对 x ˉ i \bar{x}_i xˉi的估计, G G G是观测器增益矩阵。

​ 增益 G G G常采用极点配置法求取,但理想的期望极点很难确定,且该方法无法通过误差和控制输入的优化来选取增益G,因此,可以使用LQR的方法设计 G G G,具体设计方法参考文献【1】。

2.控制器设计

​ 第 i i i个跟随者节点与其邻居节点之间的状态误差定义为:
ξ i = ∑ j ∈ N i ( ( a i j ( x ^ i − x ^ j ) + b i ( x ^ i − x 0 ) ) {\xi _i} = \sum\nolimits_{j \in {N_i}} {(({a_{ij}}(\hat{{ x}}_i - {\hat{ x}_j}) + {b_i}({\hat{ x}_i} - {x_0}))} ξi=jNi((aij(x^ix^j)+bi(x^ix0))
式中, N i N_i Ni表示 i i i节点邻居节点的集合; j j j节点对 i i i节点有信息传递时, a i j = 1 a_{ij}=1 aij=1,否则 a i j = 0 a_{ij}=0 aij=0;领航者对 i i i节点有信息传递时, b i = 0 b_i=0 bi=0,否则 b i = 0 b_i=0 bi=0

​ 假设模型(2)中(A,B)是可控的,根据扩张状态观测器得到的扰动估计值,可设计带扰动补偿的控制器为:
u i = K ξ i − d ^ i {u_i} = K{\xi _i} - {\hat d_i} ui=Kξid^i
式中, K = − τ K a K=-\tau{K_a} K=τKa,其中 τ \tau τ是一个与多智能体通讯拓扑结构相关的参数, K a K_a Ka为控制器增益矩阵。

​ 为了提高控制器的性能,同样可以使用LQR方法设计控制器增益 K a K_a Ka,具体设计方法参考文献【2】。
关于控制器和观测器的稳定性,感兴趣的读者可以自行证明。

三、数值仿真

考虑一个二阶领航跟随多智能体系统有1个领航者和4个跟随者,状态 x i = [ x 1 , i x 2 , i ] T x_i=\left[ x_{1,i} \quad x_{2,i} \right]^{\rm{T}} xi=[x1,ix2,i]T,系统矩阵 A = [ 0 1 0 0 ] A=\left[ \begin{matrix} 0 & 1 \\ 0 & 0 \end{matrix} \right] A=[0010] B = [ 0 1 ] T B=\left[ 0 \quad 1 \right]^{\rm{T}} B=[01]T C ˉ = [ 1 0 ] \bar{C}=\left[ 1 \quad 0 \right] Cˉ=[10]。领航跟随多智能体系统通讯拓扑图为:
在这里插入图片描述
设置外部扰动为:
d i = α i t + β i e χ i t sin ⁡ t + γ i i = 1 , 2 ⋯ 8 {d_i} = {\alpha _i}t + {\beta _i}{e^{{\chi _i}t}}\sin t + {\gamma _i}{\rm{ }}i = 1,2 \cdots 8 di=αit+βieχitsint+γii=1,28
式中,扰动参数 α = [ 0.001 − 0.001 0.002 0.001 ] T \alpha = \left[ 0.001 \quad -0.001 \quad 0.002 \quad 0.001 \right]^{\rm{T}} α=[0.0010.0010.0020.001]T β = [ 1 1.5 2 2.5 ] T \beta= \left[ 1 \quad 1.5 \quad 2 \quad 2.5 \right]^{\rm{T}} β=[11.522.5]T χ = [ − 0.3 − 0.3 − 0.5 0.3 ] T \chi= \left[ -0.3 \quad -0.3 \quad -0.5 \quad 0.3 \right]^{\rm{T}} χ=[0.30.30.50.3]T γ = [ 1 2 − 1 5 ] T \gamma= \left[ 1 \quad 2 \quad -1 \quad 5 \right]^{\rm{T}} γ=[1215]T
设置跟随者初始状态:
x 1 ( 0 ) = [ 2 0 4 0 ] T x 2 ( 0 ) = [ − 1 0 − 1 1 ] T \begin{align*} x_{1}(0) &= \left[ 2 \quad 0 \quad 4 \quad 0 \right]^{\rm{T}} \\ x_{2}(0) &= \left[ -1 \quad 0 \quad -1 \quad 1 \right]^{\rm{T}} \end{align*} x1(0)x2(0)=[2040]T=[1011]T
设置领航初始状态与运动轨迹为:
x 1 , 0 ( 0 ) = 2 x 2 , 0 ( 0 ) = 0 x ˙ 2 , 0 ( t ) = 0.2 cos ⁡ ( 0.15 t ) \begin{align*} x_{1,0}(0) &= 2 \\ x_{2,0}(0) &= 0 \\ \dot{x}_{2,0}(t)=0.2\cos (0.15t) \end{align*} x1,0(0)x2,0(0)x˙2,0(t)=0.2cos(0.15t)=2=0
Matlab仿真代码如下所示:

clear
clc

%% 预先设置
global L F K G A B A_bar B_bar D_Mar
%系统矩阵
A = [0 1; 0 0];
B = [0; 1];
C = [1 0];
A_bar = [A B; 0 0 0];
B_bar = [B; 0];
C_bar = [C 0];

%系统通讯拓扑图
L = [2 -1  0 -1
    -1  2 -1  0
     0 -1  2 -1
    -1  0 -1  2];% 拉普拉斯矩阵

F= diag([1  0  0  0]); % 牵引矩阵

%观测器Riccati方程
Qa = diag([15 15 15]);Ra = 0.1;
%控制器Riccati方程
Qb = diag([10 10]);Rb = 0.6;

% LQR方法求解观测器增益
[G,Pa] = lqr(A_bar', C_bar', Qa, Ra); 
G = G';

% LQR方法求解控制器增益
[Ka,Pb] = lqr(A, B, Qb, Rb);
tau = 1/(2*min(eig(L+F)));
K = -tau*Ka;

%扰动参数矩阵
D_Mar = [ 0.001 -0.001 0.002 0.001
          1 1.5 2 2.5
         -0.3 -0.3 -0.5 -0.3
          1  2 -1  5];

% 多智能体初始状态设置
X1l = 2;
X2l = 0;
X1f = [2 0 4 0];
X2f = [-1 0 -1 1];
X1hat = X1f; % 跟随者位置状态的初始估计
X2hat = X2f; % 跟随者速度状态的初始估计
Dhat = D_Mar(4,:);% 扰动的初始估计

%时间设置
tBegin = 0;
tFinal = 50;
tspan = [tBegin, tFinal];

%% Calculate ODE Function
In = [X1l X2l X1f X2f X1hat X2hat Dhat]';
[t, X] = ode23(@ctFun, tspan, In);

%% Draw Graphs
% 提取仿真结果
X1l_sim = X(:, 1);
X2l_sim = X(:, 2);
X1f_sim = X(:, 3:6);
X2f_sim = X(:, 7:10);
X1hat_sim = X(:, 11:14);
X2hat_sim = X(:, 15:18);
Dhat_sim = X(:, 19:22);

% 计算真实扰动

% 绘图
% 1-1.绘制领导者与跟随者的状态X1曲线
figure;
hold on
% 定义点画线样式
line_styles = {'--', ':', '-.', '-..'};
% 循环跟随者曲线
for j = 1:4
    plot(t, X1f_sim(:, j), line_styles{j}, 'linewidth', 1.5);
end
% 绘制 X1l_sim 曲线
plot(t, X1l_sim, 'r-', 'linewidth', 1);
hold off
% 添加图例
legend('Agent1','Agent2','Agent3','Agent4','Leader', 'FontSize', 16);
xlabel('$t(s)$', 'Interpreter','latex', 'FontSize', 26);
ylabel('$x_{1,i}$','Interpreter','latex', 'FontSize', 26);
% 添加上边框和右边框
box on;
grid on;

% 1-2.绘制领导者与跟随者的状态X2曲线
figure;
hold on
% 定义点画线样式
line_styles = {'--', ':', '-.', '-..'};
% 循环跟随者曲线
for j = 1:4
    plot(t, X2f_sim(:, j), line_styles{j}, 'linewidth', 1.5);
end
% 绘制 X2l_sim 曲线
plot(t, X2l_sim, 'r-', 'linewidth', 1);
hold off
set(gca, 'FontSize', 16); % 修改全局图的坐标数字字号为 16
% 添加图例
legend('Agent1','Agent2','Agent3','Agent4','Leader', 'FontSize', 16);
xlabel('$t(s)$', 'Interpreter','latex', 'FontSize', 26);
ylabel('$x_{2,i}$','Interpreter','latex', 'FontSize', 26);
% 添加上边框和右边框
box on;
grid on;

%绘制扰动与扰动观测值
% 计算真实扰动
Disturbance_true = zeros(size(Dhat_sim));
for i = 1:length(t)
    for j = 1:4
        Disturbance_true(i,j) = D_Mar(1,j)*t(i)+ D_Mar(2,j) * exp(D_Mar(3,j)*t(i))*sin (t(i)) + D_Mar(4,j);
    end
end

% 绘制扰动估计对比
for i = 1:4
    figure;
    plot(t, Disturbance_true(:,i), 'color', 'k', 'linewidth', 1.5);
    hold on;
    plot(t, Dhat_sim(:,i), '--', 'linewidth', 1.5);
    hold off;
    % 动态生成图例文本
    legend(sprintf('$d_%d$', i), sprintf('$\\hat{d}_%d$', i), 'Interpreter', 'latex', 'Location', 'northeast', 'FontSize', 16);
    set(gca, 'FontSize', 16); % 修改全局图的坐标数字字号为 16
    xlabel('$t(s)$', 'Interpreter', 'latex', 'FontSize', 26);
    ylabel(sprintf('$d_%d(t)$', i), 'Interpreter', 'latex', 'FontSize', 26);
    grid on;
end


%% ODE Function
function dX = ctFun(t,In)
    global L F K G A B A_bar B_bar D_Mar
     % 提取状态
    X1l = In(1);
    X2l = In(2);
    X1f = In(3:6);
    X2f = In(7:10);
    X1hat = In(11:14);
    X2hat = In(15:18);
    Dhat = In(19:22);

    % 初始化Disturbance为列向量
    Disturbance = zeros(length(X1f), 1);
    % 设置外部扰动
    for j = 1:4
        Disturbance(j) = D_Mar(1,j)*t + D_Mar(2,j) * exp(D_Mar(3,j)*t)*sin(t) + D_Mar(4,j);
    end

    % 领导者动力学
    dX1l = X2l;
    dX2l = 0.2*cos(0.15*t) ;
    
    % 跟随者动力学
    X1_Bar = X1hat - X1l; X2_Bar = X2hat - X2l;
    dX1f = A(1,2)*X2f;
    u = K(1)*(L+F) * X1_Bar + K(2)*(L+F) * X2_Bar - Dhat;%加了扰动补偿
    dX2f = B(2,1)*u + B(2,1)*Disturbance;
 
    % 扩张状态观测器
    dX1hat = A_bar(1,2)*X2hat + G(1) * (X1f - X1hat);
    dX2hat = A_bar(2,3)*Dhat + B_bar(2,1)*u + G(2)*(X1f - X1hat);
    dDhat = G(3) * (X1f - X1hat);
    
    % output 
    dX = [dX1l; dX2l; dX1f; dX2f; dX1hat; dX2hat; dDhat];
end

仿真结果:

由上图片可知,四个跟随者可以跟踪上领航者的运动状态。修改Matlab中LQR权重矩阵Qb和Rb,可改变一致性跟踪效果。

上面是扰动的真实值和观测值,修改Matlab中LQR权重矩阵Qa和Ra,可改变状态估计结果。

四、参考文献

【1】费红姿, 刘冰鑫, 柳一林, 等. 基于LQR的高压共轨系统喷油量观测器设计[J]. 内燃机学报, 2023, 41(03): 247-254.

【2】高琳琳, 唐风敏, 郭蓬, 等. 自动驾驶横向运动控制的改进LQR方法研究[J]. 机械科学与技术, 2021, 40(03): 435-441.

总结

我的个人站:JosephWen (rovn.ink)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/579344.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mysql的索引与事务理解

目录 一、Mysql索引 1、索引的概念 2、索引的特点 3、索引使用场景 4、Mysql有关索引的操作 (1)查询表具有的索引 (2)增加索引 (3)删除索引 5、索引实现原理 (1)B树 &…

【java数据结构之八大排序(上)-直接插入排序,希尔排序,选择排序,堆排序,向下调整(大根堆,小根堆)等知识详解】

🌈个人主页:努力学编程’ ⛅个人推荐:基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 …

深度学习之基于YOLOv5的山羊行为识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于YOLOv5的山羊行为识别系统是一个结合了深度学习和目标检测技术的项目,旨在通过图像或视频实现对山羊…

DELL PowerEdge服务器通过iDRAC升级BIOS遇到的问题

本文对PowerEdge 12G系统,也就是iDRAC 7版本升级BIOS中遇到的几个问题做个总结,对于其他版本理论上应该也是适用的。如果还遇到其他问题,可以添加VX,VX号为 StorageExpert 进行进一步的分析探讨。 第一个问题,成功下载…

C#调用skiasharp实现绘制并拖拽图形

SkiaSharp是基于.net的跨平台二维图形库,封装的谷歌的Skia库,SkiaSharp支持在以下平台或运行时中使用,能够在图片中绘图,也提供控件在Winform、WPF等使用。本文学习skiasharp在Winform的基本用法,并参照参考文献5实现绘…

【Unity动画系统】详解Root Motion动画在Unity中的应用(一)

Root Motion动画与普通动画的区别 普通动画:动画文件里记录的是物体的绝对坐标和方向,在播放动画时,Unity会根据Animation中记录的值,直接修改游戏对象的坐标和方向,每一帧的坐标和方向都是通过插值计算得出来的&…

【Camera KMD ISP SubSystem笔记】Request 流转与Bubble机制

ISP中断类型 SOF: 一帧图像数据开始传输 EOF: 一帧图像数据传输完成 REG_UPDATE: ISP寄存器更新完成(每个reg group都有独立的这个中断) EPOCH: ISP某一行结尾(默认20)就会产生此中断 BUFFER DONE: 一帧图像数据ISP完全写到DDR了 管理Isp request的几个List st…

锂电池SOH预测 | 基于CNN的锂电池SOH预测(附matlab完整源码)

锂电池SOH预测 锂电池SOH预测完整代码锂电池SOH预测 锂电池的SOH(状态健康度)预测是一项重要的任务,它可以帮助确定电池的健康状况和剩余寿命,从而优化电池的使用和维护策略。 SOH预测可以通过多种方法实现,其中一些常用的方法包括: 容量衰减法:通过监测电池的容量衰减…

AMBA-CHI协议详解(二)

《AMBA 5 CHI Architecture Specification》 文章目录 2.1 Channels综述2.2 Channel域段2.2.1 request fields2.2.2 Response fields2.2.3 Snoop request fields2.2.4 Data fields 2.3 事务结构2.3.1 Read transactions2.3.1.1 Allocating Read2.3.1.2 Non-allocating Read 2.…

字符串类型漏洞之updatexml函数盲注

UPDATEXML 是 MySQL 数据库中的一个函数,它用于对 XML 文档数据进行修改和查询。然而,当它被不当地使用或与恶意输入结合时,它可能成为 SQL 注入攻击的一部分,从而暴露敏感信息或导致其他安全漏洞。 在 SQL 注入攻击中&#xff0…

通过Cmake官网下载.gz文件安装最新版本的CMAKE、适用于debian

1.前往官网下载最新版本debian https://cmake.org/download/ 2.选他 3. 通过XFTP传输到服务器 4. 解压文件 #cd 进入对应目录,然后执行下面命令解压 $ tar -zxvf cmake-3.29.2.tar.gz5.执行这个文件 $ ./bootstrap6.完成之后再执行这个 $ make7.然后&#xff…

C语言--贪吃蛇小游戏

目录 一、Win32API介绍 1.1Win32API 1.2控制台程序 1.3控制台屏幕上的坐标COORD 1.4GetStdHandle 1.5GetConsoleCursorInfo 1.6 CONSOLE_CURSOR_INFO 1.7 SetConsoleCursorInfo 1.8SetConsoleCursorPosition 1.9GetAsyncKeyState 二、贪吃蛇游戏设计与分析 2.1地图 …

双重注意力模块 DoubleAttention | A2-Nets: Double Attention Networks

论文名称:《 A 2 A^2 A2-Nets: Double Attention Networks》 论文地址:https://arxiv.org/pdf/1810.11579.pdf 学习捕捉远距离关系对于图像/视频识别是基础性的。现有的CNN模型通常依靠增加深度来建模这些关系,这在很大程度上效率低下。在这…

数字旅游打造个性化旅行体验,科技让旅行更精彩:借助数字技术,旅行者可以定制专属旅行计划,享受个性化的旅行体验

目录 一、引言 二、数字旅游的兴起与发展 三、数字技术助力个性化旅行体验 1、智能推荐系统:精准匹配旅行者需求 2、定制化旅行计划:满足个性化需求 3、实时互动与分享:增强旅行体验 四、科技提升旅行便捷性与安全性 1、移动支付与电…

boot https ssl 使用http协议访问报错

在springboot中配置ssl以后, 再次使用http访问对应的接口就会报错 可以考虑如下设置,将http访问的端口重定向到https对应的端口 import org.apache.catalina.Context; import org.apache.catalina.connector.Connector; import org.apache.tomcat.util…

图像处理ASIC设计方法 笔记18 轮廓跟踪算法的硬件加速方案

目录 1排除伪孤立点(断裂链表)方法1 限制链表的长度方法2 增加判断条件排除断裂链表方法3 排除不必要跟踪的轮廓(推荐用这个方法) P129 轮廓跟踪算法的硬件加速方案 1排除伪孤立点(断裂链表) 如果图像中某…

探索开源的容器引擎--------------Docker容器操作

目录 一、Docker 容器操作 1.1容器创建 1.2查看容器的运行状态 1.3启动容器 1.4创建并启动容器 1.4.1当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是: 1.4.2在后台持续运行 docker run 创建的容器 1.4.3创建容器并持续运行容器…

Pytorch基础:torch.load_state_dict()方法在加载时不会检查类型

相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 笔者在使用torch.nn.module的load_state_dict中出现了一个问题,一个被注册的张量在加载后居然没有变化,一开始以为是加载出现了问题&#…

Kafka 3.x.x 入门到精通(07)——Java应用场景——SpringBoot集成

Kafka 3.x.x 入门到精通(07)——Java应用场景——SpringBoot集成 4. Java应用场景——SpringBoot集成4.1 创建SpringBoot项目4.1.1 创建SpringBoot项目4.1.2 修改pom.xml文件4.1.3 在resources中增加application.yml文件 4.2 编写功能代码4.2.1 创建配置…

debian配置BIND DNS服务器

前言 局域网内有很多台主机,IP难以记忆。 而修改hosts文件又难以做到配置共享和统一,需要一台内网的DNS服务器。 效果展示 这里添加了一个域名hello.dog,将其指向为192.168.1.100。 同时,外网的域名不会受到影响,…