在朋友的推薦下,嘗試寫一個模擬的掃地機器人的程序,當作是練習(工程能力和算法)
寫這篇文章一是記錄和分享思路,也但願得到更多意見和建議,歡迎評論算法
原本是打算最後再貼圖的,文章沒啥人氣,加上感冒
偷個懶就先貼個圖吧(不知道爲何沒辦法直接貼圖片,只好貼連接了)
https://wx1.sinaimg.cn/mw1024...
https://wx4.sinaimg.cn/mw1024...app
想了下大概應該有下面幾個模塊spa
在準備寫複雜模塊前,首先把地圖模塊給寫出來吧,這篇文章就專一於這個模塊code
首先思考,外部的地圖文件要便於建立(手工繪製),查看和被導入,因而便想到csv圖片
畫一個10*10的地圖,其中一個格子表明一個區域,每一個格子的面積先假設是0.5m*0.5m好了
可通行區域是'.',不可通行區域是'#',保存成csvget
代碼以下:it
import csv file = '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列表
[['.', '.', '.', '.', '.', '.', '.', '.', '.', '.'], .....]
其內容仍是列表,每一個列表表明地圖中的一行,順序是從上到下class
雖然地圖上的點能夠經過map[x][y]來得到,但這麼作彷佛不優雅,不妨就用座標點的形式,即(x,y)的方式來描述這些格子吧,因而:import
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模塊就此告一段落file
PS: 可能有讀者感到奇怪,既然已經有地圖了,根據所在位置和地圖就知道周圍的狀況了,爲什麼還要感知模塊,我解釋一下個人想法是先讓機器人根據完善的地圖來實現部分功能,而後再逐步改善,先讓感知模塊根據地圖來「感知」按理說,地圖模塊應該要根據感知模塊的反饋來不斷更新的