viple模拟器使用(四):unity模拟器中实现两距离局部最优迷宫算法

2023-12-04 01:28

本文主要是介绍viple模拟器使用(四):unity模拟器中实现两距离局部最优迷宫算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

名字解读

两距离:指的是左侧距离和右侧距离

局部最优:对当前状态来说最好的选择,至于整体能不能达到最优,是无法确定的。

从节点1到节点5,一共有3条路

第1条路线:1→2→4→5,对应的花销是:2+3+4=9;

第2条路线:1→3→4→5,对应的花销是:1+5+4=10;

第3条路线:1→3→5,对应的花销是:1+6=7;

所以,可以看出,花销最少的是第3条路线,对应的花销是7,即:该路线是最佳路线,开销最小。

最佳路径(花销最小)

如果采用的是贪心策略来实现从顶点1到顶点5。当站在顶点1的时候,看到前面有两条路,分别是去顶点2和去顶点3,对应的开销分别是2和1,此时,认为去3开销小,于是选择下一步走到顶点3。

同样的道理,当来到顶点3后,面前也有两条路,去顶点4和顶点5,分别对应的开销是5和6,此时会认为去顶点4开销小,所以下一个顶点去顶点4

由于顶点4到顶点5,只有一条路,所以就直接选择该条路径即可。

所以最终选择的路线是:1→3→4→5对应的开销是1+5+4=10

贪心策略路径(可能和最佳路径一致,也可以不一致)

从该案例中可以看出,贪心策略是一种局部最优,也就是说,每一步的选择,都是根据当前拥有的资源选择对自己来说最好的选择,至于整体是否最优,有可能是,有可能不是。

综上所述,两距离局部最优迷宫算法,也就是一种贪心策略,可能最终也会走出迷宫(要根据迷宫的形状才能确定是否能走出迷宫),走的路径按照原理给定的策略进行选择,整体路径不一定是最短的路径。所以调整参数的时候,能使得机器人使用该策略走出迷宫且行走路径不要出现转圈等增加行走路径的值则为比较恰当的参数。

观察现象

两距离局部最优迷宫算法

注意:右转完成后,进行了测量。然后本视频中显示的是右转180度,应该是左转180度,制作PPT的能力有待提高,后期有时间进行更新。

总结出原理

  1. 初始化为直行状态,当前侧检测到前方有障碍物时,机器人右转90度;
  2. 右转完成后,进行测量。测量出来的值赋值给变量,用来保存右侧距离;
  3. 测量结束后,左转180度,再次进行测量,此时,测量出来的值对应的是左侧距离;
  4. 如果左侧距离大于等于右侧距离,则表示左侧更加宽敞,应该往左侧走,由于车头此时已经在左侧,所以只需要直行即可;
  5. 如果左侧距离小于右侧距离,则表示右侧更加宽敞,应该往右侧走,由于车头此时在左侧,所以需要右转180度,使得车头朝右,再直行。

有限状态机

回答几个问题再考虑如何写程序

1、为什么刚开始运行是直行前进?

答:使用前方的距离传感器进行测量,测量值大于等于设定的危险值,此时机器人认为前方有路,所以直行。

2、 为什么机器人会右转90度?

答:使用前方的距离传感器进行测量,测量值小于设定的危险值,此时机器人认为前方无路,所以进行转弯,此时,机器人想要测右侧距离,由于只有前方才有距离传感器,所以,将机器人朝向先调整到右侧,再进行测量,所以右转90度。【右转90度,就是为了使用前方的距离传感器测量右侧距离,所以才会右转90度】

3、为什么右转90度后,测量完右侧距离,然后左转180度?

答:机器人想要测左侧距离,但是由于上一步骤后,机器人朝向是右侧,所以,需要先将朝向调整到左侧,再进行测量,由于从朝右改为朝左,可以左转180,也可以右转180度,所以没有特别要求非要从那边,建议选择左转180度。

4、两边都测量完了后,再进行比较,判断哪边更宽敞,就往那边走。情况就有两种:

1)如果左边≥右边,接下来直行(这是因为第三步过后,机器人已经朝左,此时选择直行,实际上就是往左边走了)

2)如果左边<右边,接下来右转180度,然后再直行(这里因为第三步选择左转180度,现在想要把机器人的朝向改到右边,就右转180度进行恢复。第三步“建议选择左转180度”,实际上的目的就是想要在恢复的时候,选择右转180度,机器人看起来有点探测路的感觉)

总结:该算法策略,只使用了一个传感器,是前方的距离传感器。

算法实现

unity线控模拟中,已经发现一个规律,想要机器人运行,使用的是移动动力控制和转动角度控制。现在加入算法后,模拟器环境没有改变,所以,主机配置应该和线控模拟是一致的,其次,想要让机器人动起来,还得是移动动力控制和转动角度控制。

接下来进行一种参考程序编写方法

前进自定义活动:做两件事,分别是:机器人前进以及前进状态的记录(由于没有设置定时器,先记录状态还是先运动,都可以,如果希望并行,还可以设置为两条工作流也行)

右转90度自定义活动:做一件事,右转,由于右转需要时间,所以不仅要右转,还要给一定的时长

左转180度自定义活动:主要做左转工作,和右转一样,都需要一定的时间,需要注意的是:左转是逆时针运动,所以,角度的符号为负数。

右转180度和左转180度相似,只需要将参数值符号改为正数即可,暂停和前进类似,只需要将驱动功率值设置为0即可。

Main程序

第一个条件,表达的是直行过程中,发现前方无路,进行右转;第二个条件,表达的是右转完成后,进行测距,此时测出来的距离是右侧距离,然后进行左转180度。第三个条件表达的是左转完成后,进行测距,此时测出来的是左侧距离,只需要判断左侧距离和右侧距离的关系,即可做出后续往那边走的动作即可。

效果展示

后记:理解原理,对整个运行过程很熟悉,编程实现,并进行参数调整,观察运行效果是否正确即可,当然,如果非常用心做,应该把参数调整到接近于整体最优的效果最佳。

unity模拟器实验两距离局部最优迷宫算法效果

注意:需要对状态进行锁定,状态改变,要及时更新新状态,再做动作。

可能出现的问题:

1、没有进行状态锁定,导致转弯的时候,还在判断前方是否有障碍物

2、设置的时间不合理,例如:右转90度还没有完成动作,就进行测量右侧距离;同样的道理,左转180度还没有完成,就开始测量左边的距离,这也是不对的。其次,右转180度进行恢复的时候,还没有恢复到右侧,就开始前进,也是不合理的,这些问题都是因为设置完成动作的时间不合理造成的。

3、机器人刚运行的时候就开始右转90度,说明符合了右转90度的条件,状态是直行测量值小于设定值,如果想要机器人刚开始能够直行,就要破坏右转条件,状态是无法改变了,那就只剩下测量值小于设定值,测量值来自传感器,传感器中的值只能读取,不能修改,所以,只能修改设定值,此时,应该将设定值改小一些,从而来使得测量值大于等于设定值,认为前方有路,才能直行,就防止了右转。

4、value乱用问题。【技巧:如果自己写的程序,不清楚value代表的时候,就打印出来看看】

value无需创建,直接使用,本案例中,只有一个变量i,用户创建的,value表示前面i对应的值,由于i的值是张三,所以打印结果是张三。

同样的道理,value也是无需创建,那value现在的值和前面的数据活动的值是一致的。

根据前两个案例,再进行更改

此时,value的值和警示对话框的警示内容是一致的

可以猜测,value无需创建,它的值和前面最近的活动的值是一致的。此时value值和定时器前面的数据活动是一致的。

如果把定时器删了,再进行测试

发现,value的值,距离最近的是j的值,所以打印的是李四。

所以,得出一个结论:value无需创建,它的值取决于它前面距离最近的数据值,如果将简单的对话改为传感器,也是一样的道理。

技巧:将传感器中的值打印出来,看着测量值进行设定参数,就更容易找到比较合适的参数。

这篇关于viple模拟器使用(四):unity模拟器中实现两距离局部最优迷宫算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/451596

相关文章

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买