matlab练习程序(概率路线图PRM)
PRM概率路线图全称 Probabilistic Roadmap,是一种路径规划算法,利用随机撒点的方式将空间抽样并将问题转为图搜索,利用A*或Dijkstra算法找到起始结束节点的最短路径。
可以想到撒点数越密,得到的路径越接近最优路径,不过运算时间也越长。
算法原理如下:
1. 首先确定地图与起始结束点位置,对地图随机撒点,将起始结束节点加入随机点中,并剔除撒到障碍物上的点。
2. 建立所有节点的邻接矩阵无向图,图的边为两两随机点的距离,如果两两随机点直线距离通过障碍物,则设置该边为无穷大。
3. 利用第2步建好的图,用最短路径搜索算法找出邻接矩阵中通过起始与结束节点中最短的边,通常用A*算法,我这里用了Dijkstra算法,A*以后有机会再介绍。
下面的实现用到了很早之前写的dijkstra算法,注意如果撒点过少,可能无法构造出从起始到结束的一条完整路径,大概会在最后一个循环中死循环。
matlab代码如下:
main.m:
clear all;
close all;
clc; num = ; %随机撒点的数量
img = imread('map.png'); %空间地图
imshow(img);
hold on; [h,w]=size(img);
p=ginput(); %选取起始与结束位置 rnd = floor([rand(num,)*h,rand(num,)*w])+; %空间随机撒点
rnd2 = p; %将起始与结束节点加入随机节点一并计算
for i=:num %只保留随机节点中不在障碍物上的节点
if(img(rnd(i,),rnd(i,))==)
rnd2=[rnd2;double(rnd(i,:))];
end
end
plot(rnd2(:,),rnd2(:,),'.'); A = zeros(length(rnd2)); %构造无向图邻接矩阵
for i=:length(rnd2)-
for j=i+:length(rnd2)
p1 = rnd2(i,:);
p2 = rnd2(j,:); isobs = check_obs(img,p1,p2); %判断两个随机点连线是否通过障碍物
if isobs == %连线间没有障碍物则记录距离
A(i,j) = norm(p1-p2);
A(j,i) = norm(p1-p2);
else %连线中有障碍物则距离为inf
A(i,j) = inf;
A(j,i) = inf;
end
end end srcind = ; %起始节点索引
dstind = ; %结束节点索引 %%对矩阵A使用dijkstra最短路径算法,这里没有使用A*
m = length(A);
S=inf(,m); %从开始的源点到每一个节点的距离
S(srcind)=; %源点到自己的距离为0
parent=zeros(,m); %存储每个节点的前驱,在松弛过程中赋值
parent(srcind)=; %源点的前趋是自己 visit=zeros(,m); %标记某个节点是否访问过了
index=srcind; %从index节点开始搜索 %判断是否对所有节点都找的最短路径了。可能会有源点没有路径到目标节点的情况,那就无限循环了
while sum(visit)~=m %没有出队列操作,不过通过visit来等价的表示了
visit(index)=; %标记第index节点为已入列的节点
[S parent]=relax(S,parent,A,visit,index,m); %松弛,如果两个节点间有更短的距离,则用更短的距离
index=extract_min(S,visit,index,m); %使用已访问的最小的节点作为下一次搜索的开始节点
end plot(p(:,),p(:,),'r.')
ind = dstind;
while ind~=
line([rnd2(ind,) rnd2(parent(ind),)],[rnd2(ind,) rnd2(parent(ind),)],'color','r');
ind = parent(ind); %不断搜索当前节点的父节点
end
check_obs.m:
function isobs = check_obs(img,p1,p2)
[h w]=size(img);
d = norm(p1-p2);
direct = atan2(p1()-p2(),p1()-p2());
sin_dir = sin(direct);
cos_dir = cos(direct);
for r=:d
p = floor(p2 + r*[sin_dir cos_dir]); y = p();
x = p();
if y>= && y<=h && x>= && x<=w
if img(y,x) ==
isobs = ;
return;
end
end
end
isobs = ;
end
relax.m:
%边缘松弛,使用更短的距离作为节点的值
function [S pa]=relax(S,pa,A,visit,index,m)
i=index;
for j=:m
if A(i,j)~=inf && visit(j)~= %搜索没有标记过的节点
if S(j)>S(i)+A(i,j) %将较小的值赋给正在搜寻的节点
S(j)=S(i)+A(i,j);
pa(j)=i;
end
end
end
end
extract_min.m:
%提取队列中尚未标记的最小的值的序号
function index=extract_min(S,visit,index,m)
Mi=inf;
for j=:m
if visit(j)~=
if S(j)<Mi
Mi=S(j);
index=j;
end
end
end
end
结果如下:
原图:
算法结果:
matlab练习程序(概率路线图PRM)的更多相关文章
- matlab练习程序(SUSAN检测)
matlab练习程序(SUSAN检测) SUSAN算子既可以检测角点也可以检测边缘,不过角点似乎比不过harris,边缘似乎比不过Canny.不过思想还是有点意思的. 主要思想就是:首先做一个和原图像 ...
- (转)matlab练习程序(HOG方向梯度直方图)
matlab练习程序(HOG方向梯度直方图)http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html HOG(Histogram o ...
- matlab示例程序--Motion-Based Multiple Object Tracking--卡尔曼多目标跟踪程序--解读
静止背景下的卡尔曼多目标跟踪 最近学习了一下多目标跟踪,看了看MathWorks的关于Motion-Based Multiple Object Tracking的Documention. 官网链接:h ...
- matlab练习程序(模拟退火SA)
模拟退火首先从某个初始候选解开始,当温度大于0时执行循环. 在循环中,通过随机扰动产生一个新的解,然后求得新解和原解之间的能量差,如果差小于0,则采用新解作为当前解. 如果差大于0,则采用一个当前温度 ...
- matlab练习程序(快速搜索随机树RRT)
RRT快速搜索随机树英文全称Rapid-exploration Random Tree,和PRM类似,也是一种路径规划算法. 和PRM类似,算法也需要随机撒点,不过不同的是,该算法不是全局随机撒点,而 ...
- matlab练习程序(透视投影,把lena贴到billboard上)
本练习程序是受到了这个老外博文的启发,感觉挺有意思,就尝试了一下.他用的是opencv,我这里用的是matlab. 过去写过透视投影,当时是用来做倾斜校正的,这次同样用到了透视投影,不过更有意思,是将 ...
- matlab练习程序(多圆交点)
最近总是对计算几何方面的程序比较感兴趣. 多圆求交点,要先对圆两两求交点. 有交点的圆分为相切圆和相交圆. 相切圆求法: 1.根据两圆心求直线 2.求公共弦直线方程 3.求两直线交点即两圆切点. 相交 ...
- matlab练习程序(矩形变换为单连通形状)
变换使用的模板必须是单连通的,而且模板中心必须在模板内,如果在模板中打个结或是月牙形,这里的程序就处理不了了. 虽然非单连通模板也有办法处理,不过不是这里要讨论的. 这里用到的方法和矩形变换为圆那片文 ...
- matlab练习程序(渲染三原色)
这里我用的空间是x向右为正,y向下为正,z向屏幕里面为正.相当于标准右手系绕x轴旋转了180度. 将三个点光源放在 r = [0.3,0,0.5];g = [0.3,-0.5*cos(pi/6),-0 ...
随机推荐
- python学习笔记:分支 与 循环
if 语句 if 条件: ...... # 条件为真的时候,执行缩进的代码 if 条件: ...... # 条件为真的时候执行 else: ...... # 条件为假的时候执行 if 条件1: ... ...
- Python基础模块整理
1.shutil :可以用来对文件进行基本操作(拷贝,剪切等) 2.glob :提供了一个函数用于从目录通配符搜索中生成文件列表 3.datetime :日期和时间的处理 4.zlib ...
- 吴裕雄--天生自然Numpy库学习笔记:NumPy IO
Numpy 可以读写磁盘上的文本数据或二进制数据. NumPy 为 ndarray 对象引入了一个简单的文件格式:npy. npy 文件用于存储重建 ndarray 所需的数据.图形.dtype 和其 ...
- 使用YUM安装软件时提示PackageKit睡眠中解决方法!
报错如图所示: 解决方法一:移除var/run/yum.pid文件 方法二:直接杀掉进程号 报错的时候会跟进程号 直接利用kill -9 +进程号
- inode节点使用率过大处理
当发现某个分区下的inode使用率过大时,需要找到该分区下的某些目录里有哪些文件可以清理. 查找某个目录下一个月或两个月之前的文件,然后删除# find . -type f -mtime +30 |w ...
- Codeforces1140D. Minimum Triangulation
题目链接 本题是区间dp里的三角剖分,板子题,dp[i][j]表示凸多边形i-j构成的最值,转移方程为dp[i][j] = min/max(dp[i][k]+dp[k][j]+w[i,j,k])(i& ...
- sqlmap命令手册
http://127.0.0.1/sqli-labs-master/Less-1/?id=1 当给sqlmap上面这么一个url的时候,它会自动: 1.判断可注入的参数 2.判断可以用那种SQL注入技 ...
- 「模板」可持久化 HFQ-Treap
老师用的是静态数组的写法,开了很多数组- 其实个人更倾向于 struct 或者用 class 封装起来. 但是鉴于太难打 好吧,是我懒得打. 然后就借鉴了老师的模板,写出了属于自己的 压行 风格. 代 ...
- git 修改分支 删除分支 新增分支
一.修改分支名 1.本地分支重命名 git branch -m oldName newName 2.将重命名后的分支推送到远程 git push origin newName 3.重新更新所有分支 g ...
- CentOS修改各大yum源(centos5,centos6,centos7)
备份原配置文件 进入yum源配置目录: cd /etc/yum.repos.d 如果没有先安装wget: sudo yum install wget 修改yum源,就是修改CentOS-Base.re ...