当前位置:文档之家› 一种偏向目标型地RRT算法实现

一种偏向目标型地RRT算法实现

一种偏向目标型的RRT算法实现摘要:本文针对基本快速扩展随机树(RRT)算法存在搜索过于平均、效率低下、用时较长的缺陷,提出了一种偏向目标型的改进型RRT算法。

这种算法在生成随机点时以一定概率选择最终目标点作为局部目标点,使树的扩展有一个趋向于最终目标点的趋势,从而加快了算法的收敛速度,优化了规划路径。

最后通过Matlab程序仿真,在二维平面上验证了改进型算法相对于基本算法的优越性。

关键词:路径规划、RRT算法、偏向目标型一.引言机器人学是当今科学技术研究的热点问题,它汇聚了各个尖端学科最先进的研究成果。

科学家们从上世纪40年代开始着手研制机器人到如今,机器人的发展主要经历了三次技术变革。

从最简单的第一代机器人到现在的第三代智能机器人,机器人从只会机械的执行命令逐渐演变成利用各种先进的传感器自动的学习环境,适应环境,并完成人类下达的任务。

路径规划问题是机器人研究中的重要的组成部分,它的重点就是要使机器人自主并且安全的从起始位姿移动到目标位姿。

机器人路径规划主要分为全局路径规划和局部路径规划两大方面。

全局路径规划是一种利用环境全局信息的方法,它通常将周边环境信息存储在一地图中,并且利用这地图寻找可行路径。

全局路径规划的优点是有利于找到全局可行解和最优解,但是它的运算时间长,不适用于快速变化的动态环境。

常用的全局路径规划方法有栅格法、可视图法、拓扑法和自由空间法等。

局部路径规划只考虑机器人当前能探测到的环境信息,运算速度快、反应迅速,非常适用于动态环境。

但其缺点是算法可能无法收敛,不能保证机器人一定能够到达目标点,而且找到的可行路径可能会偏离最短路径。

常用的局部路径规划算法有人工势场法、模糊逻辑法、神经网络法和遗传算法等等。

RRT 算法是最近几年才发展起来的,并且应用比较普遍的一种路径规划算法。

它在处理非完整约束的路径规划问题时具有相当大的优势,因为它可以将各种约束集成到算法本身之中,因此对环境要求较低。

而且该算法概率完备,在理论上肯定能找到可行路径。

但其缺点是搜索过于平均,算法效率较低,而且规划出的路径往往偏离最短路径。

本文针对RRT 算法存在的缺陷,提出了一种改进的偏向目标型的RRT 算法,该算法有效的解决了搜索过于平均的问题,提高了算法效率,而且规划出的路径是更接近于最短路径的次优路径。

二. RRT 算法的基本原理RRT 算法在路径规划时以状态空间中的一个初始点作为根节点,通过随机采样逐渐增加叶节点的方式,生成一个随机扩展树。

当随机树中的叶节点中包含了目标点或目标区域时,便可在随机树中找到一条从根节点到目标点的路径。

RRT 的扩展方式如下图1所示。

图 1 RRT 算法扩展过程图1中T 表示当前存在的扩展树,rand q 表示随机点,near q 表示离随机点randq 最近的一个树节点,然后在rand q 和near q 的连线上以步长step 为单位截取一个新节点new q ,如果new q 没碰到障碍物,则将new q 加入到扩展树T 中。

重复以上步骤直到new q 到达目标区域则算法结束,此时可在树T 中找到一条起点到目标点的路径。

为了便于计算机编程实现,我们将RRT的构建过程归纳为以下两个表格。

其中表1为各参数意义,表2为RRT构建流程。

表1 RRT算法中的各参数意义表2 RRT算法构建流程三. 改进的RRT 算法虽然RRT 算法概率完备,在理论上总能找出一条可行路径。

但是由于其扩展新节点的方式是在全空间随机产生的,一方面造成扩展树在全空间分布过于平均,算法效率较低;另一方面规划的路径质量不高,通常偏离最短路径较大。

针对以上缺陷,我们希望对基本的RRT 算法进行改进。

经过分析我们得知造成RRT 算法上述缺陷的根源是在扩展新节点时,随机点是在全空间随机产生的。

借鉴启发式算法的灵感,我们可以在确定随机点时让随机点以一定的概率等于目标点。

这样树的扩展就有一个趋于目标点的趋势,而不是在全空间随机分布,从而提高了算法的搜索效率,而且由于树节点的扩展是趋向于目标点的,理论上规划出来的路径也会更加接近于最短路径。

还应注意的是改进后的算法在概率上依然是完备的。

通过以上分析,我们知道改进的RRT 算法流程和基本的RRT 算法流程大致相同,只要把第二节中表2的第3个步骤进行如下的改写即可。

(1) 生成随机点rand q ;(2) 给定一个0到1的偏置变量Bias ,生成一个0到1的随机数rand ; (3) 如果rand<Bias,则rand q =goal q ;否则, rand q 不变。

四. Matlab 仿真实验 1.定义环境模型本文仿真是在二维平面上进行的,将整个平面划分为了有障碍部分和无障碍物部分,如下图2所示。

图 2环境模型示意图地图尺寸为100*100,其中白色区域代表无障碍空间,机器人可以随意行走;黑色区域表示障碍物空间,机器人不能通行。

为了仿真的方便,这里的障碍物都选择为圆形,这不影响算法验证的可靠性。

2.定义节点数据结构分析可知扩展树的每个节点有三个必要要素,分别是节点的x ,y 坐标以及其父节点。

因此我们定义节点的数据结构如下:123[,,]node x x x其中12,x x 表示节点在二维平面上的坐标,3x 表示节点的父节点序号。

考虑到起点作为根结点,其没有父节点,因此定义它的父节点序号为0。

3.仿真结果对比 (1)分布障碍地图起点(5,80),终点(90,70)图3 路径规划图,RRT算法(左),改进RRT算法(右)上图中蓝色的“*”点表示扩展树的所有节点,红色的曲线表示规划得到的路径。

通过图3的对比明显可以看出在分布障碍地图中,偏向目标型RRT算法得到的扩展树节点数更少,这说明算法的效率更高。

观察路径曲线可以看出偏向目标型RRT算法得到的路径更优。

(2)狭窄通道地图起点(1,1),终点(90,90)图4路径规划图,RRT算法(左),改进RRT算法(右)从图4中可以看出在狭窄通道地图中,我们可以明显的观察到基本RRT算法在搜索时表现出来的搜索过于平均,算法效率低下的缺陷,而且规划得到的路径也偏离最优路径较大。

而改进后的偏向目标型RRT算法体现出了强烈的趋向于目标点趋势,而且规划得到的路径也非常接近于最优路径。

(3)复杂随机地图起点(1,1),终点(90,90)图5路径规划图,RRT算法(左),改进RRT算法(右)通过图5,我们也可以看出改进后的RRT算法在复杂随机地图中也表现优异,证明了偏向目标型RRT算法的优越性。

五.总结本文针对基本RRT算法存在搜索过于平均,算法效率低下,规划路径偏离最短路径较大的缺陷,分析其缺陷原因在于随机点的确定在全空间分布过于平均导致的。

借鉴启发式算法的思想,我们提出了一种确定随机点的新方法,即让随机点以一定的概率等于目标点,这样就使随机树的扩展有一种趋向于目标点的趋势,从而解决了随机点分布过于平均的缺点。

最后通过Matlab仿真对两种算法的结果对比分析得到,改进后的偏向目标型RRT算法相对于基本RRT算法,无论在算法效率还是路径质量,都体现出了很大的优越性。

参考文献[1]王全.基于RRT的全局路径规划方法及其应用研究[D].国防科学技术大学,2014.[2]加东.基于RRT算法的非完整移动机器人运动规划[D].华东理工大学,2014.[3]林,贾菁辉.基于对比优化的RRT路径规划改进算法[J].计算机工程与应用,2011,47(3):210-213,228.[4]贾菁辉.移动机器人的路径规划与安全导航[D].理工大学,2009.[5]周培培.未知环境下机器人路径规划算法的研究[D].科技大学,2014.[6]猛.基于智能优化与RRT算法的无人机任务规划方法研究[D].航空航天大学,2012.[7]王滨,金明河,宗武等.基于启发式的快速扩展随机树路径规划算法[J].机械制造,2007,45(12):1-4.[8]宋金泽,戴斌,单恩忠等.一种改进的RRT路径规划算法[J].电子学报,2010,38(z1):225-228.[9]乔永兴.自主式移动机器人的路径规划[D].广西大学,2003.[10]磊,叶涛,谭民等.移动机器人技术研究现状与未来[J].机器人,2002,24(5):475-480.[11]刚,林成.复杂环境下路径规划问题的遗传路径规划方法[J].机器人,2001,23(1):40-44.附录本文中使用的Matlab程序%主程序function BiasGoal_RRTMap=CreateMap(1); %创建有障碍物的模拟地图,输入参数为不同的地图类型step=5; %步长startNode=[1,1,0]; %起点endNode=[90,90,0]; %终点tree=startNode; %根结点if((norm(startNode(1,1:2)-endNode(1,1:2))<=step)&(collision(startNode,endNode, Map)==0))path=[startNode(1,1:2);endNode(1,1:2)];elsesuccess=0;while success==0[tree,flag]=extendTree(tree,endNode,step,Map);success=flag;endendpath=findPath(tree);plotmap(Map,path,tree);%创建地图,有三种不同类型的地图function Map=CreateMap(num)if num==1 %分布障碍地图Map.BarNum=3;Map.LLCd=[0;0]; %地图左下角坐标Map.URCd=[100;100]; %地图右上角坐标radius=[20;15;20]; %障碍物半径barCenter=[33,75;38,30;75,50]; %障碍物中心点坐标for i=1:Map.BarNumMap.radius(i)=radius(i);Map.cx(i)=barCenter(i,1);Map.cy(i)=barCenter(i,2);endendif num==2 %狭窄通道地图Map.BarNum=2;Map.LLCd=[0;0];Map.URCd=[100;100];radius=[23.75;23.75];barCenter=[50,76.25;50,23.75];for i=1:Map.BarNumMap.radius(i)=radius(i);Map.cx(i)=barCenter(i,1);Map.cy(i)=barCenter(i,2);endendif num==3 %复杂随机地图Map.BarNum=100;Map.LLCd=[0;0];Map.URCd=[100;100];MaxRadius=2.5;for i=1:Map.BarNumMap.radius(i)=MaxRadius*rand;Map.cx(i)=Map.LLCd(1)+Map.radius(i)+(Map.URCd(1)-Map.LLCd(1)-2*Map.radius( i))*rand;Map.cy(i)=Map.LLCd(2)+Map.radius(i)+(Map.URCd(2)-Map.LLCd(2)-2*Ma p.radius(i))*rand;endend%基本RRT算法程序function [newTree,flagReach]=extendTree(tree,endNode,step,Map)flag=1;while flagrandPoint=[(Map.URCd(1)-Map.LLCd(1))*rand,(Map.URCd(2)-Map.LLCd(2))*rand];distmp=tree(:,1:2)-ones(size(tree,1),1)*randPoint;[mindis,minnum] = min(diag(distmp*distmp'));pvector=randPoint-tree(minnum,1:2);newPoint=tree(minnum,1:2)+pvector/norm(pvector)*step;if collision(newPoint,tree(minnum,1:2),Map)==0newNode=[newPoint,minnum];newTree=[tree;newNode];flag=0;endendif((norm(newPoint-endNode(1,1:2))<=step)&(collision(newPoint,endNode(1,1:2),M ap)==0))flagReach=1;elseflagReach=0;end%改进后的偏向目标型RRT算法程序function [newTree,flagReach]=BiasextendTree(tree,endNode,step,Map)flag=1;Bias=0.5;while flagrandPoint=[(Map.URCd(1)-Map.LLCd(1))*rand,(Map.URCd(2)-Map.LLCd(2))*rand];if rand<BiasrandPoint=endNode(1:2);enddistmp=tree(:,1:2)-ones(size(tree,1),1)*randPoint;[mindis,minnum] = min(diag(distmp*distmp'));pvector=randPoint-tree(minnum,1:2);newPoint=tree(minnum,1:2)+pvector/norm(pvector)*step;if collision(newPoint,tree(minnum,1:2),Map)==0newNode=[newPoint,minnum];newTree=[tree;newNode];flag=0;endendif((norm(newPoint-endNode(1,1:2))<=step)&(collision(newPoint,endNode(1,1:2),M ap)==0))flagReach=1;elseflagReach=0;end%检测新节点和每一个障碍物是否有碰撞,若有则返回1function collision_flag = collision(node, parent, Map);collision_flag = 0;for sigma = 0:.2:1,p = sigma*node(1:2) + (1-sigma)*parent(1:2);for i=1:Map.BarNum,if (norm([p(1);p(2)]-[Map.cx(i); Map.cy(i)])<=Map.radius(i)), collision_flag = 1;break;endendend%随机扩展树完成后,根据每个节点父节点的序号找出可行路径function path=findPath(tree)lastnodenum=size(tree,1);path=[tree(lastnodenum,1:2)];parentnodenum=tree(lastnodenum,3);while(parentnodenum~=0)path=[tree(parentnodenum,1:2);path];parentnodenum=tree(parentnodenum,3);end%画出地图以及路径function plotmap(Map,path,tree)close all;th=0:2*pi/100:2*pi;axis([0,100,0,100]);hold onfor i=1:Map.BarNumX = Map.radius(i)*cos(th) + Map.cx(i);Y = Map.radius(i)*sin(th) + Map.cy(i);fill(X,Y,'k'); %障碍物endplot(tree(:,1),tree(:,2),'*'); %所有节点plot(path(:,1),path(:,2),'r','linewidth',3); %路径课程论文评分标准表。

相关主题