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

news2025/3/10 18:32:39

名字解读

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

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

从节点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无需创建,它的值取决于它前面距离最近的数据值,如果将简单的对话改为传感器,也是一样的道理。

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

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

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

相关文章

LeetCode刷题---反转链表

个人主页:元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏:http://t.csdnimg.cn/ZxuNL http://t.csdnimg.cn/c9twt 前言:这个专栏主要讲述递归递归、搜索与回溯算法,所以下面题目主要也是这些算法做的 我讲述…

Linux 基础认识

文章目录 前言Linux历史window历史Linux地位发行版本 前言 建议只看概述 Linux历史 概述: 由一个研究生受Minix操作系统启发编写的,因为功能实用,代码开源被世界人接收和开发 ,最终正式发布 。 详情: 1991年10月5日…

JavaSE学习路线及经验所谈

前言 一.学习框架二.学习经验 相信很多小白刚开始学习Java时,都是靠自己在网上搜集资料,并没有明确规划,不知道要学习什么内容,也不知道学习的重点是什么,那么这篇文章会给你一个大致的指引,当然也可以作为…

Apache Doris 详细教程(二)

5、doris的查询语法 5.1、doris查询语法整体结构 SELECT [ALL | DISTINCT | DISTINCTROW ] -- 对查询字段的结果是否需要去重,还是全部保留等参数 select_expr [, select_expr ...] -- select的查询字段 [FROM table_references [PARTITION…

Project 1: The Game of Hog(CS61A)

(第一阶段)问题 5a(3 分) 实现该函数,该函数模拟了完整的 Hog 游戏。球员 交替轮流掷骰子,直到其中一名玩家达到分数。playgoal 您现在可以忽略 Feral Hogs 规则和论点; 您将在问题 5b 中实现它。feral_h…

微信小程序:调用 摄像头、选择照片或视频 都没反应 / wx.chooseImage 选择上传图片无反应

一、问题描述 微信小程序 调用 摄像头、选中的照片或视频,都没反应 wx.chooseImage 选择上传图片无反应 二、问题解决 2.1、设置 登录后台关联,点“设置” 2.2、服务内容声明 服务内容声明,用户隐私保护指引,更新 2.3、添加…

React立即更新DOM

正常情况下,react会等待set完毕后再进行页面渲染,所以在set时无法拿到更新后的dom import { useRef, useState } from "react"export default () > {const div useRef(null)const [count, setCount] useState(0)const btnClick () >…

手写实现一个动态代理框架

手写实现一个动态代理框架 什么是代理模式什么是动态代理动态代理中的编译、类加载与对象实例化手写实现一个动态代理框架实现细节DynamicProxyHandlerProxy生成代码写入代码到磁盘文件调用编译器进行编译调用类加载器进行类加载反射实例化删除前面生成的java文件和class文件 C…

LeetCode - 100. 相同的树 (C语言,二叉树,配图,简单)

利用分治思想,将大问题化解成为小问题,我们只需要比较: 1. 根节点的同时为空/不为空,不为空时值相等。 2. 左子树是否一样。 3. 右子树是否一样。 可以看出,这道题非常简单,但是为什么我们还要将它呢&#…

Linux 上的容器技术

容器实现封闭的环境主要要靠两种技术,一种是看起来是隔离的技术,称为 namespace(命名空间)。在每个 namespace 中的应用看到的,都是不同的 IP 地址、用户空间、进程 ID 等。另一种是用起来是隔离的技术,称为…

【系统运维】Centos部署Haproxy+Keepalived+RabbitMQ高可用集群

1.RabbitMQ高可用集群方案 (1)RabbitMQ搭建集群的作用:提高可用性、可靠性和处理能力,确保系统提供高效的消息传递服务 高可用性:通过集群,即使其中一个节点发生故障,其他节点仍然可以继续提供…

Elasticsearch:什么是向量数据库?

向量数据库定义 向量数据库是将信息存储为向量的数据库,向量是数据对象的数值表示,也称为向量嵌入。 它利用这些向量嵌入的强大功能来对非结构化数据和半结构化数据(例如图像、文本或传感器数据)的海量数据集进行索引和搜索。 向…

简明指南:使用Kotlin和Fuel库构建JD.com爬虫

概述 爬虫,作为一种自动化从网络上抓取数据的程序,广泛应用于数据分析、信息提取以及竞争对手监控等领域。不同的实现方式和编程语言都能构建出高效的爬虫工具。在本文中,我们将深入介绍如何充分利用Kotlin和Fuel库,构建一个简单…

Autosar COM通信PDU

文章目录 Autosar 中各个PDU所在示意图PDU的分类PDU 和 SDU 的关系I-PDUN-PDUL-PDU相关协议其他参考 Autosar 中各个PDU所在示意图 PDU的分类 在Autosar 中,主要有 I-PDU、N-PDU和 L-PDU 三种。 L-PDU:Data Link Layer PDU,数据链路层PDUN-…

Qt/QML编程学习之心得:如何添加资源文件到QML工程(十一)

Qt作为一种GUI界面编辑工具,在嵌入式编程中也大受欢迎,而进一步QML出现了,QML我理解也是一种资源文件,因为像其他资源文件一样添加进工程的。那么一个图片如何增加进资源文件呢?这个的确很基础,就是把资源文…

JavaEE 多线程

JavaEE 多线程 文章目录 JavaEE 多线程引子多线程1. 特性2. Thread类2.1 概念2.2 Thread的常见构造方法2.3 Thread的几个常见属性2.4 启动一个线程2.5 中断一个线程2.6 等待一个线程2.7 获取当前线程引用2.8 休眠当前线程 3. 线程状态 引子 当进入多线程这一块内容时&#xff…

Redis中分布式锁的使用

在分布式系统中,如果使用JVM中的同步锁在高并发的场景下仍然会产生线程安全问题。首先我们来查看在多个服务器时为什么会产生线程安全问题,有这样一个案例,有一件商品购买规则为一个用户只能购买一次,如果使用同步锁锁住用户id&am…

vue3中自定义hook函数

使用Vue3的组合API封装的可复用的功能函数 自定义hook的作用类似于vue2中的mixin技术 自定义Hook的优势: 很清楚复用功能代码的来源, 更清楚易懂 案例: 收集用户鼠标点击的页面坐标 hooks/useMousePosition.ts文件代码: import { ref, onMounted, onUnmounted …

【读书笔记】微习惯

周日晚上尝试速读一本书《微习惯》,共七章看了下目录结构并不复杂,计划每章7-8分钟读完, 从20:15-21:00。读的时候,订下闹钟,催促着自己的进度。边读边记了一些要点和微信读书里面的划线。 第六章实践内容最为丰富&…

1949-2021年全国31省铁路里程数据

1949-2021年全国31省铁路里程数据 1、时间:1949-2021年 2、指标:时间、省份、铁路里程 3、范围:包括31省 4、数据缺失情况说明:西藏2005年之前存在缺失,其余30省份1978-2020年无缺失 5、来源:各省统计…