แรงขับในการทำโปรเจคนี้ของพี่คือ:
- รูบิคอยู่ในหมวดของเล่น "ขายดีเว่อร์" ขายไปแล้วกว่า 350 ล้านลูก
- เวลาที่มนุษย์ใช้แก้ลดลงจาก 22 วินาทีในปี 1982 เหลือแค่ 3.47 วินาทีในปี 2018
- นักคณิตศาสตร์ระดับเทพๆ อย่าง Kociemba, Rokiki และ Fridrich ยังหลงใหลของเล่นชิ้นนี้เลยนะ – ตอนเป็นผู้ใหญ่แล้วด้วย!!!
- มีคนแก้รูบิคแบบปิดตาได้ด้วยนะ – 48 ลูกในเวลาไม่ถึงชั่วโมง
- พี่อยากรู้เรื่อง OpenCV กับ Python เลยเลือกเจอเรื่องนี้แหละ เป็น Challenge ดี
- ช่วงโรคระบาด พี่ต้องมีโปรเจคไว้รักษาสมดุลจิตใจและให้สมองได้เรียนรู้สิ่งใหม่ๆ เป็นกลไกจัดการเวลาว่างน่ะ ฮ่าๆ
แนวคิด (Conceptualization):
พี่เอาแบบของ Matt2uy มา แล้วมาปรับปรุงส่วนการจดจำภาพและอัลกอริทึมการแก้ โดยนำ Herbert Kociemba algorithm มาใช้
ขั้นตอนการพัฒนา
มันเป็นกระบวนการที่ใช้สัญชาตญาณและสังเกตการณ์กลไก – ลองผิดลองถูก – สร้างมา 4 โมเดลจนเจอตัวที่แม่นยำและทำซ้ำได้ดีที่สุด
แนวคิดคือการสร้างความรู้บนพื้นฐานความรู้ที่มีอยู่แล้ว ดังนั้น Instructables, youtube, github เป็นแหล่งความรู้สำคัญมาก
ผลลัพธ์
หลังจากปรับนู่นนี่นิดหน่อย พี่ประหยัดเวลาได้ประมาณ 20-24 นาทีในการแก้ – เวลาเฉลี่ยตอนนี้อยู่ที่ 6 ถึง 8 นาที .
ถ้าน้องอยากได้ความเร็วสูงสุด ไปดูโปรเจคอื่นของพี่ได้นะ ส่วนอันนี้เน้นไปที่กลยุทธ์การแก้ปัญหา การเรียนรู้ และความอดทนมากกว่า
วิดีโอนี้สรุปภาพรวมสิ่งที่พี่ทำไว้:
กระบวนการทำงาน:
โมดูลโปรแกรม Python จะจับภาพลูกบาศก์ จากนั้นโมดูลอื่นจะประมวลผลสกัดสีของแต่ละสติกเกอร์ และสุดท้ายลูกบาศก์จะถูกแก้ด้วยอัลกอริทึม Kociemba จากนั้นคำตอบจะถูกส่งไปยัง Arduino ผ่านพอร์ตอนุกรม พอรหัส Arduino ได้รับคำตอบ มันก็จะเริ่มประมวลผลการเคลื่อนไหว หลังจาก 6-8 นาที กระบวนการก็เสร็จสิ้น และหุ่นยนต์จะแสดงหน้าทุกด้านของลูกบาศก์ที่แก้แล้ว
Algorithmic Kinematics: The Python and Arduino Pipeline
มนุษย์แก้รูบิคได้ด้วยการจดจำรูปแบบทางกายภาพ แต่การทำให้เครื่องจักรทำแบบเดียวกันได้นั้นต้องอาศัยความซับซ้อนทางคณิตศาสตร์ระดับจักรวาล ที่รวมเอา Optical Engineering ระดับสูง, เมทริกซ์การแก้ปัญหาด้วยอัลกอริทึม Kociemba และกลไกที่ต้องซิงค์กันอย่างน่ากลัว! หุ่นยนต์แก้รูบิค นี้ทำงานในรูปแบบ Master-Slave Architecture แบบครบวงจร! PC หรือ Raspberry Pi จะจับภาพสถานะสีของทั้ง 54 ช่องผ่านกล้องเว็บแคม จากนั้นก็สร้างชุดคำสั่งการเคลื่อนไหวที่ถูกออปติไมซ์แล้ว (ประมาณ 20 ท่า เช่น U2 R' F B') แล้วก็ยิงข้อมูลทั้งหมดนี้ผ่าน Serial ไปยัง Arduino Uno ที่ทำหน้าที่เป็น Slave! จากนั้นเจ้า Uno ก็จะถอดรหัสคำสั่งและสั่งการมอเตอร์สเตปเปอร์/เซอร์โวแรงบิดสูง 4-6 ตัว ให้ขยับแก้ลูกบาศก์จนเสร็จสิ้นภายในเวลาไม่กี่วินาที! จัดไปวัยรุ่น!
กระบวนการวิเคราะห์ภาพด้วย Python OpenCV
ก่อนที่มอเตอร์จะหมุนได้ หุ่นยนต์ต้องจำสภาพที่สลับของลูกบิดให้แม่นยำก่อน
- แขนกลของหุ่นยนต์จะหมุนลูกบิดอย่างละเอียด เพื่อนำทั้ง 6 หน้า มาให้ กล้อง USB ที่ติดตั้งอยู่กับที่จับภาพ
- OpenCV (Python) จะสแกนภาพอย่างหนักหน่วง เพื่อสร้าง Region of Interest (ROI) ที่ชัดเจน 9 จุดต่อหน้า
- ค่า RGB ที่แปรปรวนสุดๆ จะถูกแปลงเป็นระบบสี HSV (Hue, Saturation, Value) เพื่อประเมินสี "ส้ม" ได้อย่างแม่นยำ แม้จะอยู่ในสภาพแสงในห้องที่ห่วยแตกก็ตาม!
- มันจะรวบรวมสตริงสียาวเหยียด เช่น
"UUUURRRRRFFFDDD..."แล้วโยนเข้าไปในไลบรารี Kociemba ตัวหนักของ Python เพื่อคำนวณเส้นทางการแก้ (solve path) แบบคณิตศาสตร์ได้ในทันที!
การควบคุมชุดสเต็ปเปอร์มอเตอร์ (โค้ด Arduino)
การแยกวิเคราะห์สตริงคำสั่งแก้ เช่น "R2 L' F" ต้องการให้ Arduino จับคู่กับการเคลื่อนไหวทางกลไกที่แน่นอน โดยใช้เฟรมเวิร์ก <AccelStepper.h>!
R2หมายถึง หน้าขวาต้องหมุน 180 องศา อย่างรุนแรงL'หมายถึง หน้าซ้ายต้องหมุน 90 องศา ทวนเข็ม อย่างดุดัน!
void executeMove(String currentMove) {
if (currentMove == "R") {
// หมุนตามเข็ม 90 องศาบนสเต็ปเปอร์ขวา! (สมมติ 200 สเต็ป/รอบ)
stepperR.moveTo(stepperR.currentPosition() + 50);
while (stepperR.distanceToGo() != 0) {
stepperR.run(); // เร่งความเร็วแบบไม่บล็อกอย่างเร็ว!
}
}
else if (currentMove == "R'") {
// หมุนทวนเข็ม 90 องศา!
stepperR.moveTo(stepperR.currentPosition() - 50);
while (stepperR.distanceToGo() != 0) { stepperR.run(); }
}
}
สถาปัตยกรรมโครงสร้างพื้นฐานทางกายภาพ
- Arduino Mega 2560 (Uno มันแรมไม่พอและพินดิจิตอลไม่เยอะพอที่จะจัดการกับ A4988 Stepper Motor Driver จำนวน 4 ถึง 6 ตัวพร้อมกันแบบซิงโครไนซ์ได้!)
- มอเตอร์สเต็ปเปอร์ NEMA 17 จำนวน 4 ตัว หรือเซอร์โวเกียร์โลหะแรงบิดสูง (MG996R) (แนะนำให้ใช้สเต็ปเปอร์เพราะมันหมุน 90° ได้ฉับไว ไม่มีอาการสั่นจนทำให้กลไกลูกบิดติดขัดและพัง!)
- โครงสร้างจับยึดที่พิมพ์จากเครื่อง 3D พริ้นเตอร์ (มอเตอร์ต้องจับชิ้นส่วนกลางของลูกบิดได้พอดีในระดับมิลลิเมตร)
- คอมพิวเตอร์ตั้งโต๊ะหรือ Raspberry Pi 4 (สำหรับรันโปรเซสที่หนักอึ้งของ Python OpenCV และอัลกอริทึม Thistlethwaite/Kociemba)
- แหล่งจ่ายไฟ 12V กระแสสูง (เพื่อป้องกันไม่ให้สเต็ปเปอร์ดริฟเวอร์ดับหรือตก เมื่อแกนทั้ง 4 ล็อกแรงบิดยึดไว้พร้อมกัน)
ความท้าทายต่อไป
จากโปรเจกต์นี้ พี่พัฒนาต่อจนเวลาการแก้จาก 6 นาที เหลือ 30 วินาที และ 18 วินาที ไว้พี่จะมาอธิบายในวิดีโออื่นว่าทำอย่างไรถึงแก้ได้ 18 วินาที ไปดูวิดีโอเปรียบเทียบของพี่ด้านล่างนี้เลย:
สร้างไปทำไม?
หุ่นยนต์ตัวนี้ออกแบบมาเพื่อสอน:
1. ความอดทน, ความยืดหยุ่น, การจัดการกับความหงุดหงิด
2. ความสามารถในการทำซ้ำและความแม่นยำ เมื่อนำไปใช้กับหุ่นยนต์
3. สัญลักษณ์ของรูบิคส์คิวบ์, อัลกอริทึมการแก้
4. คณิตศาสตร์: ทฤษฎีเมทริกซ์, สถิติ, ทฤษฎีกรุป
5. การเขียนโปรแกรม: Arduino-Python
6. การประมวลผลภาพด้วย openCV