资讯专栏INFORMATION COLUMN

扫地机器人的模拟程序 (3)

ccj659 / 3466人阅读

摘要:话说我的地图就是栅格形式用点坐标来表示格子模板模型法很容易理解,就是有几种走法,按情况调用。

寻路模块 (1)

终于要挑战寻路模块,虽然我是在重复造轮子,但看一下别人的轮子怎么造也是很重要的,所以
在这之前首先搜索下,看看有什么现成的思路和代码,收获如下:

两种寻路逻辑

有两种寻路逻辑, 随机碰撞和路径规划,考虑到:

a. 随机碰撞似乎需要不少经验/实验数据才能达到不错的效果,我缺经验/数据呢
b. 现在我拥有一个接近于理想环境的情况,更便于路径规划
c. 随机碰撞得到的路径不漂亮,搞不好还漏了边边角角,不符合我的美学价值观

所以决定用路径规划

一些路径规划的方法

这篇文章介绍了一些路径规划的方法

a. 人工智能:本来是想用办法来做的,毕竟算是用过matlab的人(但忘光光了),但后来发现学习成本有点高,就放弃了……
b. 人工势场法:看上去也不简单,也放弃……
c. 栅格法:说明了地图形态(含障碍物),但并没有说明具体走法,有些怀疑小编或者作者的逻辑能力。话说我的地图就是栅格形式(用点/坐标来表示格子)
d. 模板模型法:很容易理解,就是有几种走法,按情况调用。就决定用这个办法了
决定算法

按上面模板模型法的思路,去搜关键字(Complete coverage path planning等),看了2篇论文和一些科普文章
这篇文章引起了我的注意,这篇论文说的是基于A*算法来实现完全路径覆盖,里面还有两个走法,分别是U-turn Search和 Internal Spiral Search,形象地说就是U型走法和回形走法
从文章结论看,U型走法配合A*算法的效果似乎不错(重复率低),那么我也按这个办法来吧
具体来说就是U型走法清扫一次,然后通过A*算法走到最近的未清洁点,如此反复直到所有点都被清洁/走过
虽然这不是全局最优解,但还是先以实现为目标努力吧

实现算法 (U型走法)

A*算法稍微有些复杂,之后再开篇文章写,我先写U型走法的部分,思路:

需要两个U型走法,一个朝右,一个朝左,除了朝左右不同之外其他相同

以U型朝右走法为例,先尝试往上下移动,“碰墙”后朝右移动一格,然后掉头,如此反复直到无法往右

由于U型走法具有反复的特性,如果发现下一步要走的点/格子已经走过了,就要停下来

path_finding代码1,先写上面3里提到的判断方法
篇幅起见,我这里只写一个判断上方格子是否走过的方法:

def judge_up_passed(self):
    x, y = self.current_coordinate
    up_coordinate = (x, y + 1)
    if up_coordinate in self.path_log:
        return True
    else:
        return False

path_finding代码2,U型朝右走法:

def u_turn_toward_right(self):
    rollback = False
    while True:
        if (self.judge_up_passable() == False) and (self.judge_down_passable() == False) and (
            self.judge_right_passable() == True):
            self.move_right()

        if rollback == False:
            while self.judge_up_passable() == True and self.judge_up_passed() == False:
                self.move_up()
            if self.judge_right_passable() == True and self.judge_right_passed() == False:
                self.move_right()
                rollback = True
            else:
                rollback = True

        if rollback == True:
            while self.judge_down_passable() == True and self.judge_down_passed() == False:
                self.move_down()
            if self.judge_right_passable() == True and self.judge_right_passed() == False:
                self.move_right()
                rollback = False
            else:
                rollback = False
                break

之后在main中添加方法

    from path_finding import *
    Robot.u_turn_toward_right = u_turn_toward_right
    Robot.u_turn_toward_left = u_turn_toward_left
    Robot.judge_up_passed = judge_up_passed
    Robot.judge_down_passed = judge_down_passed
    Robot.judge_left_passed = judge_left_passed
    Robot.judge_right_passed = judge_right_passed
测试

接着看一下写的U型走法效果如何,在main中测一下

...
    robot.u_turn_toward_right()
    print(robot.path_log)
    print(len(robot.path_log))

然后自己按着path_log看一下U型走得如何,按第一篇文章中的地图,没有意外的话,应该是82步

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41293.html

相关文章

  • 扫地器人模拟程序 (1)

    摘要:前言在朋友的推荐下,尝试写一个模拟的扫地机器人的程序,当做是练习工程能力和算法写这篇文章一是记录和分享思路,也希望获得更多意见和建议,欢迎评论效果本来是打算最后再贴图的,文章没啥人气,加上感冒偷个懒就先贴个图吧不知道为什么没办法直接贴图片, 前言 在朋友的推荐下,尝试写一个模拟的扫地机器人的程序,当做是练习(工程能力和算法)写这篇文章一是记录和分享思路,也希望获得更多意见和建议,欢迎评...

    tanglijun 评论0 收藏0
  • 扫地器人模拟程序 (2)

    摘要:上一篇文章中介绍了地图模块,接着来看主模块和动作模块主模块思路主模块由一个类构成,其调用各子模块,且其属性可用于保存信息这些信息,除了之前地图模块中的和之外,还包括初始坐标现所在坐标移动路径代码动作模块思路所谓移动,在模拟程序里就是更新现所 上一篇文章中介绍了地图模块,接着来看主模块和动作模块 主模块 思路:主模块由一个Robot类构成,其调用各子模块,且其属性可用于保存信息这些信息,...

    stormgens 评论0 收藏0
  • 扫地器人模拟程序 (4)

    摘要:寻路模块通过一番寻找,发现这系列文章,其不仅包含算法,连寻路算法中的一些基础知识也一并介绍了,不愧是斯坦福出品,也很感谢译者要实现点到点最短路径,还需要做一些微小的工作,下面逐个说明计算曼哈顿距离的函数目的是寻路,肯定需要一个方法来估算两点 寻路模块 (2) 通过一番寻找,发现这系列文章,其不仅包含A*算法,连寻路算法中的一些基础知识也一并介绍了,不愧是斯坦福出品,也很感谢译者要实现点...

    thekingisalwaysluc 评论0 收藏0
  • 自动化会提高测试覆盖率,那测试覆盖率是什么?

    摘要:测试覆盖率有什么优势依然是以打扫房屋为例,测试覆盖率可以度量打扫的质量指示何时该停止打扫提醒我们还有其他地方需要清理。至此,我们可以得出结论测试自动化更高的测试覆盖率。 ...

    lyning 评论0 收藏0
  • 人工智能商业化全面解析,内含趋势解读

    摘要:在全球智能新商业峰会上,亿欧公司发布中国人工智能商业落地强榜单与研究报告。一定程度上,该榜单反映了人工智能在中国各细分领域的商业化程度。 人工智能商业化是什么意思?它和商业智能有怎样的联系?本文从概念、重大发展事件、发展趋势这几个方面全面解读人工智能商业化。 121 一、概念人工智能商业化,是指人工智能走向商业化的历程,即人工智能实现商业场景的应用。人工智能的商业化进程正一步步通过各种...

    Amos 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<