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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux dig指令的十三种用法

文章目录 dig指令有哪些作用dig 具体用法推荐阅读 dig指令有哪些作用 DIG命令(Domain Information Groper命令)是一个网络工具,具有基本的命令行接口,用于进行不同的DNS(域名系统)查询。您可以使用DIG命令: 诊断您的域名服务器。检查所有这些服务器或每…

OpenWrt作为旁路由(网关)配置

目录 背景前提条件环境操作步骤物理层连接设置与主路由同一网段禁用IPv6取消LAN接口桥接防火墙配置 背景 本文简介如何配置OpenWrt,使其作为旁路由(网关)运行。 旁路由大概有以下这几种工作方式: 主路由开DHCP,网关未…

行为型剩余的模式

1.中介者模式 package com.jmj.pattern.mediator;public abstract class Mediator {public abstract void constact(String message,Person person); }package com.jmj.pattern.mediator;public class MediatorStructure extends Mediator{private HouseOwner houseOwner;priva…

Linux:dockerfile编写搭建nginx练习(8)

dockerfile是创建镜像的一种,通过已有镜像的基础上再在上面部署一些别的。 在这个基础镜像上搭建,我这个是一个空的centos镜像 我这里用http的yum仓库存放了nginx和rpm包 创建dockerfile vim Dockerfile写入#设置基础镜像 FROM centos#维护该镜像的用户…

C++ string类(1)—初始化、容量操作、迭代器

目录 前言 一、string类 二、初始化 1、无参或带参 2、用字符串变量初始化 3、用字符串初始化 4、指定数量字符 三、容量操作 1、size 2、push_back 3、append​编辑 4、运算符 5、reserve 6、resize 四、迭代器 1、正向迭代器 2、反向迭代器 3、const迭代器…

强化学习简明教程

到目前为止,我们主要关注监督学习问题(主要是分类)。 在监督学习中,我们得到某种由输入/输出对组成的训练数据,目标是能够在学习模型后根据一些新输入来预测输出。 例如,我们之前研究过 MNIST 的卷积神经网…

64. 最小路径和(Leetcode)

文章目录 前言一、题目分析二、算法原理1.状态表示2.状态转移方程3.初始化4.填表顺序5.返回值是什么 三、代码实现总结 前言 在本文章中,我们将要详细介绍一下Leetcode6最小路径相关的内容 一、题目分析 二、算法原理 1.状态表示 列出dp表,dp[i][j]代…

wvp gb28181 pro 平台国标级连功能说明

国标28181不同平台之间支持两种连接方式,平级和上下级,WVP目前支持向上级级联。 测试环境 测试平台上级:192.168.10.209(Alam centos8) 测试平台下级:192.168.10.206(ky10_x86) 下级…

OSG编程指南:专栏内容介绍及目录

1、专栏介绍 OpenSceneGraph(OSG)场景图形系统是一个基于工业标准 OpenGL 的软件接口,它让程序员能够更加快速、便捷地创建高性能、跨平台的交互式图形程序。本专栏基于 OSG 3.6.5版本进行源码的编写及扩展,也通用于其他OSG版本的…

算法通关村第十三关-黄金挑战数论问题

计数质数 描述 : 给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。 题目 : LeetCode 204.计数质数 : 204. 计数质数 分析 : 解决这个题有一个有效的方法,叫埃氏筛 , 后来又产生了线性筛,奇数筛等改进的方法。 基本思想是如果 x是…

基于SSM的新闻网站浏览管理实现与设计

基于ssm的新闻网站浏览管理实现与设计 摘要:在大数据时代下,科技与技术日渐发达的时代,人们不再局限于只获取自己身边的信息,而是对全球信息获取量也日渐提高,网络正是打开这新世纪大门的钥匙。在传统方式下&#xff…

逸学java【初级菜鸟篇】12.网络通讯编程

hi,我是逸尘,一起学java吧 目标(任务驱动) 请练掌网络通讯的内容。 局域网和互联网 局域网英文:Local Area Network,缩写:LAN,是指一群通过一定形式连接起来的计算机,…

【并发编程】CopyOnWriteArrayList详解与原理

📫作者简介:小明Java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于…

Python函数的基本使用(一)

Python函数的基本使用(一) 一、函数概述二、函数的定义2.1 函数的语法2.2 语法说明2.3 函数定义的方式2.4 总结 三、函数的调用3.1 函数调用语法3.2 语法说明3.3 函数调用 四、函数的参数4.1 参数的分类4.2 必需参数4.3 默认值参数4.4 关键字参数4.5 不定…

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…

《微信小程序开发从入门到实战》学习四十

4.2 云开发JSON数据库 4.2.11 更新数据 使用数据库API更新数据有两种方法:一.将记录局部更新的update方法;二.以替换的方式更新记录的set方法 update方法可以局部更新一个记录或一个集合的多个记录,更新时只有指定字段更新,其他…

基于英特尔平台及OpenVINO2023工具套件优化文生图任务

当今,文生图技术在很多领域都得到了广泛的应用。这种技术可以将文本直接转换为逼真的图像,具有很高的实用性和应用前景。然而,由于文生成图任务通常需要大量的计算资源和时间,如何在英特尔平台上高效地完成这些计算是一个重要的挑…

Spring Cloud Alibaba简介

1、简介 Spring Cloud阿里(https://sca.aliyun.com/en-us/)为分布式应用开发提供一站式解决方案。它包含开发分布式应用程序所需的所有组件,使您可以轻松地使用Spring Cloud开发应用程序。 有了Spring Cloud阿里,你只需要添加一些注释和少量的配置&#…

32、直流电机驱动(PWM)

直流电机介绍 直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极,当电极正接时,电机正转,当电极反接时,电机反转 直流电机主要由永磁体(定子)、线圈(转子)和换向器…

[传智杯 #3 决赛] 面试

题目背景 disangan233 和 disangan333 去面试了,面试官给了一个问题,热心的你能帮帮他们吗? 题目描述 现在有 n 个服务器,服务器 i 最多能处理 ai​ 大小的数据。 接下来会有 k 条指令 bk​,指令 i 表示发送 bi​ …