โปรเจกต์ Robot Arm เล่น Chess ที่จะเอาชนะคุณ!
โปรเจกต์นี้ใช้ 3D printed Robot arm จากแหล่งข้อมูลฟรีร่วมกับ Code ของผมเพื่อ recognise Human moves และ Control Robot arm
โปรเจกต์นี้ใช้ 3D printed Robot arm จากแหล่งข้อมูลฟรีร่วมกับ Code ของผมเพื่อ recognise Human moves และ Control Robot arm
▶ กดเพื่อดูวิดีโอสาธิตโปรเจกต์
Project Supporter Team
โพสต์โดย
ฉันต้องการสร้างหุ่นยนต์หมากรุกที่สามารถเล่นและเอาชนะฉันได้ ก่อนหน้านี้ฉันเคยสร้างมาแล้วตัวหนึ่ง โดยใช้ชุดคิทสำเร็จรูป (AL5D) แต่มันมีราคาค่อนข้างสูง ดังนั้นฉันจึงตัดสินใจใช้ 3D-print เพื่อสร้างหุ่นยนต์ขึ้นมาเองและเขียน Code ใหม่สำหรับมัน
(ต่อมาฉันได้ทำเวอร์ชัน SCARA ด้วย)
มันทำงานดังนี้:
มนุษย์ซึ่งเล่นหมากสีขาวจะเป็นคนเดินหมาก ระบบ visual recognition จะตรวจจับการเคลื่อนไหวนั้น จากนั้นหุ่นยนต์จะคำนวณและเดินหมากของมัน
สลับกันไปแบบนี้เรื่อยๆ...
สิ่งที่น่าจะเป็นนวัตกรรมใหม่ที่สุดในหุ่นยนต์ตัวนี้คือ Code สำหรับการตรวจจับการเดินหมาก (move recognition)
เนื่องจากความเคลื่อนไหวของมนุษย์ถูกตรวจจับโดยระบบ vision จึงไม่จำเป็นต้องใช้ Hardware กระดานหมากรุกแบบพิเศษ (เช่น reed switches หรืออื่นๆ) เลย
กล้อง USB หรือ IP camera จะถูกติดตั้งไว้เหนือกระดานหมากรุกโดยตรง
Code ส่วนใหญ่ทำงานบน Raspberry Pi โดยมี Code ของ Arduino สำหรับจัดการเรื่อง inverse kinematics และการควบคุม stepper motor
Code นี้ยังรองรับระบบ Linux อื่นๆ หรือ Windows เพื่อเป็นทางเลือกแทน Raspberry Pi อีกด้วย
ไฟล์สำหรับ 3D printer ของหุ่นยนต์ตัวนี้มีให้ดาวน์โหลดฟรีตามลิงก์ที่ระบุไว้ในส่วน "additional contributors" แขนกล Tobler ถูกดัดแปลงด้วยส่วนประกอบแขนที่ยาวขึ้นและ mini-gripper โดย Tobler ได้ให้รายละเอียดเกี่ยวกับ Hardware, Software ของ Arduino และการประกอบหุ่นยนต์ไว้อย่างดีเยี่ยม
Tobler ยังอ้างอิงถึง Community และมีแผนผังที่ยอดเยี่ยมอยู่ที่นั่น (ลิงก์อยู่ในส่วน "Schematics") แต่โปรดทราบว่าการประกอบ Hardware นั้นสำหรับแขนกลหุ่นยนต์ที่ต่างกันเล็กน้อยซึ่งใช้ระบบสายพาน (belt drive)
เรามี Raspberry Pi ที่เชื่อมต่อกับ Arduino ผ่านสายเครื่องพิมพ์ โดย Arduino จะมีบอร์ด Ramps 1.4 ติดตั้งอยู่เพื่อขับเคลื่อนมอเตอร์ผ่านบอร์ด A4988 motor driver
ตัว stepper motor ให้ความแม่นยำสูงมากและสามารถทำงานซ้ำได้ดี
นอกจากจะใช้การเชื่อมต่อผ่าน USB จาก Raspberry Pi หรือระบบ Linux/Windows อื่นๆ แล้ว Code ยังรองรับ Bluetooth (ไม่ใช่ BLE) โดยใช้โมดูล HC-05 อีกด้วย
Code ทั้งหมดบน Raspberry Pi เขียนด้วย Python 3
ดังนั้นเราจึงมี Code ที่สามารถเลื่อนหมาก, กินหมาก, เข้าป้อม (castle), รองรับการกินผ่าน (en passant) และอื่นๆ
Chess engine ที่ใช้คือ Stockfish ซึ่งสามารถเอาชนะมนุษย์คนไหนก็ได้! "Stockfish เป็นหนึ่งใน Chess engine ที่แข็งแกร่งที่สุดในโลก และยังแข็งแกร่งกว่าแกรนด์มาสเตอร์หมากรุกที่เป็นมนุษย์ที่เก่งที่สุดด้วย"
ฉันใช้ Code บางส่วนจาก chessfortherapy.co.uk เพื่อตรวจสอบการเดินหมากของมนุษย์และติดต่อกับ Stockfish โดย Code ของฉันสำหรับการตรวจจับการเดินของมนุษย์และการขยับแขนหุ่นยนต์จะเชื่อมต่อกับส่วนนั้น
ในส่วนของ Arduino จะใช้ Code inverse kinematics เพื่อขยับมอเตอร์ต่างๆ ให้ถูกต้องเพื่อให้สามารถเคลื่อนย้ายหมากรุกได้ โดยมี Code ให้บริการจาก Tobler
หลังจากผู้เล่นเดินหมากแล้ว กล้องจะถ่ายภาพ Code จะทำการ Crop และหมุนภาพเพื่อให้กระดานหมากรุกพอดีกับภาพถัดไป ช่องตารางหมากรุกจะต้องดูเป็นสี่เหลี่ยมจัตุรัส! อาจมีความผิดเพี้ยน (distortion) ในภาพเนื่องจากขอบของกระดานอยู่ไกลจากกล้องมากกว่าจุดศูนย์กลาง อย่างไรก็ตาม กล้องถูกวางไว้ไกลพอที่เมื่อ Code ทำการ Crop ภาพแล้ว ความผิดเพี้ยนนี้จะไม่ส่งผลสำคัญ เนื่องจากหุ่นยนต์รู้ว่าหมากทุกลูกอยู่ที่ไหนหลังจากคอมพิวเตอร์เดินหมาก ดังนั้นสิ่งที่ต้องทำหลังจากมนุษย์เดินหมากคือ Code จะต้องสามารถแยกแยะความแตกต่างระหว่างสามกรณีต่อไปนี้ได้:
วิธีนี้ครอบคลุมทุกกรณี รวมถึงการเข้าป้อม (castling) และการกินผ่าน (en passant)
หุ่นยนต์จะตรวจสอบว่าการเดินหมากของมนุษย์ถูกต้องหรือไม่ และจะแจ้งเตือนหากไม่ถูกต้อง! กรณีเดียวที่ไม่ครอบคลุมคือเมื่อผู้เล่นฝั่งมนุษย์เลื่อนเบี้ยไปจนสุดกระดาน (promote) เพื่อเปลี่ยนเป็นหมากอื่นที่ไม่ใช่ควีน ซึ่งผู้เล่นจะต้องบอกหุ่นยนต์ว่าหมากที่เปลี่ยนมานั้นคืออะไร
ตอนนี้เราสามารถพิจารณาภาพในแง่ของช่องตารางหมากรุกได้แล้ว
ในการตั้งค่ากระดานเริ่มต้น เรารู้อยู่แล้วว่าหมากสีขาวและสีดำอยู่ที่ไหน และช่องไหนเป็นช่องว่าง
ช่องว่างจะมีความแปรผันของสีน้อยกว่าช่องที่มีหมากอยู่ เราจะคำนวณค่าเบี่ยงเบนมาตรฐาน (standard deviation) สำหรับแต่ละสีทั้งสามสีในระบบ RGB สำหรับแต่ละช่องโดยคำนวณจากทุก Pixel (ยกเว้น Pixel ที่อยู่ใกล้ขอบของช่อง) ค่าเบี่ยงเบนมาตรฐานสูงสุดสำหรับช่องว่างจะน้อยกว่าค่าเบี่ยงเบนมาตรฐานต่ำสุดสำหรับช่องที่มีหมากมาก ซึ่งช่วยให้เรากำหนดได้ว่าช่องใดว่างหลังจากที่ผู้เล่นเดินหมาก
เมื่อกำหนดค่า Threshold สำหรับช่องว่างเทียบกับช่องที่มีหมากได้แล้ว ต่อไปเราต้องกำหนดสีของหมากในช่องที่มีหมากอยู่:
บนกระดานเริ่มต้น เราจะคำนวณค่าเฉลี่ย (mean) ของ Pixel สำหรับแต่ละช่องสีขาวในสี R, G, B (ยกเว้น Pixel ที่อยู่ใกล้ขอบของช่อง) ค่าเฉลี่ยต่ำสุดสำหรับช่องสีขาวใดๆ จะมากกว่าค่าเฉลี่ยสูงสุดในบรรดาช่องสีดำทั้งหมด ดังนั้นเราจึงสามารถระบุสีของหมากในช่องที่มีหมากอยู่ได้ อย่างที่กล่าวไปข้างต้น นี่คือทั้งหมดที่เราต้องทำเพื่อระบุว่าการเดินหมากของมนุษย์คืออะไร
Algorithm จะทำงานได้ดีที่สุดหากกระดานหมากรุกมีสีที่แตกต่างจากสีของตัวหมากอย่างชัดเจน! ในหุ่นยนต์ของฉัน ตัวหมากจะเป็นสีขาวนวลและดำด้าน และกระดานหมากรุกทำขึ้นเองโดยใช้เครื่องพิมพ์สีพิมพ์ลงบนกระดาษแข็งบางๆ ซึ่งสามารถดูได้ในวิดีโอ
กระดานหมากรุกควรได้รับแสงสว่างเพียงพอและสม่ำเสมอโดยมีเงาจากตัวหมากน้อยที่สุด ไม่ควรมีแสงสะท้อนจากกระดานหรือตัวหมากกลับเข้าหากล้อง และจำเป็นต้องใช้โต๊ะที่มั่นคง
Code ของฉันมีรูทีนสำหรับปรับแต่ง (calibrate) กล้องและหุ่นยนต์
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้