首页 > 其他分享 >编队队形保持-Leader-Follower法-matlab仿真

编队队形保持-Leader-Follower法-matlab仿真

时间:2024-10-26 23:18:16浏览次数:8  
标签:real pos Leader Follower matlab follower1 theta leader follower2

Leader-follower 方法是传统编队队形控制中最常用的方法之一。leader 跟踪一个预先给定的轨迹,follower 和 leader 轨迹保 持一定构型,并速度达到一致。

本文使用的应用编队控制情景就如上图所示,是一个小编队。编队中有一个leader,和两个follower。编写的代码是对Desai 团队发表的一篇leader-follower法开创性文献中实验的复现仿真,该团队对这种方法进行了大量的实验和研究,在这篇文章之后还发表了不少对该方法优化和拓展性的文章。

具体的仿真代码如下,代码中附带有详细注释。代码中关键部分在于对跟随者跟随线速度和角速度部分的代码,这二者的迭代计算更新公式参考自前面提到的Desai团队论文。

clc, clear,close all
% 参数设置
tfinal = 30; % 总时间
dt = 0.1; % 时间步长
time = 0:dt:tfinal; % 时间向量
d = 1; % 轴距
target_distance = 2;
target_angle1 = 3*pi / 4;
target_angle2 = -3*pi / 4;

% 领导者初始状态
leader_pos = [0, 0]; 
leader_speed = 1; % 领导者的速度
leader_theta = 0; % 领导者的角度
leader_angle_speed = pi/36;

% 跟随者初始状态
follower1_pos = [0, 5]; % 跟随者1初始位置
follower2_pos = [0, -5]; % 跟随者2初始位置
follower1_theta = 0;
follower2_theta = 0;
% follower_speed = 0.9; % 跟随者的速度

% 存储轨迹
leader_trajectory = zeros(length(time), 2);
follower1_trajectory = zeros(length(time), 2);
follower2_trajectory = zeros(length(time), 2);

figure;
hold on;


for i = 1:length(time)
%     % 队形变换设置
%     if i == 150
%         target_angle1 = pi / 6;
%         target_angle2 = -pi / 6;
%     end

    % 更新领导者位置
    leader_pos = leader_pos + leader_speed * [cos(leader_theta), sin(leader_theta)] * dt;
    leader_theta = leader_theta + leader_angle_speed * dt;
    leader_theta = wrapToPi(leader_theta);

    % 中间参数
    follower1_top = follower1_pos + [cos(follower1_theta), sin(follower1_theta)] * d;
    follower2_top = follower2_pos + [cos(follower2_theta), sin(follower2_theta)] * d;
    real_angle1 = atan2(follower1_top(2) - leader_pos(2), follower1_top(1) - leader_pos(1)) - leader_theta; % LF_angle
    real_angle2 = atan2(follower2_top(2) - leader_pos(2), follower2_top(1) - leader_pos(1)) - leader_theta;
    real_angle1 = wrapToPi(real_angle1);
    real_angle2 = wrapToPi(real_angle2);
    real_distance1 = norm(leader_pos - follower1_top); %LF_distance
    real_distance2 = norm(leader_pos - follower2_top);
    k1 = (target_distance - real_distance1 + leader_speed * cos(real_angle1))/cos(leader_theta + real_angle1 - follower1_theta);
    k2 = (target_distance - real_distance2 + leader_speed * cos(real_angle2))/cos(leader_theta + real_angle2 - follower2_theta);
    
    % 跟随者的角速度与角加速度的求取
    follower1_angle_speed = max(min((cos(leader_theta + real_angle1 - follower1_theta) * (real_distance1 * (target_angle1 - real_angle1) - leader_speed * sin(real_angle1) + real_distance1 * leader_angle_speed + k1 * sin(leader_theta + real_angle1 - follower1_theta)) / d), pi/2), -pi/2);
    follower2_angle_speed = max(min((cos(leader_theta + real_angle2 - follower2_theta) * (real_distance2 * (target_angle2 - real_angle2) - leader_speed * sin(real_angle2) + real_distance2 * leader_angle_speed + k2 * sin(leader_theta + real_angle2 - follower2_theta)) / d), pi/2), -pi/2);
    follower1_speed = max(min(k1 - d * follower1_angle_speed * tan(leader_theta + real_angle1 - follower1_theta), 2), 0);
    follower2_speed = max(min(k2 - d * follower2_angle_speed * tan(leader_theta + real_angle2 - follower2_theta), 2), 0);
    disp(follower1_angle_speed)

    
    % 更新跟随者位置,朝向领导者移动
    follower1_pos = follower1_pos + follower1_speed * [cos(follower1_theta), sin(follower1_theta)] * dt;
    follower2_pos = follower2_pos + follower2_speed * [cos(follower2_theta), sin(follower2_theta)] * dt;
    follower1_theta = follower1_theta + follower1_angle_speed * dt;
    follower2_theta = follower2_theta + follower2_angle_speed * dt;
    follower1_theta = wrapToPi(follower1_theta);
    follower2_theta = wrapToPi(follower2_theta);

    % 存储轨迹
    leader_trajectory(i, :) = leader_pos;
    follower1_trajectory(i, :) = follower1_pos;
    follower2_trajectory(i, :) = follower2_pos;

    % 绘制轨迹
    clf; % 清除当前图形
    plot(leader_trajectory(1:i, 1), leader_trajectory(1:i, 2), 'r', 'LineWidth', 2); % 领导者轨迹
    hold on;
    plot(follower1_trajectory(1:i, 1), follower1_trajectory(1:i, 2), 'b', 'LineWidth', 2); % 跟随者1轨迹
    plot(follower2_trajectory(1:i, 1), follower2_trajectory(1:i, 2), 'g', 'LineWidth', 2); % 跟随者2轨迹
    
    % 绘制当前角色位置
    plot(leader_pos(1), leader_pos(2), 'ro', 'MarkerSize', 10); % 领导者
    plot(follower1_pos(1), follower1_pos(2), 'bo', 'MarkerSize', 8); % 跟随者1
    plot(follower2_pos(1), follower2_pos(2), 'go', 'MarkerSize', 8); % 跟随者2
    
    xlim([-5, 30]);
    ylim([-6, 30]);
    title('Leader-Follower Model');
    legend('Leader','Follower 1','Follower 2');
    pause(0.1); % 添加延时
    hold off;
end


代码的仿真效果如下,可以看到跟随者可以平稳地以期望的角度与距离跟随领导者,这可以一定程度上说明该方法的有效性。

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="HaB1ceTy-1729956183197" src="https://live.csdn.net/v/embed/431295"></iframe>

屏幕录制 2024-10-26 105835

标签:real,pos,Leader,Follower,matlab,follower1,theta,leader,follower2
From: https://blog.csdn.net/weixin_57537041/article/details/143261319

相关文章

  • 基于数字图像处理人脸识别matlab程序代码
                             数字图像处理人脸识别程序代码                                            程序代码:clear;I=imread('E:\02089008.jpg');  %%插入图像地址O=rgb2ntsc(I);G=O(:,:,2......
  • 基于神经网络应用于手写数字识别-matlab
    运用matlab编程进行神经网络进行手写数字识别。实验过程:一、BP神经网络神经网络是由很多神经元组成,可以分为输入,输出,隐含层。BP神经网络的特点:信号前向传递,信号反向传播。若输出存在误差,根据误差调整权值和阈值,使网络的输出接近预期。在用BP神经网络进行预测之前要训练网......
  • 基于数字图像matlab-运动物体检测
                            目录一.课程设计任务二.课程设计原理及设计方案1三.课程设计的步骤和结果四.设计体会4五.参考文献5             一 课程设计任务    在视频监控领域,需要对监控画面进行存储。长时间......
  • (49)MATLAB实现迫零均衡器原理与代码
    文章目录前言一、迫零均衡器设计说明二、迫零均衡器MATLAB源代码1.函数说明2.代码实现3.辅助函数前言使用MATLAB实现迫零均衡器。给出完整的MATLAB设计源代码。一、迫零均衡器设计说明理想的迫零均衡器有无限多个抽头权系数,是不能实现的,本文考虑有2M+1个抽头权......
  • 基于圆柱体镜子和光线跟踪实现镜反射观测全景观图的matlab模拟仿真
    1.程序功能描述基于圆柱体镜子和光线跟踪实现镜反射观测全景观图.模拟的场景如下所示: 2.测试软件版本以及运行结果展示MATLAB2022a版本运行 3.核心程序%%step1fori=1:mmx_new(i)=i-round(mm/2);endfori=1:nny_new(i)=i-round(nn/2);......
  • 基于BP译码的LDPC误码率matlab仿真,分析码长,码率,信道对译码性能的影响,对比卷积码,t
    1.算法仿真效果       本程序系统是《m基于BP译码的LDPC误码率matlab仿真,分析不同码长,码率,信道对译码性能的影响,对比卷积码,turbo码》的的升级。 升级前原文章链接 增加了更多的不同码长,不同码率,不同信道对LDPC译码性能的影响,并增加了BCH编译码的对比。 matl......
  • 学习笔记489—MATLAB针对大于2GB变量保存的问题
    MATLAB针对大于2GB变量保存的问题新安装的MATLAB中保存2GB以上大小的数据时会出现如下警告:未保存变量xx,对于大于2GB的变量,请使用MAT-file版本7.3或更高版本。其解决方案是:进入MATLAB主页,点击“预设”选项:点击常规后,点击MAT-File,选择第一个格式即可。 参考链接:https:/......
  • 基于BP译码的LDPC误码率matlab仿真,分析码长,码率,信道对译码性能的影响,对比卷积码,t
    1.算法仿真效果本程序系统是《m基于BP译码的LDPC误码率matlab仿真,分析不同码长,码率,信道对译码性能的影响,对比卷积码,turbo码》的的升级。升级前原文章链接增加了更多的不同码长,不同码率,不同信道对LDPC译码性能的影响,并增加了BCH编译码的对比。matlab2022a仿真结果如下(完整......
  • 基于遗传算法的智能天线最佳阵列因子计算matlab仿真
    1.课题概述      基于遗传算法的智能天线最佳阵列因子计算。智能天线技术利用自适应阵列处理技术改善无线通信系统的性能,尤其是提高接收信号质量、抑制干扰和增强定位能力。在智能天线的设计中,阵列因子(也称加权向量或波束形成向量)的选择至关重要,它直接影响了阵列的方向性......
  • 基于贝叶斯优化卷积神经网络(Bayes-CNN)的多因子数据分类识别算法matlab仿真
    1.算法运行效果图预览(完整程序运行后无水印) 贝叶斯优化过程  贝叶斯优化后的CNN训练和识别结果 标准的CNN的识别结果 2.算法运行软件版本matlab2022a 3.部分核心程序(完整版代码包含详细中文注释和操作步骤视频)%使用贝叶斯优化算法确定最优的批......