移动机器人路径规划问题
移动机器人运动轨迹规划是移动机器人导航技术的核心技术之一。我认为移动机器人的导航技术无疑是在解决三个问题:①我现在在何处?②我要往何处去?③我要如何到那里去?
在智能服务机器人行业,从清扫机器人开始,家庭陪伴型机器人,自助送餐机器人的相继出现更是离不开自主定位导航技术,如果说自主定位导航技术另一个核心技术——SLAM技术,已经解决了机器人导航技术问题一和问题二的话,那么移动机器人运动轨迹规划问题无疑是在问题一和问题二的基础上解决问题三。移动机器人的运动路径规划是指机器人从起始点到目标点之间找到一条最短且安全无碰的路径。由于电子计算机处理对象为一组离散数据,SLAM技术将机器人所处地图量化后得到的是一组连续数据,因此移动机器人的运动路径规划问题首先要解决已知地图的离散化问题。栅格法是地图建模的一种方法,栅格法实质上是将AGV的工作环境进行单元分割,将其用大小相等的方块表示出来。详见百度百科-栅格法
通过栅格法将地图进行离散化后,就可以在二维环境中用矩阵来描述这一地图模型。使用0代表该处栅格有障碍物,而使用1代表是可行走栅格,从而建立一组离散化后的栅格地图模型。将来我们要验证运动轨迹规划算法,做可行性分析的时候,就可以直接利用这一套离散地图模型,利用仿真技术在该地图上模拟机器人运动。
由于需要反复调试算法,如果反复利用现场机器人来验证算法是十分耗时耗人力的,利用仿真技术可以预演系统的运动过程,从而简化这一操作来验证算法的稳定性和可行性。
利用仿真技术也可以消除一些机器人内部问题的影响,可以很好地控制变量,在趋于理想的环境中验证轨迹规划算法的稳定性和可行性。
利用仿真技术还可以人为加入扰动变量,从而验证该算法是否能积极应对该地图环境的变化,而不用在现场搭建地图实物,节约了大量资源。
遗传算法
遗传算法(Genetic Algorithm,GA)最早是由美国的 John holland于20世纪70年代提出,该算法是根据大自然中生物体进化规律而设计提出的。是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。该算法通过数学的方式,利用计算机仿真运算,将问题的求解过程转换成类似生物进化中的染色体基因的交叉、变异等过程。在求解较为复杂的组合优化问题时,相对一些常规的优化算法,通常能够较快地获得较好的优化结果。遗传算法已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。详见百度百科
利用MATLAB对栅格化地图建模。
对于障碍物的边界采用以 [X3,Y3]为起点,[X4,Y4]为终点的边界线段模型,则可建立以下数组模型表征地图边界模型。
X3=[2,4,4,2,2,4,4,0,0,2,2,6,6,2,0,2,2,0,6,10,10,6,8,10,10,8,12,16,16,12,10,12,12,10,12,14,14,12,14,20,20,16,16,14,16,20,20,16,18,20,20,18];
Y3=[0,0,2,2,4,4,8,8,6,6,12,12,14,14,18,18,20,20,2,2,6,6,16,16,18,18,6,6,8,8,12,12,16,16,18,18,20,20,12,12,14,14,16,16,2,2,4,4,8,8,10,10];
Y4=[4,4,2,2,4,4,0,0,2,2,6,6,2,2,2,2,0,0,10,10,6,6,10,10,8,8,14,14,12,12,12,12,10,10,14,14,12,12,20,20,16,16,14,14,20,20,16,16,20,20,18,18,];
Y4=[0,2,2,0,4,8,8,6,6,4,12,14,14,12,18,20,20,18,2,6,6,2,16,18,18,16,6,8,8,6,12,16,16,12,18,20,20,18,12,14,14,16,16,12,2,4,4,2,8,10,10,8];
利用MATLAB对机器人运动路径建模——遗传算法
我们定义
无碰撞的,且路径长度最短的路径为最优路径,为全局最优的解。
无碰撞的,路径长度非最短的路径为较优路径,为局部最优的解。
选择的作用:筛选路径较优路径;
交叉的作用:保证路径种群的稳定性,朝着最优解的方向进化;
选择
轮盘赌选择法是依据个体的适应度值计算每个个体在子代中出现的概率,并按照此概率随机选择个体构成子代种群。轮盘赌选择策略的出发点是适应度值越好的个体被选择的概率越大。因此,在求解最大化问题的时候,我们可以直接采用适应度值来进行选择。但是在求解最小化问题的时候,我们必须首先将问题的适应度函数进行转换,以将问题转化为最大化问题。
function [nextx,nexty]=selection(x,y,fitvalue) %选择算子
[Lx,Ly]=size(fitvalue);
totalfit=sum(fitvalue); %求适应值之和
average=fitvalue/totalfit; %单个个体被选择的概率
fitvalue=cumsum(average) %计算个体的累积概率以构造一个轮盘
ms=rand(Lx,1); %产生一个0~1的随机数
choose=1;
circle=1;
%若随机数小于或等于个体的累积概率且大于个体一的累积概率,选择个体进入子代种群。
while circle<=Lx
if (ms(circle))<=fitvalue(choose)&&ms(circle)>fitvalue(1);
nextx(circle,:)=x(choose,:);
nexty(circle,:)=y(choose,:);
circle=circle+1;
else
choose=choose+1;
if choose==Lx;
circle=circle+1;
choose=1;
end
end
end
交叉算法类似于生物界中基因组合
function [nextx,nexty]=crossover(x,y,pc) %交叉算子
[px,py]=size(x);
nextx=ones(size(x));
nexty=ones(size(y));
for i=1:2:px-1
if(rand<pc)
Randpoint=round(rand*py);
nextx(i,:)=[x(i,1:Randpoint),x(i+1,Randpoint+1:py)];
nextx(i+1,:)=[x(i+1,1:Randpoint),x(i,Randpoint+1:py)];
nexty(i,:)=[y(i,1:Randpoint),y(i+1,Randpoint+1:py)];
nexty(i+1,:)=[y(i+1,1:Randpoint),y(i,Randpoint+1:py)];
else
nextx(i,:)=x(i,:);
nextx(i+1,:)=x(i+1,:);
nexty(i,:)=y(i,:);
nexty(i+1,:)=y(i+1,:);
end
end
for i=1:1:px
nextx(i,:)=sort(nextx(i,:));
nexty(i,:)=sort(nexty(i,:));
end
end
function [nextx,nexty]=mutation(x,y,pm) %变异算子
[px,py]=size(x);
nextx=x;
nexty=y;
for i=1:1:px
if(rand<pm)
Randpoint=round(rand*py);
if Randpoint<=1 Randpoint=2;
end
if Randpoint==py Randpoint=py-1;
end
nextx(i,Randpoint)=round(rand*py);
nexty(i,Randpoint)=round(rand*py);
end
end
for i=1:1:px
nextx(i,:)=sort(nextx(i,:));
nexty(i,:)=sort(nexty(i,:));
end
end