【三维路径规划】基于matlab RRT算法无人机路径规划【含Matlab源码 155期】
一、A_star算法简介
0 引言 随着现代技术的发展,飞行器种类不断变多,应用也日趋专一化、完善化,如专门用作植保的大疆PS-X625无人机,用作街景拍摄与监控巡察的宝鸡行翼航空科技的X8无人机,以及用作水下救援的白鲨MIX水下无人机等,决定飞行器性能主要是内部的飞控系统和外部的路径规划问题。就路径问题而言,在具体实施任务时仅靠操作员手中的遥控器控制无人飞行器执行相应的工作,可能会对操作员心理以及技术提出极高的要求,为了避免个人操作失误,进而造成飞行器损坏的危险,一种解决问题的方法就是对飞行器进行航迹规划。 飞行器的测量精度,航迹路径的合理规划,飞行器工作时的稳定性、安全性等这些变化对飞行器的综合控制系统要求越来越高。无人机航路规划是为了保证无人机完成特定的飞行任务,并且能够在完成任务的过程中躲避各种障碍、威胁区域而设计出最优航迹路线的问题。常见的航迹规划算法如图1所示。 图1 常见路径规划算法 文中主要对无人机巡航阶段的航迹规划进行研究,假设无人机在飞行中维持高度与速度不变,那么航迹规划成为一个二维平面的规划问题。在航迹规划算法中,A算法计算简单,容易实现。在改进A算法基础上,提出一种新的、易于理解的改进A算法的无人机航迹规划方法。传统A算法将规划区域栅格化,节点扩展只限于栅格线的交叉点,在栅格线的交叉点与交叉点之间往往存在一定角度的两个运动方向。将存在角度的两段路径无限放大、细化,然后分别用两段上的相应路径规划点作为切点,找到相对应的组成内切圆的圆心,然后作弧,并求出相对应的两切点之间的弧所对应的圆心角,根据下式计算出弧线的长度 式中:R———内切圆的半径; α———切点之间弧线对应的圆心角。
二、RRT算法简介
1 RRT定义 RRT(Rapidly-Exploring Random Tree)算法是一种基于采样的路径规划算法,常用于移动机器人路径规划,适合解决高维空间和复杂约束下的路径规划问题。基本思想是以产生随机点的方式通过一个步长向目标点搜索前进,有效躲避障碍物,避免路径陷入局部极小值,收敛速度快。本文通过matlab实现RRT算法,解决二维平面的路径规划问题。 2 地图 为了方便算法的实现,使用离散量来表达环境地图。其中,数值0表示无障碍物的空区域,数值1表示该区域有障碍物。 RRT算法中搜索到的顶点坐标为连续点,在地图中产生随机点,算法将通过连续的点构建树。此过程中,对树枝和顶点进行检测,检测顶点所处位置是否是空区域。下载附录中.dat文件,绘制地图。 ```c colormap=[1 1 1; 0 0 0; 1 0 0; 0 1 0; 0 0 1]; imshow(uint8(map),colormap)
``` note:数据中的列为x轴,行为y轴
3 RRT算法原理 通过matlab程序构建从起始位置到目标位置的树,并生成连接两个点的路径。使用一颗中心点在起始点的树,而不是两颗树(一个中心点在起始位置,一个中心点在目标位置)。 编写一个matlab函数,输入和输出有相同的形式。
```c function [vertices, edges, path] = rrt(map, q_start, q_goal, k, delta_q, p)
```
其中: map:.mat文件中的地图矩阵 q_start:起点的x和y坐标 q_goal:目标点的x和y坐标 k: 在目标点无法找到是,控制产生搜索树的最大迭代次数为k次 delta_q : q_new 和 q_near之间的距离 p: 将q_goal 作为q_rand 的概率,当随机产生的随机数小于p,将目标点作为随机点q_rand,当随机产生的数大于p时,产生一个随机点作为q_rand vertices:顶点的x和y坐标,生成随机树的过程中产生的所有的点的坐标都存储在这个矩阵中,第一个点为起点,最后一个点为目标点。是一个2行n列的矩阵 deges:生成随机树的所有树枝,一共有n-1个树枝,因此该矩阵有n-1行,每一行的两列分别表示两个点的索引号。一旦搜索到目标点,最后一行将表示目标点,沿着目标点回溯,即可找到路径 path: 从起始点到目标点的索引,是一个行向量 下面用一个图来表示上面提到的算法里的一些变量:
4 障碍物检测 检测树枝(即q_near和q_new之间的edge)是否处于自由空间,可以使用增量法或者等分法,示意图如下(假设两点之间有10个点,左图为为增量检测法,右图为等分法,从示意图中可以看出使用等分法检测次数更少): 在本文中,使用k=10000,delta_q=50,p=0.3, 我们将获得如下结果:
5 路径平滑处理 完成基本的RRT算法之后,我们获得了一条从起点到终点的路径,现在对这条路径进行平滑和降噪处理,处理完成之后,我们将得到一条更短的路径。 采用贪心算法: 连接q_start和q_goal,如果检测到两个点之间有障碍物,则将q_goal替换为前一个点,直到两个点能连接上(中间无障碍物)为止。一旦q_goal被连接上, 在matlab中定义平滑函数:
```c function [path_smooth] = smooth(map, path, vertices, delta)
``` 其中: path: 从起始点到目标位置的路径索引号 vertices:树中所有的顶点坐标 delta:增量距离,用来检测路径顶点之间的直接连接是否在自由空间之内,每个edge都被delta分割成几段 path_smooth:经过平滑处理之后,路径点将会减少,用path_smooth记录平滑之后的路径,仍然是一个行向量,记录路径的索引号
平滑处理之后的路径为: 6 总结 RRT算法是一种增量式的搜索算法,基于概率的思想,它是一种概率完备的路径优化算法,具有求解速度上的优势。RRT基本算法有其自身缺陷,求解得到的路径通常质量不好,带有棱角,不够光滑。因此需要对路径进行平滑处理,才能得到适合机器人路径跟踪的路径曲线。
三、部分源代码
```c clearvars close all x_max = 640; y_max = 480; z_max = 400;
EPS = 20; numNodes = 2000;
q_start.coord = [0 0 0]; q_start.cost = 0; q_start.parent = 0; q_goal.coord = [640 400 180]; q_goal.cost = 0;
nodes(1) = q_start; figure(1)
for i = 1:1:numNodes q_rand = [rand(1)x_max rand(1)y_max rand(1)*z_max]; plot3(q_rand(1), q_rand(2), q_rand(3), 'x', 'Color', [0 0.4470 0.7410])
% Break if goal node is already reached
for j = 1:1:length(nodes)
if nodes(j).coord == q_goal.coord
break
end
end
% Pick the closest node from existing list to branch out from
ndist = [];
for j = 1:1:length(nodes)
n = nodes(j);
tmp = dist_3d(n.coord, q_rand);
ndist = [ndist tmp];
end
[val, idx] = min(ndist);
q_near = nodes(idx);
q_new.coord = steer3d(q_rand, q_near.coord, val, EPS);
line([q_near.coord(1), q_new.coord(1)], [q_near.coord(2), q_new.coord(2)], [q_near.coord(3), q_new.coord(3)], 'Color', 'k', 'LineWidth', 2);
drawnow
hold on
q_new.cost = dist_3d(q_new.coord, q_near.coord) + q_near.cost;
% Within a radius of r, find all existing nodes
q_nearest = [];
r = 50;
neighbor_count = 1;
for j = 1:1:length(nodes)
if (dist_3d(nodes(j).coord, q_new.coord)) <= r
q_nearest(neighbor_count).coord = nodes(j).coord;
q_nearest(neighbor_count).cost = nodes(j).cost;
neighbor_count = neighbor_count+1;
end
end
% Initialize cost to currently known value
q_min = q_near;
C_min = q_new.cost;
% Iterate through all nearest neighbors to find alternate lower
% cost paths
for k = 1:1:length(q_nearest)
if q_nearest(k).cost + dist_3d(q_nearest(k).coord, q_new.coord) < C_min
q_min = q_nearest(k);
C_min = q_nearest(k).cost + dist_3d(q_nearest(k).coord, q_new.coord);
line([q_min.coord(1), q_new.coord(1)], [q_min.coord(2), q_new.coord(2)], [q_min.coord(3), q_new.coord(3)], 'Color', 'g');
hold on
end
end
% Update parent to least cost-from node
for j = 1:1:length(nodes)
if nodes(j).coord == q_min.coord
q_new.parent = j;
end
end
% Append to nodes
nodes = [nodes q_new];
end
D = []; for j = 1:1:length(nodes) tmpdist = dist_3d(nodes(j).coord, q_goal.coord); D = [D tmpdist]; end
% Search backwards from goal to start to find the optimal least cost path [val, idx] = min(D); q_final = nodes(idx); q_goal.parent = idx; q_end = q_goal; nodes = [nodes q_goal]; while q_end.parent ~= 0
hold on
q_end = nodes(start);
end function d = dist_3d(q1,q2) d = sqrt((q1(1)-q2(1))^2 + (q1(2)-q2(2))^2 + (q1(3)-q2(3))^2); end
function A = steer(qr, qn, val, eps) qnew = [0 0]; if val >= eps qnew(1) = qn(1) + ((qr(1)-qn(1))eps)/dist_3d(qr,qn); qnew(2) = qn(2) + ((qr(2)-qn(2))eps)/dist_3d(qr,qn); qnew(3) = qn(3) + ((qr(3)-qn(3))*eps)/dist_3d(qr,qn); else qnew(1) = qr(1); qnew(2) = qr(2); qnew(3) = qr(3); end
```
四、运行结果
五、matlab版本及参考文献
1 matlab版本 2014a
2 参考文献 [1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016. [2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017. [3]RRT路径规划算法
- 【路径规划】基于matlab GUI改进的DWA算法机器人静态避障路径规划【含Matlab源码 678期】
- 【目标检测】基于matlab GUI差分法运动目标检测【含Matlab源码 1284期】
- 【交通预测】基于matlab GUI交通预测四阶段法交通分配【含Matlab源码 1140期】
- 【路径规划】基于matalb遗传算法机器人栅格地图路径规划【含Matlab源码 022期】
- 【路径规划】基于matlab改进的人工势场算法机器人避障路径规划【含Matlab源码 1151期】
- 【飞行器】基于matlab多源信息融合算法多旋翼无人机组合导航系统【含Matlab源码 1267期】
- 【无人机】基于matlab无人机追踪轨迹【含Matlab源码 1152期】
- 【图像加密】基于matlab混沌算法图像加密解密【含Matlab源码 1218期】
- 【图像检测】基于matlab GUI比值 归一化 相关系数遥感图像【含Matlab源码 737期】
- 【图像加密】基于matlab混沌系统图像加密【含Matlab源码 1190期】
- 【图像分类】基于matlab极限学习分类器对遥感图像分类【含Matlab源码 150期】
- 【图像增强】基于matlab GUI暗通道图像去雾【含Matlab源码 740期】
- 【优化求解】基于matlab差分进化算法求解函数极值问题【含Matlab源码 1199期】
- 【身份证识别】基于matlab GUI身份证号码识别【含Matlab源码 014期】
- 【三维路径规划】基于matlab RRT算法无人机路径规划【含Matlab源码 155期】
- 【优化求解】基于matlab GUI模拟退火算法求解全局最大值最小值问题【含Matlab源码 1242期】
- 【优化充电】基于matlab蒙特卡洛算法求解电动汽车充电优化问题【含Matlab源码 1164期】
- 【定位问题】基于matlab GUI SLAM模拟地图构建和定位【含Matlab源码 1120期】
- 【水果识别分类】基于matlab形态学水果识别分类【含Matlab源码 1132期】
- 【数学建模】基于matlab UKF自行车状态估计【含Matlab源码 1111期】