“หุ่นยนต์ดูดฝุ่น” มันจะเริ่มต้นสร้าง Map ยังไง? — Wall Follower Algorithm

How Vacuum Robot Find and Generate The Map?

Nopnithi Khaokaew (Game)
2 min readAug 11, 2019

— — — — — — — — — — — — — — —
สารบัญเนื้อหาทั้งหมด (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)
— — — — — — — — — — — — — — —

--

--

Nopnithi Khaokaew (Game)
Nopnithi Khaokaew (Game)

Written by Nopnithi Khaokaew (Game)

Cloud Solutions Architect & Hobbyist Developer | 6x AWS Certified, CKA, CKAD, 2x HashiCorp Certified (Terraform, Vault), etc.

No responses yet