【无人机控制】基于RRT算法实现无人机系统在充满障碍物的环境避碰控制附matlab代码

简介: 【无人机控制】基于RRT算法实现无人机系统在充满障碍物的环境避碰控制附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法       神经网络预测       雷达通信      无线传感器        电力系统

信号处理              图像处理               路径规划       元胞自动机        无人机

⛄ 内容介绍

  经典的路径规划算法大都需要在全局已知空间中对环境进行建模,包括人工势场法,遗传算法,启发式算法,仿生学算法等.由于需要预先构建环境,因此这些方法并不适合解决在高维度空间中的路径规划问题.基于快速扩展随机树(RRT)的路径规划方式其优势在于可以避免对全局环境的构建,通过对状态空间进行随机采样,检测碰撞点,能够有效地解决在平面及三维状态空间下的复杂路径规划问题.通过与人工势场法和A*算法进行比对,确定了RRT算法在复杂环境中解决无人机路径规划问题的优势,在对相关参数进行优化后该方法是概率完备且存在最优解的,同时在固定翼智能集群飞行编队控制及协同项目中应用.

⛄ 部分代码

clearvars

close all

rand('state',1);

x_max = 500;

y_max = 500;

%obstacle = [500,150,200,200];

obstacle1 = [0,200,100,100];

obstacle2 = [200,200,200,100];

obstacle3 = [500,0,100,500];

obstacle4 = [0,500,500,100];

ob_vec=[obstacle1;obstacle2;obstacle3;obstacle4];

EPS = 10;

rho=80;

step=10; %which is EPS in old edition

   BETA=EPS/rho; %my addition

%numNodes = 3000;        

numNodes=2000;


q_start.coord = [10 10];

q_start.dir=pi/3; %My addition

q_start.cost = 0;

q_start.parent = 0;

q_goal.coord = [490 490];

q_goal.cost = 0;

q_goal.dir=0;


nodes(1) = q_start;

figure(1)

set(gcf,'unit','normalized','position',[0.4 0.4 0.5 0.5])

axis equal

axis([0 x_max 0 y_max])

%axis([100 110 100 110])


rectangle('Position',obstacle1,'FaceColor',[0 .5 .5])

hold on

rectangle('Position',obstacle2,'FaceColor',[0 .5 .5])

plot(q_goal.coord(1),q_goal.coord(2),'ro','LineWidth',2)




for i = 1:1:numNodes

   

   i

     

   % Break if goal node is already reached

%     IsReached=0;

%         %     for j = 1:1:length(nodes)

%         %         if dist(nodes(j).coord, q_goal.coord)<5

%         %             IsReached=1;

%         %             break

%         %         end

%         %     end

%     if IsReached

%         break;

%     end

   

   

   if rand(1)<0.3

%         disp('sampling: goal 1')

       q_rand=q_goal;

   else

%         disp('sampling: goal 0')

       q_rand.coord = [floor(rand(1)*x_max) floor(rand(1)*y_max)];

       q_rand.dir=(rand(1)-0.5)*2*pi;

   end


   % Pick the closest node from existing list to branch out from

   ndist = [];

   for j = 1:1:length(nodes)

       n = nodes(j);

       %new func

       tmp = distDubinThree_obs(n, q_rand, rho, ob_vec);

       ndist = [ndist tmp];

   end

   [val, idx] = min(ndist);

   q_near = nodes(idx);

   

   

   q_new.coord = steer_DubinThree(q_near, q_rand, rho, step);

   q_new.dir=steer_DubinThree2(q_near, q_rand, rho, step);


   

   %/* RG-RRT part: the q_goal is closer to q_near or q_new?

   % while(dist(q_rand.coord,q_near.coord)<dist(q_rand.coord,q_new.coord)) || ~noCollision(q_rand.coord, q_near.coord, obstacle1) || ~noCollision(q_new.coord, q_near.coord, obstacle1) || ~noCollision(q_rand.coord, q_near.coord, obstacle2) || ~noCollision(q_new.coord, q_near.coord, obstacle2)

       

   %/* not RG-RRT    

   while ~noCollision_obs(q_rand.coord, q_near.coord, ob_vec) || ~noCollision_obs(q_new.coord, q_near.coord, ob_vec)  

%         plot(q_rand.coord(1), q_rand.coord(2), 'o', 'Color',  [1 0 0.7410])

       q_rand.coord = [floor(rand(1)*x_max) floor(rand(1)*y_max)];

       q_rand.dir=(rand(1)-0.5)*2*pi;


       % Pick the closest node from existing list to branch out from

       ndist = [];

       for j = 1:1:length(nodes)

           n = nodes(j);

           %jan 28 tmp = dist_Dubin(n, q_rand, BETA, EPS);

           tmp = distDubinThree_obs(n, q_rand, rho, ob_vec);

           ndist = [ndist tmp];

       end

       [val, idx] = min(ndist);

       q_near = nodes(idx);

       

       q_new.coord = steer_DubinThree(q_near, q_rand, rho, step);

       q_new.dir=steer_DubinThree2(q_near, q_rand, rho, step);

   end

%     plot(q_rand.coord(1), q_rand.coord(2), 'x', 'Color',  [0 0.4470 0.7410])

   %*/

   

   % rewiring process

   if noCollision_obs(q_rand.coord, q_near.coord, ob_vec) && noCollision_obs(q_new.coord, q_near.coord, ob_vec)

%         line([q_near.coord(1), q_new.coord(1)], [q_near.coord(2), q_new.coord(2)], 'Color', 'k', 'LineWidth', 2);

%         drawnow

       hold on

       q_new.cost = distDubinThree(q_near, q_new, rho) + q_near.cost;

       

       % Within a radius of r, find all existing nodes

       q_nearest = [];

       r = 100;

       neighbor_count = 1;

       

       % Initialize cost to currently known value

       q_min = q_near;

       C_min = q_new.cost;

       

       for j=1:length(nodes)

           if noCollision_obs(nodes(j).coord, q_new.coord,ob_vec) && distDubinThree_obs(nodes(j),q_new, rho, ob_vec)<r

               q_nearest(neighbor_count).coord=nodes(j).coord;

               q_nearest(neighbor_count).dir=nodes(j).dir;

               q_nearest(neighbor_count).cost=nodes(j).cost;

               if nodes(j).cost+distDubinThree_obs(nodes(j),q_new, rho, ob_vec)<C_min-2

                   q_min=nodes(j);

                   C_min=nodes(j).cost+distDubinThree_obs(nodes(j),q_new, rho, ob_vec);

               end

               neighbor_count=neighbor_count+1;

           end

       end

               

       

       

       

       % Update parent to least cost-from node % near q_near best one

       for j = 1:1:length(nodes)

          if nodes(j).coord == q_min.coord

              q_new.parent = j;

          end

       end

%         q_new.parent=idx; % old q_near

       q_new.cost=C_min; % add by Zhu Wang

%         line([q_min.coord(1),q_new.coord(1)], [q_min.coord(2),q_new.coord(2)],'Color','g');

       % Append to nodes

       nodes = [nodes q_new];

       

       for j=1:length(nodes)-1

           if noCollision_obs(nodes(j).coord, q_new.coord,ob_vec) && distDubinThree_obs(q_new,nodes(j), rho, ob_vec)<r

               if nodes(j).cost>C_min+distDubinThree_obs(q_new, nodes(j),rho,ob_vec)

                   nodes(j).parent=length(nodes);

                   nodes(j).cost=C_min+distDubinThree_obs(q_new, nodes(j),rho,ob_vec);

%                     line([nodes(j).coord(1),q_new.coord(1)], [nodes(j).coord(2),q_new.coord(2)],'Color','y');

               end

           end

       end

       

       

       

   end

   if mod(i,100)==1

       text=['i=',int2str(i-1)];

       title(text)

   end

%     if (mod(i,10)==1)

%         F((i-1)/10+1)=getframe(gcf);

%     end

end


D = [];

for j = 1:1:length(nodes)

   tmpdist = distDubinThree_obs(nodes(j), q_goal, rho,ob_vec);

   D = [D tmpdist];

end


%% Search backwards from goal to start to find the optimal least cost path

path=[q_goal.coord q_goal.dir];

[val, idx] = min(D);


q_final = nodes(idx);

q_goal.parent = idx;

q_end = q_goal;


totaldist=q_final.cost+distDubinThree_obs(q_final,q_goal,rho,ob_vec);

q_goal.cost=totaldist;

nodes = [nodes q_goal];

while q_end.parent ~= 0

   start = q_end.parent;

% %     disp(start)

%     plot(q_end.coord(1), q_end.coord(2),'bv')

%     line([q_end.coord(1), nodes(start).coord(1)], [q_end.coord(2), nodes(start).coord(2)], 'Color', 'r', 'LineWidth', 2);

%     drawnow;

%     hold on;

   q_end = nodes(start);

%     F=[F getframe(gcf)];

   

   path=[q_end.coord q_end.dir; path];

end

% plot(path(:,1),path(:,2),'k--');

⛄ 运行结果

⛄ 参考文献

[1] 王永皎,郑春峰.基于RRT算法的自由飞行空间机器人避碰运动规划[J].农机化研究, 2006(3):3.DOI:10.3969/j.issn.1003-188X.2006.03.017.

[2] 刘强,阳小燕,朱克佳.基于RRT算法的桥检无人机航线规划仿真系统设计[J].计算机科学与应用, 2022(008):012.

[3] 李华忠,梁永生,但唐仁,等.基于RRT的机器人避碰运动规划算法研究[J].深圳信息职业技术学院学报, 2012, 10(3):8.DOI:10.3969/j.issn.1672-6332.2012.03.005.

[4] 马蓉.基于改进RRT算法的无人机航路规划与跟踪方法研究[J].导航定位与授时, 2020, 7(1):6.DOI:CNKI:SUN:DWSS.0.2020-01-004.

⛳️ 代码获取关注我

❤️部分理论引用网络文献,若有侵权联系博主删除
❤️ 关注我领取海量matlab电子书和数学建模资料
相关文章
|
1月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
1月前
|
算法 数据安全/隐私保护
基于GA遗传算法的悬索桥静载试验车辆最优布载matlab仿真
本程序基于遗传算法(GA)实现悬索桥静载试验车辆最优布载的MATLAB仿真(2022A版)。目标是自动化确定车辆位置,使加载效率ηq满足0.95≤ηq≤1.05且尽量接近1,同时减少车辆数量与布载时间。核心原理通过优化模型平衡最小车辆使用与ηq接近1的目标,并考虑桥梁载荷、车辆间距等约束条件。测试结果展示布载方案的有效性,适用于悬索桥承载能力评估及性能检测场景。
|
1月前
|
算法 机器人 数据安全/隐私保护
基于双向RRT算法的三维空间最优路线规划matlab仿真
本程序基于双向RRT算法实现三维空间最优路径规划,适用于机器人在复杂环境中的路径寻找问题。通过MATLAB 2022A测试运行,结果展示完整且无水印。算法从起点和终点同时构建两棵随机树,利用随机采样、最近节点查找、扩展等步骤,使两棵树相遇以形成路径,显著提高搜索效率。相比单向RRT,双向RRT在高维或障碍物密集场景中表现更优,为机器人技术提供了有效解决方案。
|
1月前
|
算法 JavaScript 数据安全/隐私保护
基于GA遗传优化的最优阈值计算认知异构网络(CHN)能量检测算法matlab仿真
本内容介绍了一种基于GA遗传优化的阈值计算方法在认知异构网络(CHN)中的应用。通过Matlab2022a实现算法,完整代码含中文注释与操作视频。能量检测算法用于感知主用户信号,其性能依赖检测阈值。传统固定阈值方法易受噪声影响,而GA算法通过模拟生物进化,在复杂环境中自动优化阈值,提高频谱感知准确性,增强CHN的通信效率与资源利用率。预览效果无水印,核心程序部分展示,适合研究频谱感知与优化算法的学者参考。
|
18天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化TCN-LSTM时间卷积神经网络时间序列预测算法matlab仿真
本内容展示了一种基于粒子群优化(PSO)与时间卷积神经网络(TCN)的时间序列预测方法。通过 MATLAB2022a 实现,完整程序运行无水印,核心代码附详细中文注释及操作视频。算法利用 PSO 优化 TCN 的超参数(如卷积核大小、层数等),提升非线性时间序列预测性能。TCN 结构包含因果卷积层与残差连接,结合 LSTM 构建混合模型,经多次迭代选择最优超参数,最终实现更准确可靠的预测效果,适用于金融、气象等领域。
|
14天前
|
算法 数据安全/隐私保护
基于Logistic-Map混沌序列的数字信息加解密算法matlab仿真,支持对文字,灰度图,彩色图,语音进行加解密
本项目实现了一种基于Logistic Map混沌序列的数字信息加解密算法,使用MATLAB2022A开发并包含GUI操作界面。支持对文字、灰度图像、彩色图像和语音信号进行加密与解密处理。核心程序通过调整Logistic Map的参数生成伪随机密钥序列,确保加密的安全性。混沌系统的不可预测性和对初值的敏感依赖性是该算法的核心优势。示例展示了彩色图像、灰度图像、语音信号及文字信息的加解密效果,运行结果清晰准确,且完整程序输出无水印。
基于Logistic-Map混沌序列的数字信息加解密算法matlab仿真,支持对文字,灰度图,彩色图,语音进行加解密
|
14天前
|
算法
基于PSO粒子群优化的多无人机路径规划matlab仿真,对比WOA优化算法
本程序基于粒子群优化(PSO)算法实现多无人机路径规划,并与鲸鱼优化算法(WOA)进行对比。使用MATLAB2022A运行,通过四个无人机的仿真,评估两种算法在能耗、复杂度、路径规划效果及收敛曲线等指标上的表现。算法原理源于1995年提出的群体智能优化,模拟鸟群觅食行为,在搜索空间中寻找最优解。环境建模采用栅格或几何法,考虑避障、速度限制等因素,将约束条件融入适应度函数。程序包含初始化粒子群、更新速度与位置、计算适应度值、迭代优化等步骤,最终输出最优路径。
|
24天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化TCN时间卷积神经网络时间序列预测算法matlab仿真
本内容介绍了一种基于PSO(粒子群优化)改进TCN(时间卷积神经网络)的时间序列预测方法。使用Matlab2022a运行,完整程序无水印,附带核心代码中文注释及操作视频。TCN通过因果卷积层与残差连接处理序列数据,PSO优化其卷积核权重等参数以降低预测误差。算法中,粒子根据个体与全局最优位置更新速度和位置,逐步逼近最佳参数组合,提升预测性能。
|
30天前
|
传感器 算法 数据安全/隐私保护
基于GA遗传优化的三维空间WSN网络最优节点部署算法matlab仿真
本程序基于遗传算法(GA)优化三维空间无线传感网络(WSN)的节点部署,通过MATLAB2022A实现仿真。算法旨在以最少的节点实现最大覆盖度,综合考虑空间覆盖、连通性、能耗管理及成本控制等关键问题。核心思想包括染色体编码节点位置、适应度函数评估性能,并采用网格填充法近似计算覆盖率。该方法可显著提升WSN在三维空间中的部署效率与经济性,为实际应用提供有力支持。
|
30天前
|
算法 数据处理 数据安全/隐私保护
基于投影滤波算法的rick合成地震波滤波matlab仿真
本课题基于MATLAB2022a实现对RICK合成地震波的滤波仿真,采用投影滤波与卷积滤波投影两种方法处理合成地震剖面。地震波滤波是地震勘探中的关键步骤,用于去噪和增强信号。RICK模型模拟实际地震数据,投影滤波算法通过分解信号与噪声子空间实现有效去噪。完整程序运行无水印,包含核心代码与理论推导,适用于地震数据处理研究及学习。

热门文章

最新文章