基于分布式模型预测控制的多智能体点对点轨迹生成研究(Matlab代码实现)
本文提出一种基于分布式模型预测控制的多智能体离线轨迹生成新算法。该算法可扩展且高效的核心在于“按需避碰”策略:各智能体通过预测自身未来状态并与邻居共享,可在飞向目标的过程中及时探测并规避碰撞。算法完全分布式实现,与既往基于序贯凸规划的优化方法相比,计算时间缩短 85% 以上,仅对轨迹最优性产生微小影响。该方法已通过大量仿真验证,并在室内狭窄空间完成了多达 25 架四旋翼的实验飞行测试。
💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文内容如下:🎁🎁🎁
⛳️赠与读者
👨💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能解答你胸中升起的一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。
或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎
💥第一部分——内容介绍
基于分布式模型预测控制的多智能体点对点轨迹生成研究
摘要:本文提出一种基于分布式模型预测控制的多智能体离线轨迹生成新算法。该算法可扩展且高效的核心在于“按需避碰”策略:各智能体通过预测自身未来状态并与邻居共享,可在飞向目标的过程中及时探测并规避碰撞。算法完全分布式实现,与既往基于序贯凸规划的优化方法相比,计算时间缩短 85% 以上,仅对轨迹最优性产生微小影响。该方法已通过大量仿真验证,并在室内狭窄空间完成了多达 25 架四旋翼的实验飞行测试。
关键词:多智能体;分布式模型预测控制;点对点轨迹生成;按需避碰
一、引言
随着机器人技术和自动化领域的快速发展,多智能体系统在众多应用场景中展现出巨大的潜力,如无人机编队表演、物流配送、智能交通等。在这些应用中,如何高效、安全地生成多智能体的点对点轨迹,使各智能体能够从起始位置准确、快速地到达目标位置,同时避免相互碰撞,是一个关键且具有挑战性的问题。
传统的集中式轨迹生成方法在处理大规模多智能体系统时,面临着计算复杂度高、通信负担大、可扩展性差等局限性。分布式方法则通过将全局问题分解为多个局部子问题,由各智能体独立进行计算和决策,从而有效克服了集中式方法的不足。模型预测控制(Model Predictive Control, MPC)作为一种先进的控制策略,具有对系统模型依赖性低、能够处理多约束问题等优点,在多智能体轨迹生成中得到了广泛应用。然而,现有的基于 MPC 的分布式轨迹生成算法在计算效率和避碰性能方面仍有待进一步提高。
本文提出一种基于分布式模型预测控制的多智能体离线轨迹生成新算法,采用“按需避碰”策略,各智能体通过预测自身未来状态并与邻居共享信息,实现及时、有效的碰撞规避。该算法完全分布式实现,具有较高的计算效率和良好的可扩展性,为多智能体系统的轨迹生成提供了一种新的解决方案。
二、相关工作
2.1 多智能体轨迹生成方法
多智能体轨迹生成方法主要分为集中式和分布式两类。集中式方法将所有智能体的状态和控制变量集中在一个优化问题中进行求解,能够获得全局最优解,但计算复杂度随着智能体数量的增加呈指数级增长,难以应用于大规模系统。分布式方法则将全局问题分解为多个局部子问题,各智能体独立进行计算和决策,通过信息交互协调彼此的行为,具有计算效率高、可扩展性强等优点。常见的分布式轨迹生成方法包括基于势场法、基于优化理论和基于 MPC 的方法等。
2.2 模型预测控制在多智能体系统中的应用
MPC 是一种基于模型的控制策略,通过在每个控制周期内求解一个有限时域的优化问题,得到当前时刻的最优控制输入。在多智能体系统中,MPC 可以考虑各智能体的动态特性、约束条件以及相互之间的耦合关系,实现协同控制。分布式 MPC 将全局 MPC 问题分解为多个局部 MPC 子问题,各智能体根据局部信息和邻居信息独立求解各自的子问题,通过迭代协调达到全局一致。近年来,分布式 MPC 在多智能体轨迹生成、编队控制等方面取得了广泛的研究成果。
2.3 避碰策略
避碰是多智能体轨迹生成中的重要问题,常见的避碰策略包括基于几何避碰、基于速度障碍法和基于优化避碰等。基于几何避碰方法通过定义安全距离和避碰方向,使智能体在检测到碰撞风险时改变运动方向。基于速度障碍法将避碰问题转化为速度空间的可行解搜索问题,通过计算速度障碍区域来确定安全的运动速度。基于优化避碰方法则将避碰约束纳入优化问题中,通过求解优化问题得到满足避碰要求的轨迹。本文提出的“按需避碰”策略结合了分布式 MPC 和优化避碰的思想,具有更高的灵活性和有效性。
三、问题描述与建模
3.1 多智能体系统模型
考虑一个由 n 个智能体组成的多智能体系统,每个智能体的动态模型可以表示为:

3.2 轨迹生成问题描述

3.3 分布式模型预测控制框架
本文采用分布式 MPC 框架来解决多智能体点对点轨迹生成问题。在每个控制周期 k,各智能体 i 根据当前状态 xi(k) 和预测时域 N,求解以下有限时域优化问题:

各智能体求解上述优化问题后,得到当前时刻的最优控制输入 ui∗(k∣k),并将其应用于系统,同时将预测的未来状态信息共享给邻居智能体。在下一个控制周期 k+1,各智能体根据新的状态信息重复上述过程,实现滚动优化。
四、“按需避碰”策略
4.1 策略原理
“按需避碰”策略的核心思想是各智能体只在检测到潜在的碰撞风险时才进行避碰操作,而不是在所有时刻都考虑避碰约束。具体来说,各智能体在预测未来状态时,同时预测邻居智能体的未来状态(通过邻居共享的信息),并计算彼此之间的距离。如果预测距离小于安全距离 dsafe,则在当前优化问题中引入避碰约束;否则,忽略避碰约束,以减少计算负担。
4.2 邻居信息共享
为了实现“按需避碰”策略,各智能体需要与邻居智能体共享预测的未来状态信息。在每个控制周期 k,智能体 i 求解优化问题后,不仅得到当前时刻的最优控制输入 ui∗(k∣k),还得到预测时域内的未来状态序列 xi∗(k+l∣k),l=1,2,⋯,N。智能体 i 将这些未来状态信息发送给其邻居智能体 j∈Ni,同时接收邻居智能体 j 发送的未来状态信息 xj∗(k+l∣k),l=1,2,⋯,N。
4.3 避碰约束的动态引入
在每个控制周期 k,智能体 i 根据接收到的邻居未来状态信息,检查在预测时域内是否存在与邻居智能体 j 的碰撞风险。具体检查方法为:对于每个预测时刻 l=0,1,⋯,N−1,计算智能体 i 和 j 的预测距离 ∥xi∗(k+l∣k)−xj∗(k+l∣k)∥。如果存在某个 l 使得 ∥xi∗(k+l∣k)−xj∗(k+l∣k)∥<dsafe,则在当前优化问题中引入避碰约束 ∥xi(k+l∣k)−xj(k+l∣k)∥≥dsafe;否则,不引入该避碰约束。
五、算法实现与优化
5.1 算法流程
基于分布式 MPC 和“按需避碰”策略的多智能体点对点轨迹生成算法流程如下:
- 初始化:各智能体初始化其状态 xi(0)、预测时域 N、安全距离 dsafe 等参数。
- 信息共享:在每个控制周期 k,各智能体 i 将其预测的未来状态序列 xi∗(k+l∣k),l=1,2,⋯,N 发送给邻居智能体 j∈Ni,同时接收邻居智能体 j 发送的未来状态信息。
- 避碰约束检查:智能体 i 根据接收到的邻居未来状态信息,检查在预测时域内是否存在与邻居智能体 j 的碰撞风险,并动态引入避碰约束。
- 优化求解:智能体 i 求解包含动态避碰约束的有限时域优化问题,得到当前时刻的最优控制输入 ui∗(k∣k)。
- 应用控制输入:智能体 i 将最优控制输入 ui∗(k∣k) 应用于系统,更新其状态 xi(k+1)。
- 滚动优化:进入下一个控制周期 k+1,重复步骤 2 - 5,直到各智能体到达目标位置。
5.2 优化技巧
为了提高算法的计算效率和收敛性,本文采用以下优化技巧:
- ** warm - starting**:在每个控制周期 k,使用上一个控制周期求解得到的最优控制输入序列作为当前优化问题的初始猜测,加速优化求解过程。
- 约束松弛:在优化问题中引入松弛变量,对避碰约束进行松弛处理,避免因约束过紧导致优化问题无解。同时,通过惩罚函数对松弛变量进行惩罚,保证避碰约束的近似满足。
- 并行计算:由于各智能体的优化问题相互独立,可以采用并行计算技术同时求解多个智能体的优化问题,进一步提高计算效率。
六、仿真与实验验证
6.1 仿真验证
为了验证本文提出算法的有效性和性能,进行了大量仿真实验。仿真环境设置为一个二维平面空间,随机生成多个智能体的起始位置和目标位置。智能体的动态模型采用简化的二阶积分模型,控制输入为加速度。仿真参数设置如下:预测时域 N=10,控制周期 T=0.1s,安全距离 dsafe=0.5m。
仿真结果表明,本文提出的算法能够成功生成各智能体的点对点轨迹,且在轨迹执行过程中能够有效避免碰撞。与既往基于序贯凸规划的优化方法相比,本文算法的计算时间缩短 85% 以上,同时仅对轨迹最优性产生微小影响。
6.2 实验验证
为了进一步验证算法在实际应用中的可行性,在室内狭窄空间进行了多达 25 架四旋翼的实验飞行测试。实验环境中设置了多个障碍物,模拟复杂的多智能体飞行场景。各四旋翼通过机载传感器获取自身状态信息,并通过无线通信模块与邻居四旋翼共享信息。
实验结果表明,本文提出的算法能够使 25 架四旋翼在狭窄空间内安全、高效地完成点对点飞行任务,验证了算法在实际应用中的有效性和鲁棒性。
七、结论与展望
本文提出一种基于分布式模型预测控制的多智能体离线轨迹生成新算法,采用“按需避碰”策略,实现了高效、安全的轨迹生成。该算法完全分布式实现,具有较高的计算效率和良好的可扩展性,通过大量仿真和实验验证了其有效性和性能优势。
未来的研究工作可以从以下几个方面展开:一是进一步优化算法,提高轨迹的最优性和鲁棒性;二是考虑更复杂的多智能体动态模型和环境约束,如三维空间、动态障碍物等;三是将算法应用于实际的大规模多智能体系统,如无人机物流配送、智能交通等,验证其在实际应用中的可行性和有效性。
📚第二部分——运行结果
2.1 算例1


通过网盘分享的文件:gif
链接: https://pan.baidu.com/s/1dhmYr_P7Sf7NeVN7dmGsGA?pwd=vts7提取码: vts7
--来自百度网盘超级会员v6的分享
2.2 算例2


部分代码:
close all;clc;
sum_i = 8; %sum_i of agents
K = 15;
h = 0.2;
epsilon = 0.05;
r_min = 3;
timesteps = 200;
D = zeros(sum_i,sum_i); % judgeFlag whether soft constraints
kci = zeros(sum_i,sum_i); %each kci of every agent .0 means no detected
%----------some basic matrix ---------------
U = zeros(3*K,1); % ax0,ay0,az0,......,ax9,ay9,az9
x = zeros(6,1);
A = eye(6);
A(1:3,4:6) = h*eye(3);
B = zeros(6,3);
B(1:3,1:3) = 0.5*(h^2)*eye(3);
B(4:6,1:3) = h*eye(3);
phi = zeros(3,6);
phi(1:3,1:3) = eye(3);
lambda = getLambda(K , phi,A,B);
delta = getdelta(K);
lambda_v = getLambda_v(K);
A0 = getA0(K ,phi,A);
v1 = [1 1 2];
theta = diag(v1);
Go = zeros(sum_i,1);
%weight matrix
Q = eye(3*K);
Q(1:3*K-3,1:3*K-3) = zeros(3*K-3,3*K-3); % whether more aggressive
%Q(1:3*K-6,1:3*K-6) = zeros(3*K-6,3*K-6);
%Q(1:3*K-9,1:3*K-9) = zeros(3*K-9,3*K-9);
R = eye(3*K);
S = eye(3*K);
%------------------------------ ---------------
error_sum = zeros(6,sum_i); %record sum and error at present
% formation state
ui = zeros(3,sum_i); %initial input
X = zeros(6,sum_i); %initial state x y z vx vy vz
Pd = zeros(3,sum_i); %destination xd yd zd
% agent 1
ui(1:3,1) = zeros(1,3)'; %initial input
X(1:6,1) = [0 0 0 0 0 0]'; %initial state
Pd(1:3,1) = [100 50 0]'; %destination
%agent 2
ui(1:3,2) = zeros(1,3)';
X(1:6,2) = [0 50 0 0 0 0]';
Pd(1:3,2) = [100 0 0]';
%agent 3
ui(1:3,3) = zeros(1,3)';
X(1:6,3) = [50 0 0 0 0 0]';
Pd(1:3,3) = [50 50 0]';
%agent 4
ui(1:3,4) = zeros(1,3)';
X(1:6,4) = [100 0 0 0 0 0]';
Pd(1:3,4) = [0 50 0]';
%agent 5
ui(1:3,5) = zeros(1,3)';
X(1:6,5) = [50 50 0 0 0 0]';
Pd(1:3,5) = [50 0 0]';
%agent 6
ui(1:3,6) = zeros(1,3)';
X(1:6,6) = [100 50 0 0 0 0]';
Pd(1:3,6) = [0 0 0]';
%agent 7
ui(1:3,7) = zeros(1,3)';
X(1:6,7) = [100 25 0 0 0 0]';
Pd(1:3,7) = [0 25 0]';
%agent 8
ui(1:3,8) = zeros(1,3)';
X(1:6,8) = [0 25 0 0 0 0]';
Pd(1:3,8) = [100 25 0]';
P = zeros(3*K,sum_i);
% U constraints
Aieq = [-1*eye(3*K);eye(3*K)];
bieq = ones(6*K,1);
bieq(1:3*K) = 5*ones(3*K,1);
bieq(3*K+1:6*K) = 5*ones(3*K,1);
% 0:0.2:8
%Jei = U'*(lambda'*Q*lambda)*U - 2*(Pd'*Q*lambda-(A0*X0)'*Q*lambda)*U;
%Jui = U'*R*U;
%Jdelta = U'*(delta'*S*delta)*U-2*(Ustar*S*delta)*U;
%J = Jei+Jui+Jdelta;
for iagent = 1:sum_i %matrix store state and u
eval([ 'Xplot' num2str(iagent) '= [];' ]);
eval([ 'Uplot' num2str(iagent) '= [];' ]);
end
%
Pd_sum_step = zeros(3*K,sum_i);
%
[Pd_sum_step] = changeOnedes(Pd_sum_step,Pd(1:3,1),1,K); %leader destination
[Pd_sum_step] = changeOnedes(Pd_sum_step,Pd(1:3,2),2,K); %leader destination
[Pd_sum_step] = changeOnedes(Pd_sum_step,Pd(1:3,3),3,K); %leader destination
[Pd_sum_step] = changeOnedes(Pd_sum_step,Pd(1:3,4),4,K); %leader destination
[Pd_sum_step] = changeOnedes(Pd_sum_step,Pd(1:3,5),5,K); %leader destination
[Pd_sum_step] = changeOnedes(Pd_sum_step,Pd(1:3,6),6,K); %leader destination
[Pd_sum_step] = changeOnedes(Pd_sum_step,Pd(1:3,7),7,K); %leader destination
[Pd_sum_step] = changeOnedes(Pd_sum_step,Pd(1:3,8),8,K); %leader destination
figure(1)
% ---------------main loop-----------------
for t = 1:timesteps
for iagent = 1:sum_i %for each agent
if Go(iagent) == 1
[u] = PIDcontrol(Pd,X,iagent,error_sum,h);
else
if sum( D(iagent,:) ) ~= 0
u = agentQPhard(ui(1:3,iagent),Pd_sum_step(:,iagent),X, ...
P,kci,D,K,lambda,Q,delta,S,R,A0,epsilon,r_min,sum_i,iagent );
if size(u,1) == 0
u = agentQPCollision(ui(1:3,iagent),Pd_sum_step(:,iagent),X(1:6,iagent), ...
P,kci,D,K,lambda,Q,delta,S,R,A0,epsilon,r_min,sum_i,iagent );
end
elseif sum( D(iagent,:) ) == 0
u = agentQP(ui(1:3,iagent),X(1:6,iagent),Pd_sum_step(:,iagent) ,K,lambda,Q,delta,S,R,A0,Aieq,bieq);
end
end
u_iagent = u(1:3); % MPC:using the first optimization input
u_iagent(3) = 0;
X(1:6,iagent) = forwardState(X(1:6,iagent),u_iagent,A,B);
%scatter3(X(1,iagent),X(2,iagent),X(3,iagent),'.'); hold on;drawnow
eval( [ 'Xplot' num2str(iagent) ' = [Xplot' num2str(iagent) ';transpose(X(1:6,' num2str(iagent) '))];'])
eval( [ 'Uplot' num2str(iagent) ' = [Uplot' num2str(iagent) ';transpose(ui(1:3,' num2str(iagent) '))];'])
if size(u,1) ~=3
P(:,iagent) = A0*X(1:6,iagent) + lambda*u;
end
end %end each agent
% scatter3(X(1,1),X(2,1),X(3,1),'b.'); hold on;drawnow;
% scatter3(X(1,2),X(2,2),X(3,2),'r>'); hold on;drawnow;
% scatter3(X(1,3),X(2,3),X(3,3),'g^'); hold on;drawnow;
% scatter3(X(1,4),X(2,4),X(3,4),'ko'); hold on;drawnow;
scatter(X(1,1),X(2,1),'b.'); hold on;drawnow;
scatter(X(1,2),X(2,2),'r>'); hold on;drawnow;
scatter(X(1,3),X(2,3),'g^'); hold on;drawnow;
scatter(X(1,4),X(2,4),'b.'); hold on;drawnow;
scatter(X(1,5),X(2,5),'r>'); hold on;drawnow;
scatter(X(1,6),X(2,6),'ko'); hold on;drawnow;
scatter(X(1,7),X(2,7),'r>'); hold on;drawnow;
scatter(X(1,8),X(2,8),'b.'); hold on;drawnow;
axis([-20 120 -10 60])
[D,kci] = detectCollision(P,K,r_min,sum_i);
[Go] = detectPID(Pd,X,sum_i);
% collisionIF(X,t);
J1 = judgeArrived(Pd,X,sum_i);
if J1 == 1
break;
end
end % end for
%----------------end loop----------------
dis12 = Xplot1(:,1:3) - Xplot2(:,1:3);
dis13 = Xplot1(:,1:3) - Xplot3(:,1:3);
dis14 = Xplot1(:,1:3) - Xplot4(:,1:3);
dis23 = Xplot2(:,1:3) - Xplot3(:,1:3);
dis24 = Xplot2(:,1:3) - Xplot4(:,1:3);
dis34 = Xplot3(:,1:3) - Xplot4(:,1:3);
dissum = zeros(size(Xplot1,1) , 6);
for i=1:size(Xplot1,1)
dissum(i,1) = norm(dis12(i,:));
dissum(i,2) = norm(dis13(i,:));
dissum(i,3) = norm(dis14(i,:));
dissum(i,4) = norm(dis23(i,:));
dissum(i,5) = norm(dis24(i,:));
dissum(i,6) = norm(dis34(i,:));
end
figure(2)
for i = 1:6
plot(dissum(:,i)); hold on;
end
legend({'12' '13' '14' '23' '24' '34'});
🎉第三部分——参考文献
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。(文章内容仅供参考,具体效果以运行结果为准)
🌈第四部分——Matlab代码、文章下载
资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取

更多推荐
所有评论(0)