掃地機器人的模擬程序 (1)

前言

在朋友的推薦下,嘗試寫一個模擬的掃地機器人的程序,當作是練習(工程能力和算法)
寫這篇文章一是記錄和分享思路,也但願得到更多意見和建議,歡迎評論算法

效果

原本是打算最後再貼圖的,文章沒啥人氣,加上感冒
偷個懶就先貼個圖吧(不知道爲何沒辦法直接貼圖片,只好貼連接了)
https://wx1.sinaimg.cn/mw1024...
https://wx4.sinaimg.cn/mw1024...app

思路

想了下大概應該有下面幾個模塊spa

  1. 主模塊,負責調用其餘模塊
  2. 地圖模塊,負責處理地圖,好比導入外部的地圖文件並轉換成方便處理的格式
  3. 感知模塊,負責感知當前所在位置的周圍是否可通行
  4. 動做模塊,負責「走動」,出於解耦的考慮,這裏的動做只有最基本的走路動做,不包含尋路邏輯
  5. 尋路模塊,負責調用感知模塊和動做模塊,作一些複雜動做,好比U形走法(聽上去有點中二,先這麼叫着)和最短路徑走法(到最近的未清潔點)
  6. 顯示模塊,負責把機器人走過的路徑顯示出來,形式上最好是獨立於程序的存在,好比gif文件

在準備寫複雜模塊前,首先把地圖模塊給寫出來吧,這篇文章就專一於這個模塊code

地圖模塊

首先思考,外部的地圖文件要便於建立(手工繪製),查看和被導入,因而便想到csv圖片

1 . 在Excel中「畫圖」

畫一個10*10的地圖,其中一個格子表明一個區域,每一個格子的面積先假設是0.5m*0.5m好了
可通行區域是'.',不可通行區域是'#',保存成csv
圖片描述get

2 . 經過官方的csv庫來讀取文件

代碼以下: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

3 . 給地圖上的點/格子「編號」

雖然地圖上的點能夠經過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: 可能有讀者感到奇怪,既然已經有地圖了,根據所在位置和地圖就知道周圍的狀況了,爲什麼還要感知模塊,我解釋一下個人想法是先讓機器人根據完善的地圖來實現部分功能,而後再逐步改善,先讓感知模塊根據地圖來「感知」按理說,地圖模塊應該要根據感知模塊的反饋來不斷更新的

相關文章
相關標籤/搜索