“หุ่นยนต์ดูดฝุ่น” มันจะเริ่มต้นสร้าง Map ยังไง? — Wall Follower Algorithm
How Vacuum Robot Find and Generate The Map?
— — — — — — — — — — — — — — —
สารบัญเนื้อหาทั้งหมด (My Contents)
— — — — — — — — — — — — — — —
ผมเคยสงสัยว่า “หุ่นยนต์ดูดฝุ่น” มันจะเริ่มต้นสร้าง map ยังไง?
สิ่งที่ผมสังเกตและคิดได้ คือ…
อันดับแรกมันคงจะต้องพยายามเลาะขอบกำแพงไปเรื่อย ๆ เพื่อหาความกว้างของพื้นที่, สแกนด้วยกล้องหรือ ultrasonic sensor อะไรเทือกนั้นแล้วค่อย process เพื่อสร้าง map ขึ้นมาด้วย algorithm อะไรต่อมิอะไรอีกมากมายแน่ ๆ
วันเวลาผ่านไปนานแสนนาน
บังเอิญว่าผมไปเรียนคอร์สออนไลน์ด้าน Robotics มาแบบพอหอมปากหอมคอเพราะผมอยากทำ Robot Arm แต่ก็ไปเจอโดยบังเอิญว่าไอ้การเลาะขอบกำแพงเนี่ย เค้านิยมใช้ “Wall Follower Algorithm” กัน
หรือรู้จักกันในชื่อ Left-Hand Rule Algorithm ซึ่งผมเองก็รู้จักเจ้าตัวนี้เป็นอย่างดีเพราะเคยศึกษาและ implement code เล่นบน robot มานานแล้ว นี่เป็นหนึ่งใน algorithm ที่ใช้ในการแก้ปัญหาเขาวงกต (solving maze) ที่อาจจะไม่ค่อยมีประสิทธิภาพเท่าไรนัก แต่มันเกาะขอบกำแพงดีนักแล
Left-Hand Rule Algorithm มีดังนี้
ถ้าทางซ้ายว่าง:
- หันซ้าย (90 องศา) และตรงไป
หรือถ้าทางซ้ายไม่ว่างและตรงไปได้:
- ตรงไป
หรือถ้าทางซ้ายไม่ว่างและตรงไปไม่ได้:
- หันขวา (90 องศา)
หรือถ้าไม่ว่างทั้ง 3 ด้าน (ซ้าย ขวา หน้า)
- กลับหลังหัน (180 องศา)
แต่…เมื่อผมลอง implement จริงในโปรแกรมเต่าน้อยของผม ก็พบปัญหาว่าถ้าเราไม่วาง robot ชิดกำแพงเนี่ย มันจะ loop และเอ๋ออยู่อย่างนั้นเนื่องจากเงื่อนไขที่ว่า…
ถ้าทางซ้ายว่าง:
- หันซ้าย (90 องศา) และตรงไป
ดังนั้นผมเลยต้องเพิ่ม algorithm ในการพยายามวิ่งเข้าเกาะกำแพงก่อนเข้ามา แล้วก็ก็ต้องมีส่วนในการเช็ค position ที่เคยเดินไปแล้ว เพราะเมื่อเดินเลาะจนครบขอบกำแพงแล้วก็ควรจบงานทั้งหมด
สุดท้ายก็น่าจะเป็นการวิ่งไล่ตามขอบเขตของ map ในจุดที่ sensor ส่องไปไม่ถึง (ในกรณีที่พื้นที่ใหญ่มาก) ซึ่งตรงนี้ซักวันคงได้มาเล่นต่อ 555
Python Code เฉพาะส่วนของ Algorithm
def wall_follower(self):
self.enable_track()
is_close_to_edge = False
while True:
front_side = self.front_pos()
left_side = self.left_pos()
right_side = self.right_pos()
time.sleep(0.1)
if not is_close_to_edge:
print('Find the edge of room')
if front_side in walls:
print('Found the edge of room')
is_close_to_edge = True
self.turn_right()
else:
self.move_forward()
else:
if left_side not in walls:
print('Left side is free')
self.turn_left()
self.move_forward()
elif left_side in walls and front_side not in walls:
print('Found wall at left side but front side is free')
self.move_forward()
elif left_side in walls and front_side in walls:
print('Found wall at left side and front side')
self.turn_right()
elif left_side in walls and front_side in walls and right_side in walls:
print('Found wall around myself')
self.turn_right()
self.turn_right()
อะ…วิดีโอนี้ผมลอง implement ดูแล้ว ก็เวิร์คดีนะ
— — — — — — — — — — — — — — —
สารบัญเนื้อหาทั้งหมด (My Contents)
— — — — — — — — — — — — — — —