利用MATLAB创建栅格地图(代码可复制)

先做一个声明:文章是由我的个人公众号中的推送直接复制粘贴而来,因此对智能优化算法感兴趣的朋友,可关注我的个人公众号:启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法,经典的,或者是近几年提出的新型智能优化算法,并附MATLAB代码。

“有不少的同学利用智能优化算法搞路径规划,往往需要创建栅格地图,这里分享两段MATLAB创建栅格地图的代码~”

图片

路径规划需要环境建模,环境建模的目的是模拟现实场景,将物理空间复刻到抽象空间,建立一个可以并且便于计算机处理的环境模型。环境建模其实质就是将算法需要处理的约束条件与物理环境中的障碍物等进行一一映射,并且使路径搜索的情况可以直观的展示在虚拟场景中。机器人路径规划的重要环节之一就是建立一个环境模型了,方便直观地展现出路径规划的场景和规划结果。

建立环境模型的基本要求就是计算机便于存储、处理和使用。在路径规划方面最常用的图形学环境建模方法有几何法和栅格法。这里介绍一下栅格法。

栅格法根据比例和分割要求,将模拟环境进行分割,划分成若干相同的栅格,然后针对每个栅格设置环境参数,根据实际或假设环境,设置其中各个栅格障碍物的情况。栅格法处理的环境模型所得栅格数据结构实际就是一张二维表,因此栅格地图在计算机中是比较容易创建和维护的。由于栅格地图是按照一定的规则划分的,所以很容易将其转移到坐标系下,这样障碍物的位置和可行区域就能更加直观的展示出来,通过行列来显著标识各位置信息。

栅格法建模的优点:在栅格地图中,每个位置都可由坐标点来确定,该位置状态也可由具体数据来表示。栅格地图很容易于在计算机中进行存储、更新与分析,且该方法已在许多机器人系统中得到了成功应用。

01
随机生成

原理其实很简单,随机生成一个01矩阵,1就表示障碍物,指定起点和终点后,画出来就行了。障碍物以概率来生成,这个概率可以自己定义。比如,以0.3的概率随机生成障碍物的40×40的实例,那么在40×40=1600个格子中,有0.3×1600=480个格子是障碍物,画成黑色。

MATLAB代码如下(可直接复制粘贴):

%% 栅格地图创建 %%
%% By 后会无期 %%
%% 2023.10.24 %%
%% 关注微信公众号:启发式算法讨论 %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%clear
clc%% 以"Probability"的概率生成m×n的栅格图障碍物环境
Probability=0.2; % 设置障碍区概率(可自行更改)
m=30;n=30;       % 设置地图的大小(可自行更改)R=rand(m,n);   % 初始化一个m×n的[0,1]之间随机矩阵,用来生成矩阵G
G=zeros(m,n);  % 初始化一个m×n的零矩阵,后续用来存储地图
for i=1:mfor j=1:nif R(i,j)<=0.2G(i,j)=1;  % 1表示障碍物elseG(i,j)=0;  % 0表示无障碍endend
end% 规定起点和终点(可自行更改)
G(1,1)=0;
G(m,n)=0; %% 画栅格地图
figure;
axis([0,m,0,n]);
for i=1:mfor j=1:n% 计算小方框的四个顶点的横、纵坐标x1=j-1;y1=n-i;x2=j;y2=n-i;x3=j;y3=n-i+1;x4=j-1;y4=n-i+1;% 绘制栅格图if G(i,j)==1fill([x1,x2,x3,x4],[y1,y2,y3,y4],[0,0,0]);hold onelsefill([x1,x2,x3,x4],[y1,y2,y3,y4],[1,1,1]);hold onendend
end% 画起点图标(可自行更改)
fill([0,1,1,0],[n-1,n-1,n,n],[1,0,0]);
% 画终点图标(可自行更改)
fill([m-1,m,m,m-1],[0,0,1,1],[0,0,1]);

比如以0.2概率随机生成障碍物的30×30栅格地图,运行代码结果如下:

图片

但是,也有一个弊端。因为是随机生成障碍物,所以障碍物有可能把起点或者终点包围,就没办法求解了。比如,我们把障碍物的概率提升到0.4,还是以30×30的地图为例,就有可能出现下面这种情况:

图片

如果是这种情况就只能再重新随机生成栅格地图了。

02
手动创建

手动创建就是自己手动设置障碍物的位置,这样就可以避免上面那种方法的弊端,不会让障碍物包围起点或者终点。

MATLAB代码如下(可直接复制粘贴):

%% 栅格地图创建 %%
%% By 后会无期 %%
%% 2023.10.24 %%
%% 关注微信公众号:启发式算法讨论 %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%clear
clc%% 生成m×n的栅格图障碍物环境
m=30; n=30;% 规定每个坐标中的对象
matrix=(ones(m,n)); % 地图矩阵
imshow(matrix,'InitialMagnification','fit')
[Row,Column] = size(matrix);     % 获取图像的大小% 产生网格
x = 0.5:1:Column+1;
y = 0.5:1:Row+1;
M = meshgrid(x,y);
N = meshgrid(y,x);
hold onplot(x,N,'b');   % 画出水平横线
plot(M,y,'b');   % 画出垂直竖线
pause(1);% 构建一个对话框
zuo=msgbox('利用鼠标左键定义障碍物位置,定义完成后右键定义最后一个障碍物结束定义');
uiwait(zuo,10);
if ishandle(zuo) == 1delete(zuo);
end% 设置横坐标题目, 再次提醒
xlabel('利用鼠标左键定义障碍物位置,定义完成后右键定义最后一个障碍物结束定义','Color','red');ob = 1;
while ob == 1[xval,yval,ob] = ginput(1);xval=floor(xval + 0.5);yval=floor(yval + 0.5);matrix(yval,xval)=0;    % 设置障碍物imshow(matrix,'InitialMagnification','fit')plot(x,N,'b');          % 画出水平横线plot(M,y,'b');          % 画出垂直竖线
end
hold offfigure
imshow(matrix,'InitialMagnification','fit') % 画出最终栅格图
save('MAP.mat','MAP');                      % 存储栅格地图的矩阵

还是以30×30的地图为例,运行结果如下:

图片

然后就自己手动创建障碍物。用鼠标来点点点。我这里懒得点。

手动创建的弊端就是繁琐。比如以0.3的概率随机生成障碍物的30×30的实例,那么在30×30=900个格子中,有0.3×900=270个格子是障碍物,你需要点270次才能完成创建。而在这个过程中,你需要自己计数。

最后,应大家要求,建立了一个算法交流群:912369858

欢迎大家进群交流,谢谢!

图片

图片

 

可通过下方链接下载代码清单,在里面寻找需要的算法代码,然后去对应的链接获取。清单会同步更新,一旦有新的代码,就可以在清单里找到。清单里面有部分代码是开源获取的。可随时免费下载。

链接:https://pan.baidu.com/s/1SFDMplrL7tiqGZlrpOSGYg

提取码:8023

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/119684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决msvcp120.dll丢失的问题的5个方法,修复系统dll问题

在使用计算机的过程中&#xff0c;我们经常会遇到各种各样的动态链接库&#xff08;DLL&#xff09;文件。其中之一就是“msvcp120.dll丢失”。这个错误通常会导致某些应用程序无法正常运行。为了解决这个问题&#xff0c;我们需要找到合适的方法来修复丢失的msvcp120.dll文件。…

SpringSecurity分布式安全框架

Spring Security是一个基于Spring框架的安全框架&#xff0c;它提供了全面的安全解决方案&#xff0c;包括用户认证和用户授权等Web应用安全性问题。Spring Security可以轻松扩展以满足自定义需求&#xff0c;它的真正强大之处在于它可以轻松扩展以满足自定义要求。 对于分布式…

JavaWeb——IDEA操作:Project最终新建module

在project中创建新的module&#xff1a; 创建一个新的module很容易&#xff0c;但是它可能连接不上Tomcat&#xff0c;因此需要修改一些配置&#xff1a; 将以下地址修改为新module的地址

PROFINET通信介绍

S7-1200和汇川变频器的PROFINET通信应用&#xff0c;请参考下面文章链接&#xff1a; PN通信组态(汇川变频器和S7-1200PN通信)-CSDN博客文章浏览阅读1.2k次。ABB变频器的PN通信相关设置&#xff0c;请参看下面的文章链接博途PLC和ABB变频器PN通讯详解_abb 变频器 pn通信_RXXW_…

【JavaEE初阶】 线程安全的集合类

文章目录 &#x1f340;前言&#x1f332;多线程环境使用 ArrayList&#x1f6a9;自己使用同步机制 (synchronized 或者 ReentrantLock)&#x1f6a9;Collections.synchronizedList(new ArrayList);&#x1f6a9;使用 CopyOnWriteArrayList &#x1f38d;多线程环境使用队列&am…

echarts-进度条

echarts-进度条 option {title: {text:"xxxx统计",left: 1%,top: 0%,textStyle: {color: "#2E3033",fontSize:18,},},tooltip: {axisPointer: {type: "shadow",},},grid: {top: 9%,left: "12%",right:"22%",bottom:"0…

react笔记基础部分(组件生命周期路由)

注意点&#xff1a; class是一个关键字&#xff0c; 类。 所以react 写class, 用classname &#xff0c;会自动编译替换class 点击方法&#xff1a; <button onClick {this.sendData}>给父元素传值</button>常用的插件&#xff1a; 需要引入才能使用的&#xf…

如何使用vim粘贴鼠标复制的内容

文章目录 一、使用步骤1.找到要编辑的配置文件2.找到目标文件3.再回到vim编辑器 一、使用步骤 1.找到要编辑的配置文件 用sudo vim /etc/apt/sources.list编辑软件源配置文件 sudo vim /etc/apt/sources.listvim 在默认的情况下当鼠标选中的时候进入的 Visual 模式&#xff…

GitLab升级16.5.0后访问提示502

系统是兼容CentOS8的TencentOS3.1 GitLab原来的版本是16.4.1 使用yum升级时发现GitLab有新版本,决定升级。 升级过程无异常,出现升级成功的提示。 可是意外的时,访问站点时提示502. GitLab比较吃资源,启动的服务较多。之前也有等会就正常的情况。 这次没那么幸运,一…

Go语言入门心法(十四): Go操作Redis实战

Go语言入门心法(一): 基础语法 Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 Go语言入门心法(四): 异常体系 Go语言入门心法(五): 函数 Go语言入门心法(六): HTTP面向客户端|服务端编程 Go语言入门心法(七): 并发与通道 Go语言入门心法(八): mysql驱动安装报错o…

【ARM Cortex-M 系列 4 番外篇 -- 常用 benchmark 介绍】

文章目录 1.1 CPU 性能测试 MIPS 计算1.1.1 Cortex-M7 CPI 1.2 benchmark 小节1.3.1 Geekbenck 介绍 1.3 编译参数配置 1.1 CPU 性能测试 MIPS 计算 每秒百万指令数 (MIPS)&#xff1a;在数据压缩测试中&#xff0c;MIPS 每秒测量一次 CPU 执行的低级指令的数量。越高越好&…

D71X-16Q手柄蝶阀型号解析

D71X-16Q型号字母含义解析 D71X-16Q是德特森阀门常用的手柄蝶阀型号字母分别代表的意思是: D——代表阀门类型《蝶阀》 7——代表连接方式《对夹》 1——代表结构形式《中线》 X——代表阀座材质《橡胶》 -代表分隔键 16——代表公称压力《1.6MPA》 Q——代表阀体材料《…

美创科技列为IDC中国数据安全市场代表厂商

近日&#xff0c;国际权威IT咨询机构IDC发布《中国数据安全市场发展趋势&#xff0c;2023》报告&#xff0c;报告针对中国数据安全市场的发展现状进行调研&#xff0c;明确了最终用户数据安全建设的痛点、难点&#xff0c;阐述了市场中各技术服务提供商的服务方案和优势。 美创…

如何恢复u盘删除文件?2023最新分享四种方法恢复文件

U盘上删除的文件怎么恢复&#xff1f;使用U盘存储文件是非常方便的&#xff0c;例如&#xff1a;在办公的时候&#xff0c;会使用U盘来存储网络上查找到的资料、产品说明等。在学习的时候&#xff0c;会使用U盘来存储教育机构分享的教学视频、重点知识等。而随着U盘存储文件的概…

css步骤条

html 代码以及样式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>css步骤条</title><style>.steps {display: flex;justify-content: space-between;padding: 0;margin: 20px 10px;lis…

数据结构笔记——树和图(王道408)(持续更新)

文章目录 传送门前言树&#xff08;重点&#xff09;树的数据结构定义性质 二叉树的数据结构定义性质储存结构 二叉树算法先中后序遍历层次展开法递归模拟法 层次遍历遍历序列逆向构造二叉树 线索二叉树&#xff08;难点&#xff09;定义线索化的本质 二叉树线索化线索二叉树中…

Elasticsearch分词器-中文分词器ik

文章目录 使用standard analysis对英文进行分词使用standard analysis对中文进行分词安装插件对中文进行友好分词-ik中文分词器下载安装和配置IK分词器使用ik_smart分词器使用ik_max_word分词器 借助Nginx实现ik分词器自定义分词网络新词 ES官方文档Text Analysis 使用standard…

react-typescript-demo

1.使用 Context 来存储数据

elasticSearch put全局更新和单个字段更新语法

1、如下&#xff1a;更新改类型未doc(文档)的全局字段数据 注意&#xff1a;如果你使用的是上面的语句&#xff0c;但是只写了id和title并赋值&#xff0c;图片上其他字段没有填写&#xff0c;执行命令后&#xff0c;则会把原文档中的其他字段都给删除了&#xff0c;你会发现查…

Linux虚拟网络设备—Veth Pair

veth是Virtual Ethernet Device的缩写&#xff0c;是一种成对出现的Linux虚拟网络接口设备。它最常用的功能是用于将不同的Linux network namespaces 命名空间网络连接起来&#xff0c;让二个namespaces之间可以进行通信。我们可以简单的把veth pair理解为用一根网线&#xff0…