用51单片机做的小车如何实现小车走迷宫
答案:4 悬赏:60 手机版
解决时间 2021-02-23 03:50
- 提问者网友:寂寞梧桐
- 2021-02-22 04:06
就是有一定的记忆功能,就是整个迷宫都走完了,然后自己知道了迷宫的结构,然后计算出最佳正确路线,走出去!我想问这个用编程如何实现?主要是程序的设计思路,比如算法!程序的实现方法! 不用考虑程序大了,内存不够,我扩充!
最佳答案
- 五星知识达人网友:山有枢
- 2021-02-22 05:26
硬件电路我就不说了,主要说说算法.
1. 先从一种比较简单的迷宫说起,我称之为"二叉树"迷宫,即每个节点上最多连接三条支路,换句话 说,就是当你面对岔路时,你最多只有三个选择,要么左转,要么右转,要么回头.
假如,我们将左转编码为0,右转编码为1,则迷宫的从入口到出口的路径为一串二进制编码.对于最短路径,我们可以让机器人多走几次迷宫,得到一系列二进制串,位数最少的即为"局部最短路径".我们还可以通过这些二进制串,得到迷宫"局部拓扑结构",一种二叉树结构.
注意,在上面的结果上我都加有"局部"两字,这是因为机器人走迷宫的次数如果不够多,或则说少于迷宫的总路径数,我们得到结果都是不完整的,只有当机器人走迷宫的次数足够大,以致于走遍了迷宫所有的路径,这时我们才能得到完整的结果,然而这对于大多数迷宫来说都是不可实现的,也就是说,我们得到的结果都是局部的,最多是趋近于全局结果.
不知大家发现没有,上面还有一种情况我没有编码,那就是回退.这个问题处理起来比较复杂,因此不能仅仅用一位二进制码来表示,必须有专门的处理机制.
这个机制分为三个方面,
一是,每次只回退一步,即当前方无路可走时,回到上一个叉路口,选择另一条支路,程序上就是将当前二进制串减少一位,并将改变后的二进制串的最后一位取反,代表选另一条支路.
二是, 回退一步后,仍无路可走时,再回退一部,重复上述过程,直至有岔路可选.
三是,整个回退过程中,记录并保存每次回退的路径,即左右转向的二进制编码,一个回退过即既是由开始回退到开始前进的整段过程.保留这些二进制串,是因为可以通过他们反推得出迷宫的一些局部的拓扑结构
2. 熟悉上面"二叉树迷宫"后 ,对于一般迷宫通过如下方法设计
一、估计出迷宫最大的支路数,即一个叉路口最多有几条岔路,这里假设为a
二 、用a为二进制码对每一个岔路编码,例如我们可以按顺时针编码
三、 将a为二进制编码代替“二叉树迷宫 ”的一位二进制,其它步骤相仿即可。
当然,我们也可以用变长二进制码表示一次路径选择,不过这时得记录保存每次选则对应的二进制码的长度。
补充:
上面的算法,我说的都很笼统,但总体思路是明确的,即:以迷宫入口为根节点,每个叉路口为一个节点,每个岔路为一段树枝,每个树枝用一定位数的二进制码编码,以树形结构表示迷宫的拓扑结构,于是迷宫的通路可以表示为从树的根节点到某一叶节点的路径。
硬件电路上,主要有两个方面的设计:一是,前进河和回退两个状态的识别与转换;二是,岔路的识别与选择。
以上都是个人观点,思考并不周全,还望大家指正补充。
1. 先从一种比较简单的迷宫说起,我称之为"二叉树"迷宫,即每个节点上最多连接三条支路,换句话 说,就是当你面对岔路时,你最多只有三个选择,要么左转,要么右转,要么回头.
假如,我们将左转编码为0,右转编码为1,则迷宫的从入口到出口的路径为一串二进制编码.对于最短路径,我们可以让机器人多走几次迷宫,得到一系列二进制串,位数最少的即为"局部最短路径".我们还可以通过这些二进制串,得到迷宫"局部拓扑结构",一种二叉树结构.
注意,在上面的结果上我都加有"局部"两字,这是因为机器人走迷宫的次数如果不够多,或则说少于迷宫的总路径数,我们得到结果都是不完整的,只有当机器人走迷宫的次数足够大,以致于走遍了迷宫所有的路径,这时我们才能得到完整的结果,然而这对于大多数迷宫来说都是不可实现的,也就是说,我们得到的结果都是局部的,最多是趋近于全局结果.
不知大家发现没有,上面还有一种情况我没有编码,那就是回退.这个问题处理起来比较复杂,因此不能仅仅用一位二进制码来表示,必须有专门的处理机制.
这个机制分为三个方面,
一是,每次只回退一步,即当前方无路可走时,回到上一个叉路口,选择另一条支路,程序上就是将当前二进制串减少一位,并将改变后的二进制串的最后一位取反,代表选另一条支路.
二是, 回退一步后,仍无路可走时,再回退一部,重复上述过程,直至有岔路可选.
三是,整个回退过程中,记录并保存每次回退的路径,即左右转向的二进制编码,一个回退过即既是由开始回退到开始前进的整段过程.保留这些二进制串,是因为可以通过他们反推得出迷宫的一些局部的拓扑结构
2. 熟悉上面"二叉树迷宫"后 ,对于一般迷宫通过如下方法设计
一、估计出迷宫最大的支路数,即一个叉路口最多有几条岔路,这里假设为a
二 、用a为二进制码对每一个岔路编码,例如我们可以按顺时针编码
三、 将a为二进制编码代替“二叉树迷宫 ”的一位二进制,其它步骤相仿即可。
当然,我们也可以用变长二进制码表示一次路径选择,不过这时得记录保存每次选则对应的二进制码的长度。
补充:
上面的算法,我说的都很笼统,但总体思路是明确的,即:以迷宫入口为根节点,每个叉路口为一个节点,每个岔路为一段树枝,每个树枝用一定位数的二进制码编码,以树形结构表示迷宫的拓扑结构,于是迷宫的通路可以表示为从树的根节点到某一叶节点的路径。
硬件电路上,主要有两个方面的设计:一是,前进河和回退两个状态的识别与转换;二是,岔路的识别与选择。
以上都是个人观点,思考并不周全,还望大家指正补充。
全部回答
- 1楼网友:酒安江南
- 2021-02-22 09:13
需要运放,51单片机,c语言,红外对管等知识,红外对管检测黑线与非黑线区域的电压不一样,经过运放做的比较器比较成ttl电平,通过51单片机识别并作出相应的反应。不过这是颜色检测的,当然我们还做过电磁检测的,可能会复杂一些。
- 2楼网友:动情书生
- 2021-02-22 07:51
安装两路红外检测系统,两路系统同时对行走路线的记号检测对比,如果没有偏差,不会产生偏差电流,小车正常前走,如果通过对比计算有偏差电流,就会自动校正方向,你按这个思路设计即可。
- 3楼网友:骨子里都是戏
- 2021-02-22 07:01
2楼的同学只是解决了小车直行的问题
并没有解决小车如何去记忆迷宫结构以及路径算法
作为迷宫来讲
如何分辨岔路和选择进入不同的通道比较困难
我的思路是
在小车两侧安装两个长臂微动开关
设计迷宫时迷宫通道的宽窄压缩两个开关
当路过岔路时开关弹开就可以判断出岔路的位置
(这是廉价的解决方式 可以做成红外测距更好)
这样在小车行进过程中会将途径的所有岔路全部记录
然后逐条道路搜索 程序始终记录从原点开始的路径长度
重复走过的路线长度做减运算 直至小车走出迷宫
需要考虑的东西较多 做的过程中慢慢摸索吧
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯