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 = '-' เส้นทางที่เคยสำรวจแล้วและเป็นทางตัน
ขั้นตอนการสำรวจ
- กำหนดขนาดของเขาวงกตมากสุดที่จะใช้ในการสำรวจทั้งความกว้าง และความยาวด้วยการสร้างไฟล์ text ตามรูป
++++++++++++++++++ ++++++++++++++++++ ++++++++++++++++++ ++++++++++++++++++ ++++++++++++++++++ ++++++++++++++++++ ++++++++++++++++++ ++++++++++++++++++ ++++++++++++++++++ ++++++++++++++++++ ++++++++++++++++++ ++++++++++++++++++ ++++++++++++++++++ ++++++++++++++++++ ++++++++S+++++++++ ++++++++++++++++++ ++++++++++++++++++ ++++++++++++++++++
โดยที่ S คือจุดเริ่มต้นของหุ่นยนต์ในแผนที่จำลอง และ "+" คือผนังจำลอง
และให้ทิศเริ่มต้นจำลองของหุ่น เป็นทิศเหนือ - เมื่อเริ่มทำการสำรวจหุ่นจะเริ่มจากการวัดเซนเซอร์จากผนังทั้งสามด้านคือ ด้านซ้าย ด้านบน และด้านขวา แผนที่ของเราจะถูกแทน OBSTACLE ด้วย WAY
- โดยหากทิศเหนือว่าง เราก็จะสั่งให้หุ่นยนต์ของเรานั้นเดินไปทางทิศเหนือ หรือทิศต่อไปตามลำดับที่ได้กำหนดไว้ แล้วจึงแทน WAY ด้วย TRIED ดังรูป

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



- เมื่อเราได้ค่าจากเซนเซอร์มา โปรแกรมเราจะทำการตรวจสอบเงื่อนไขต่างๆ เพื่อให้เคลื่อนที่ไปยังช่องที่ไม่ใช่ OBSTACLE และเป็น WAY (ยังไม่สำรวจ)
- จากนั้นจึงทำขั้นตอนที่ 2-8 จนกระทั่งเจอทางออก โดยเงื่อไขของการออกจากเขาวงกตมี
2 กรณีดังนี้
1. หุ่นบนต์เคลื่อนที่ออกจากขอบเขตที่เรากำหนดไว้
2. เมื่อหุ่นยนต์เคลื่อนที่ไปแล้วตรวจวัดเซนเซอร์ได้เป็นช่องว่างทั้งสามทิศทางติดต่อกัน 3 ครั้ง (เนื่องจากมีโอกาศน้อยที่จะเจอกรณีแบบนี้) - หุ่นจะเดินตามจุด 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,813,813,913,1012,1012,1111,1110,1110,109,108,107,107,117,127,136,135,13
By :: Terus Limsurut FRA14





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