博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
扫地机器人的模拟程序 (1)
阅读量:5733 次
发布时间:2019-06-18

本文共 1538 字,大约阅读时间需要 5 分钟。

前言

在朋友的推荐下,尝试写一个模拟的扫地机器人的程序,当做是练习(工程能力和算法)

写这篇文章一是记录和分享思路,也希望获得更多意见和建议,欢迎评论

效果

本来是打算最后再贴图的,文章没啥人气,加上感冒

偷个懒就先贴个图吧(不知道为什么没办法直接贴图片,只好贴链接了)

思路

想了下大概应该有下面几个模块

  1. 主模块,负责调用其他模块
  2. 地图模块,负责处理地图,比如导入外部的地图文件并转换成方便处理的格式
  3. 感知模块,负责感知当前所在位置的周围是否可通行
  4. 动作模块,负责“走动”,出于解耦的考虑,这里的动作只有最基本的走路动作,不包含寻路逻辑
  5. 寻路模块,负责调用感知模块和动作模块,做一些复杂动作,比如U形走法(听上去有点中二,先这么叫着)和最短路径走法(到最近的未清洁点)
  6. 显示模块,负责把机器人走过的路径显示出来,形式上最好是独立于程序的存在,比如gif文件

在准备写复杂模块前,首先把地图模块给写出来吧,这篇文章就专注于这个模块

地图模块

首先思考,外部的地图文件要便于创建(手工绘制),查看和被导入,于是便想到csv

1 . 在Excel中“画图”

画一个10*10的地图,其中一个格子代表一个区域,每个格子的面积先假设是0.5m*0.5m好了

可通行区域是'.',不可通行区域是'#',保存成csv
图片描述

2 . 通过官方的csv库来读取文件

代码如下:

import csvfile = 'E:\\扫地机器人\\map_1.csv'map = []with open(file, newline='') as csv_file:    f = csv.reader(csv_file)    for row in f:        map.append(row)

这样我们得到一个map列表

[['.', '.', '.', '.', '.', '.', '.', '.', '.', '.'], .....]
其内容还是列表,每个列表代表地图中的一行,顺序是从上到下

3 . 给地图上的点/格子“编号”

虽然地图上的点可以通过map[x][y]来获得,但这么做似乎不优雅,不妨就用坐标点的形式,即(x,y)的方式来描述这些格子吧,于是:

coordinate_list = []impassable_coordinate_list = []for x in range(len(map)):    for y in range(len(map[x])):        coordinate_list.append((y, x))        if map[x][y] == '#':            reverse_x, reverse_y = y, len(map) - x - 1            impassable_coordinate_list.append((reverse_x, reverse_y))

我们把所有的格子转成坐标点的形式放到coordinate_list

同时把不能通行的格子记录到impassable_coordinate_list
前者: [(0, 0), (1, 0), (2, 0),....]
后者: [(1, 8), (1, 7), (2, 4), (2, 3)]
要注意的是这里的(0,0)代表的是最左下角的那个点/格子
map模块就此告一段落

PS: 可能有读者感到奇怪,既然已经有地图了,根据所在位置和地图就知道周围的情况了,为何还要感知模块,我解释一下

我的想法是先让机器人根据完善的地图来实现部分功能,然后再逐步改善,先让感知模块根据地图来“感知”
按理说,地图模块应该要根据感知模块的反馈来不断更新的

转载地址:http://tymwx.baihongyu.com/

你可能感兴趣的文章
Unity中小地图做法
查看>>
Flash AS 响应双击事件MouseEvent.DOUBLE_CLICK
查看>>
jQ函数after、append、appendTo的区别
查看>>
硬件负载均衡设备介绍
查看>>
linux如何查看CPU,内存,机器型号,网卡信息
查看>>
Bogart gData.vb
查看>>
Linux 学习手记(4):Linux系统常用Shell命令
查看>>
最优二分检索树
查看>>
第四章 标签页
查看>>
python批量导出导入MySQL用户的方法
查看>>
关于SVN 目录结构
查看>>
struts2:数据校验,通过Action中的validate()方法实现校验,图解
查看>>
2013年第48周三开发日记
查看>>
图文介绍如何在Eclipse统计代码行数
查看>>
【技术贴】解决Mysql ERROR 1045 (28000): Access denied for
查看>>
Windows Phone开发(39):漫谈关键帧动画上篇
查看>>
Qt5 新特性
查看>>
ubuntu 实现界面切换
查看>>
[物理学与PDEs]第3章习题4 理想磁流体的能量守恒方程
查看>>
linux 性能分析常规逻辑和手段总结
查看>>