利用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文件。…

MVCC 过程中会加锁吗?

MVCC 机制&#xff0c;全称&#xff08;Multi-Version Concurrency Control&#xff09;多版本并发控制&#xff0c;是确保 在高并发下&#xff0c; 多个事务读取数据时不加锁也可以多次读取相同的值。 MVCC 在读已提交&#xff08;READ COMMITTED&#xff09;、可重复读&…

损失函数和评估函数

损失函数和目标函数定义 损失函数是用于衡量模型在训练过程中预测结果与实际结果之间的差异的函数。它通过计算模型的预测值与实际值之间的距离或差异来 quantitatively 表示模型的性能好坏。损失函数通常被用作优化算法(如梯度下降)的目标函数,通过最小化损失函数来调整模…

汽车发动机电机右盖设计

摘要 随着我国微型电子技术和社会经济的发展&#xff0c;目前行业内为满足客户需求出现了大量的电器设备&#xff0c;而大多数的电气设备的重要组成中都有电机&#xff0c;并且电机端盖成为电机研发人员重点关注和研究的对象&#xff0c;逐渐成为电机的重要组成部分&#xff0c…

Scala【集合常用方法和函数操作(下)】

Fold、FoldLeft 和 FoldRight object Test03_Fold {def main(args: Array[String]): Unit {// 称作集合外的参数val list List(1,2,3,4)// fold的底层仍然是调用的 foldLeft// 第一个参数是一个值(称作集合内的参数&#xff0c;必须和集合外的参数类型一致)// 第二个参数是一…

linux信号驱动IO(高级字符设备四)

一、linux信号驱动IO介绍 信号驱动 IO 不需要应用程序查询设备的状态&#xff0c;一旦设备准备就绪&#xff0c;会触发SIGIO信号&#xff0c;进而调用注册的处理函数。 1.1、linux信号驱动IO应用层 如果要实现信号驱动 IO&#xff0c;需要应用程序和驱动程序配合&#xff0c;应…

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…

2520. 统计能整除数字的位数 --力扣 --JAVA

题目 给你一个整数 num &#xff0c;返回 num 中能整除 num 的数位的数目。 如果满足 nums % val 0 &#xff0c;则认为整数 val 可以整除 nums 。 解题思路 将整数num转换成字符串并读取每位字符进行运算 代码展示 class Solution {public int countDigits(int num) {int …

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…

SpringMVC 异常处理器

1、基于配置的异常处理 SpringMVC提供了一个处理控制器方法执行过程中所出现的异常的接口&#xff1a;HandlerExceptionResolver HandlerExceptionResolver接口的实现类有&#xff1a;DefaultHandlerExceptionResolver和SimpleMappingExceptionResolver SpringMVC提供了自定…

【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;阐述了市场中各技术服务提供商的服务方案和优势。 美创…