คลิกด้านล่างเพื่อดูบทความทั้งหมด

แผนผังบล็อค

Solve Maze Robot แผนผังบล็อกทั้งหมด คลิกเพื่อดูส่วนที่ต้องการ >> Objectives Design >>>> Mechanics >>>>...

วันจันทร์ที่ 28 พฤศจิกายน พ.ศ. 2559

Explore Maze :: Python By Fuse

Explore Maze

(Python 2.7.1)

ขั้นแรกของการทำอัลกอริทึมเพื่อให้หุ่นของเราสามารถเคลื่อนที่ออกจากเขาวงกตได้เอง ต้องเริ่มจากการสำรวจแผนที่ก่อน ดังนั้นในบทความนี้เราจะมาอธิบายถึงอัลกอลิทึมที่ใช้ในการสำรวจแผนที่ดังนี้

  • Library
  • How to connect Arduino
  • GUI for Python
  • Communication with Low-Level
  • Algorithm for explore map
  • Explore to Solve 

Library

ไลบารี่สำคัญๆที่ใช้ในอัลกอลิทึมนี้ มีดังนี้
import turtle # for GUI
import time # for check time out
import serial # for connect by serial

How to connect Arduino

เราสามารถสื่อสารข้อมูลของคอมพิวเตอร์ กับ บอร์ด Arduino ได้หลายวิธี แต่เราเลือกใช้การสือสารผ่านทาง Bluetooth เพื่อทำให้ง่ายต่อการควบคุมระยะไกล
TURN_ON=True
if TURN_ON == True:    
ser = serial.Serial()
ser.baudrate = 9600
ser.port = '(Bluetooth name)' # change to your Bluetooh name    ser.open()

GUI for Python

เพื่อให้เราสามารถตรวจสอบความถูกต้องของโค้ด หรืออัลกอริทึมของเราได้ง่ายขึ้นเราจึงต้องอาศัยการสร้าง GUI เพื่อใช้ในการตรวจสอบซึ่ง Python เรานั้นก็มี GUI เช่นเดียวกันกับ C# หรือภาษาอื่นๆ โดยเราจะเลือกใช้ไลบรารี่ที่มีชื่อว่า 'turtle' (แนะนำให้ลองศึกษาคำสั่งต่างๆ ของไลบรารี่ก่อนใช้งาน)

Communication with Low-Level

เนื่องจากอัลกอลิทึมที่ใช้ในการคำนวณจะถูกคำนวณผ่านคอมพิวเตอร์ และส่งค่าที่ได้ผ่านทาง Bluetooth เราจึงจำเป็นต้องตกลงวิธีการ ส่ง-รับข้อมูล ระหว่าง Low-Level กับ High-Level ดังนี้


โดยที่ F or L or R มีความหมาย ดังนี้
F = Forward
L = Left (Turn Left only)
R = Right (Turn Right only)

Algorithm for explore map

อัลกอริทึมของเราคือจะให้หุ่นทำการสำรวจเส้นทางเดินโดยสนใจ ทิสเหนือ ทิศใต้ ทิศตะวันตก และทิศตะวันออกของแผนที่จำลองตามลำดับ และมีสัญลักษณ์สำคัญๆ ที่ใช้ในการสำรวจ ดังนี้

PART_of_PATH = 'O' # เส้นทางที่เคยสำรวจแล้ว
WAY = ' ' # เส้นทางที่ยังไม่เคยสำรวจ
OBSTACLE = '+' # กำแพง
TRIED = '.' # เส้นทางที่เคยสำรวจแล้ว
DEAD_END = '-' เส้นทางที่เคยสำรวจแล้วและเป็นทางตัน

ขั้นตอนการสำรวจ


  1. กำหนดขนาดของเขาวงกตมากสุดที่จะใช้ในการสำรวจทั้งความกว้าง และความยาวด้วยการสร้างไฟล์ text ตามรูป

    ++++++++++++++++++
    ++++++++++++++++++
    ++++++++++++++++++
    ++++++++++++++++++
    ++++++++++++++++++
    ++++++++++++++++++
    ++++++++++++++++++
    ++++++++++++++++++
    ++++++++++++++++++
    ++++++++++++++++++
    ++++++++++++++++++
    ++++++++++++++++++
    ++++++++++++++++++
    ++++++++++++++++++
    ++++++++S+++++++++
    ++++++++++++++++++
    ++++++++++++++++++
    ++++++++++++++++++

    โดยที่ S คือจุดเริ่มต้นของหุ่นยนต์ในแผนที่จำลอง และ "+" คือผนังจำลอง
    และให้ทิศเริ่มต้นจำลองของหุ่น เป็นทิศเหนือ
  2. เมื่อเริ่มทำการสำรวจหุ่นจะเริ่มจากการวัดเซนเซอร์จากผนังทั้งสามด้านคือ ด้านซ้าย ด้านบน และด้านขวา แผนที่ของเราจะถูกแทน OBSTACLE ด้วย WAY
  3. โดยหากทิศเหนือว่าง เราก็จะสั่งให้หุ่นยนต์ของเรานั้นเดินไปทางทิศเหนือ หรือทิศต่อไปตามลำดับที่ได้กำหนดไว้ แล้วจึงแทน WAY ด้วย TRIED ดังรูป
  4. กรณีที่หุ่นเจอทางตัน TRIED ในแผนที่จะถูกแทนที่ด้วย OBSTACLE เพื่อให้รู้ว่าทางนี้เป็นทางตัน จากนั้นโปรแกรมจะสั่งให้หุ่นยนต์หันหน้ากลับไป โดยส่ง "R R F" เพื่อให้หุ่นหันหน้ากลับไป และเคลื่อนที่ไปยังช่องที่เคยมา และเปลี่ยนทิศทางของหุ่นในโปรแกรมให้เป็นทิศทางตรงกันข้าม
  5. จากนั้นเมื่อหุ่นยนต์เคลื่อนที่ไปยังช่องที่ถูกเปลี่ยนเป็น OBSTACLE โปรแกรมจะทำการตรวจสอบว่าช่องข้างหน้านั้นเป็น TRIED หรือไม่ ถ้าใช้ก็จะสั่งให้หุ่นเลือกเดินไปยังจุดนั้นเป็นจุดต่อไป แล้วจึงเปลี่ยนทิศให้เป็นทิศปัจจุบันของหุ่น
  6. ทำขั้นตอนที่ 5 ซ้ำจนกระทั้งหุ่นเคลื่อนที่กลับมายังทางแยก
  7. ขั้นตอนต่อไปเป็นขั้นตอนที่ยากที่สุด เนื่องจากเราไม่สามารถเปลี่ยนจุดทางแยกให้เป็น OBSTACLE เราจึงจำเป็นต้องใช้อัลกอริทึมใหม่ในการหาเส้นทางถัดไป โดยให้เซนเซอร์วัดค่าที่ทางแยกจากทิศทางของหุ่นปัจจุบันอีกครั้ง (สังเกตุว่าหุ่นจะรับค่าเซนเซอร์ได้ไม่เหมือนกับครั้งแรกเนื่องจากทิศทางของหุ่นเปลี่ยนไป)

  8. เมื่อเราได้ค่าจากเซนเซอร์มา โปรแกรมเราจะทำการตรวจสอบเงื่อนไขต่างๆ เพื่อให้เคลื่อนที่ไปยังช่องที่ไม่ใช่ OBSTACLE และเป็น WAY (ยังไม่สำรวจ)
  9. จากนั้นจึงทำขั้นตอนที่ 2-8 จนกระทั่งเจอทางออก โดยเงื่อไขของการออกจากเขาวงกตมี
    2 กรณีดังนี้

      1. หุ่นบนต์เคลื่อนที่ออกจากขอบเขตที่เรากำหนดไว้
      2. เมื่อหุ่นยนต์เคลื่อนที่ไปแล้วตรวจวัดเซนเซอร์ได้เป็นช่องว่างทั้งสามทิศทางติดต่อกัน 3 ครั้ง      (เนื่องจากมีโอกาศน้อยที่จะเจอกรณีแบบนี้)
  10. หุ่นจะเดินตามจุด TRIED ที่กำหนดไว้ โดยระหว่างทางก็จะเปลี่ยน TRIED ให้เป็น PART_OF_PATH แล้วให้โปรแกรมบันทึกค่าพิกัดที่ได้ใส่ text file จนกระทั่งกลับมายังจุดเริ่มต้น

     . 

Explore to Solve

เนื่องจากค่าพิกัดที่บันทึกใน text file ถูกเก็บค่าพิกัดโดยบันทึกค่าเริ่มต้นจากทางออก มายังจุดเริ่มต้น ดังนั้นหากเราต้องการให้หุ่นสามารถเคลื่อนที่จากจุดเริ่มต้นไปยังจุดสุดท้าย เราจึงจำเป็นต้องแปลงไฟล์ text ที่ได้ก่อน โดยผมก็ได้สร้างโปรแกรมไว้แล้วและสามารถให้เพื่อนๆไปใช้กันได้ตามนี้

routhfile=open("map_find.txt","r")
temp=[]
for a in routhfile:    temp.append(a)

for i in range(len(temp)-1,-1,-1):    print temp[i]
    f = open('map_find_v2.txt', 'a')
    f.write(temp[i])

ตัวอย่างพิกัดของเขาวงกตตามรูปด้านบน

14,8
13,8
13,9
13,10
12,10
12,11
11,11
10,11
10,10
9,10
8,10
7,10
7,11
7,12
7,13
6,13
5,13



By :: Terus Limsurut FRA14




... สามารถคอมเมนท์ และติดตามขั้นตอนการ Solve ได้ในบทความถัดไป ...


ไม่มีความคิดเห็น:

แสดงความคิดเห็น