68340700414 นาย ปณิธิ สีหะวงษ์
FIBO ROBOT CAFE ซึ่งเป็นการนำความรู้จากวิชา Foundation of Robotics (FRA631) และเรื่อง Human-Robot Interaction (HRI) มาประยุกต์ใช้จริงครับในโปรเจกต์นี้ ผมได้รับผิดชอบหลักในส่วนของ Detection model for detecting a coffee cup โดยมีเนื้อหาสำคัญดังนี้
เทคโนโลยีและเครื่องมือที่ใช้พัฒนา (Technology & Tools)
โครงการนี้บูรณาการเทคโนโลยีล้ำสมัยหลายด้านเพื่อให้หุ่นยนต์ทำงานร่วมกับมนุษย์ได้อย่างมีประสิทธิภาพ
ฮาร์ดแวร์และหน่วยประมวลผล (Hardware) ได้แก่
Jetson Nano: ใช้สำหรับการประมวลผลด้าน Vision และ AI โดยเฉพาะ
Raspberry Pi 5: ใช้เป็นหน่วยประมวลผลหลักสำหรับระบบ ROS2 และ Web UI
Microcontrollers: ใช้ ESP32 และ Arduino Mega 2560 ในการควบคุม Actuator และเซนเซอร์ต่างๆ
ระบบขับเคลื่อน: มอเตอร์ Stepper (NEMA 17/23) พร้อมบอร์ดขับมอเตอร์ที่พัฒนาขึ้นเอง (Custom MKS-based driver)
ซอฟต์แวร์และปัญญาประดิษฐ์ (Software & AI)
ROS2 (Robot Operating System): ระบบปฏิบัติการหลักที่ใช้บริหารจัดการโหนดการทำงาน ทั้งการคํานวณ Kinematics และการวางแผนเส้นทาง
YOLO (You Only Look Once): โมเดล AI ที่นำมา Fine-tune เพื่อใช้ตรวจจับตำแหน่งแก้วกาแฟ (Custom Coffee Cup Detection)
Media Pipe Holistic: ใช้สำหรับการดึงจุดพิกัดร่างกายมนุษย์ (Landmark Extraction) เพื่อสร้าง 3D Skeleton
Web Technologies: ใช้ WebSocket และ ROS Bridge สำหรับการสื่อสารข้อมูลแบบ Real-time ระหว่างหุ่นยนต์และ UI
เซนเซอร์และระบบการมองเห็น (Sensors & Vision)
Stereo Camera: ใช้สำหรับสร้างภาพ 3 มิติ เพื่อตรวจจับคนและระยะห่างเพื่อความปลอดภัย
Depth Camera (HP60): ใช้สำหรับการหาพิกัด X, Y, Z ของวัตถุที่แม่นยำก่อนการหยิบจับ
Cup detection vision
ในโปรเจกต์แขนกลหยิบแก้วนี้ ส่วนของ Vision system ทำหน้าที่เป็นระบบรับรู้สภาพแวดล้อมให้กับแขนกล โดยมีเป้าหมายหลักคือการตรวจจับตำแหน่งของแก้วในภาพ ประมาณตำแหน่งของแก้วเมื่อเทียบกับระบบพิกัดที่หุ่นยนต์สามารถใช้งานได้ และช่วยจัดแนวกล้องหรือ gripper ให้ตรงกับแก้วก่อนเข้าสู่ขั้นตอนการหยิบจริง
กล้องที่ใช้ในระบบคือกล้อง 3D Depth Camera รุ่น HP60 ซึ่งสามารถให้ภาพ RGB และข้อมูลระยะลึกของวัตถุในภาพได้ ภาพ RGB ถูกใช้สำหรับการตรวจจับวัตถุด้วยโมเดล YOLO และการตรวจจับ ArUco marker ส่วนข้อมูล Depth ถูกใช้ในขั้นตอนที่ต้องประเมินระยะห่างระหว่างกล้องหรือ gripper กับแก้ว โดยเฉพาะในโค้ด grasp_align.py ที่ต้องคำนวณระยะ forward เพื่อใช้เป็นข้อมูลให้ระบบควบคุมแขนกลเคลื่อนที่เข้าใกล้แก้ว

ภาพกล้อง YDLIDAR HP60C

YDLIDAR HP60C Product Specifications
ในส่วนของการตรวจจับวัตถุ ระบบใช้โมเดล YOLO เพื่อตรวจจับแก้วกาแฟในภาพ โดย YOLO จะให้ Bounding Box ของแก้ว ซึ่งใช้เป็นจุดเริ่มต้นในการหาตำแหน่งของแก้วในภาพ จากนั้นใช้ ArUco marker เป็นจุดอ้างอิงบนโต๊ะ เพื่อช่วยประมาณระนาบและทิศทางของพื้นที่จริงเมื่อเทียบกับกล้อง การใช้ ArUco ทำให้ระบบสามารถแปลงตำแหน่งของแก้วจากภาพ 2 มิติ ไปเป็นตำแหน่งเชิงเรขาคณิตที่เหมาะสมต่อการนำไปใช้ในระบบพิกัดของหุ่นยนต์ได้มากขึ้น
โดยภาพรวม งาน Vision แบ่งออกเป็น 2 ส่วนหลัก คือ main_aruco_pic.py และ grasp_align.py โดย main_aruco_pic.py ใช้สำหรับตรวจจับแก้วและ ArUco marker จากภาพ snapshot เพื่อประมาณตำแหน่งของแก้วในพิกัดฐานของหุ่นยนต์ ส่วน grasp_align.py ใช้สำหรับตรวจสอบแบบวิดีโอว่าแก้วอยู่ตรงกลางภาพหรือไม่ และคำนวณระยะ forward หรือระยะแนวตรงจาก Gripper ไปแก้วในแนวข้างหน้าเมื่อแก้วอยู่ในตำแหน่งที่เหมาะสมหรือตรงกลางของ Gripper แล้ว
ข้อมูลที่ระบบ Vision ส่งออกให้ระบบหุ่นยนต์มี 2 กลุ่มหลัก กลุ่มแรกคือข้อมูลตำแหน่งของแก้วค่าพิกัด X, Y และ Z ของแก้วเมื่อเทียบกับฐานหุ่นยนต์และใช้ทิศทางเฟรมของฐานเป็นเกณฐ์ ซึ่งใช้สำหรับการวางแผนตำแหน่งที่จะเคลื่อนแขนกลไปหาแก้ว กลุ่มที่สองคือข้อมูลสำหรับการจัดแนวและการเคลื่อนที่ เช่นค่าความคลาดเคลื่อนของแก้วจากจุดกึ่งกลางภาพ ระยะ forward จากกล้องหรือ gripper ไปยังแก้ว และสถานะว่าระบบจัดแนวสำเร็จแล้วหรือไม่ ข้อมูลเหล่านี้ถูกส่งผ่าน ROS topic เพื่อให้ส่วนควบคุมแขนกลหรือ task planner สามารถนำไปใช้ในขั้นตอนถัดไปของการหยิบแก้วได้
สรุปคือ ส่วนระบบ Vision ในโปรเจกต์นี้ทำหน้าที่เป็นเหมือนกับตาให้กับแขนกล โดยตรวจจับแก้ว ระบุตำแหน่งโดยอาศัย YOLO และ ArUco marker และใช้ข้อมูลจาก Depth camera เพื่อช่วยประเมินระยะในขั้นตอนจัดแนว ก่อนส่งข้อมูลที่จำเป็นให้ระบบหุ่นยนต์นำไปใช้ในการเคลื่อนที่และหยิบแก้วต่อไป.
ขอบเขตและแนวคิดการออกแบบระบบของ Cup detection vision
ในเวอร์ชันปัจจุบัน ระบบ Vision สามารถทำงานได้ 2 ส่วนหลัก ส่วนแรกคือการตรวจจับแก้วเพื่อประมาณตำแหน่งของแก้วในพิกัดอ้างอิง ส่วนที่สองคือการจัดแนวแก้วให้อยู่กึ่งกลางภาพและประเมินระยะเข้าใกล้แก้ว นอกจากนี ระบบยังสามารถส่งข้อมูลบางส่วนผ่าน ROS topic ตำแหน่งของแก้ว รวมถึงคำสั่งหรือข้อมูลที่ใช้ในการจัดแนว gripper
ยังไรก็ตาม ยังไม่ได้ทดสอบความแม่นยำของตำแหน่งในการติดกับตัว Gripper ของหุ่นยนต์เพื่อทดสอบในการใช้งานจริงเนื่องจาก Mechanic มีปัญหา และยังไม่ได้คำนวณจุดศูนย์กลางจริงของฐานแก้วจากรูปทรง 3 มิติแบบสมบูรณ์ ตำแหน่งของแก้วที่ได้ในปัจจุบันจึงเป็นการประมาณจากภาพและระนาบอ้างอิงมากกว่าการวัดตำแหน่งจริง
ในขั้นตอนการประมาณตำแหน่งแก้วของระบบนี้ ได้เลือกใช้ ArUco marker เป็นตัวอ้างอิงหลักในการคำนวณตำแหน่งของแก้ว แทนการใช้ค่าระยะจากกล้อง Depth เพียงอย่างเดียว เนื่องจากเป้าหมายของระบบไม่ได้ต้องการเพียงแค่ทราบระยะจากกล้องไปยังผิวของแก้ว แต่ต้องการประมาณตำแหน่งของแก้วบนระนาบโต๊ะหรือระนาบอ้างอิงหรือก็คือจุดกึ่งกลางของแก้วที่อยู่ตรงด้านล่างสุดของแก้ว เพื่อให้สามารถนำตำแหน่งดังกล่าวไปใช้ในการวางแผนการเคลื่อนที่ของแขนกลได้
แม้ว่ากล้อง Depth จะสามารถให้ค่าระยะลึกของวัตถุในภาพได้ แต่ค่าที่ได้จาก Depth camera เป็นค่าระยะของจุดบนพื้นผิวที่กล้องมองเห็น เช่น ผิวด้านหน้าของแก้ว ขอบแก้ว หรือบางตำแหน่งใน Bounding Box ของแก้ว ซึ่งอาจไม่ตรงกับตำแหน่งฐานหรือจุดกึ่งกลางของแก้วที่ระบบต้องการใช้จริง นอกจากนี้ วัตถุประเภทแก้วมักมีลักษณะพื้นผิวโค้ง บางครั้งมีความมันวาวหรือสะท้อนแสง ทำให้ค่าความลึกที่ได้จากกล้องอาจเกิด noise หรือไม่สามารถอ่านค่าได้ในบางบริเวณ โดยเฉพาะบริเวณขอบและผิวโค้งของวัตถุ
ArUco marker ถูกนำมาใช้เพื่อแก้ปัญหาดังกล่าว เนื่องจาก marker มีขนาดจริงที่ทราบล่วงหน้า และสามารถใช้ประมาณตำแหน่งและทิศทางของระนาบอ้างอิงเมื่อเทียบกับกล้องได้ เมื่อวาง ArUco marker บนพื้นโต๊ะ ระบบสามารถใช้ marker เป็นตัวแทนของระนาบโต๊ะ และใช้ข้อมูลดังกล่าวในการฉายตำแหน่งของแก้วจากภาพสองมิติลงบนระนาบจริงได้ วิธีนี้ช่วยให้ตำแหน่งที่คำนวณได้มีความหมายเชิงเรขาคณิตมากขึ้น และเหมาะสมต่อการนำไปใช้ในระบบพิกัดของหุ่นยนต์
อีกประเด็นหนึ่งคือ ระบบต้องการประมาณตำแหน่งบริเวณฐานหรือจุดกึ่งกลางของแก้ว ไม่ใช่เพียงตำแหน่งของพิกเซลที่ตรวจพบจากภาพเท่านั้น ดังนั้นการรู้ทิศทางของระนาบโต๊ะจึงมีความสำคัญต่อการคำนวณตำแหน่งดังกล่าว ตัวอย่างเช่น เมื่อตรวจพบ Bounding Box ของแก้วจากโมเดล YOLO ระบบสามารถเลือกจุดบริเวณด้านล่างของแก้วและฉายลงบนระนาบที่ได้จาก ArUco เพื่อประมาณตำแหน่งของแก้วบนโต๊ะได้ ซึ่งเป็นตำแหน่งที่มีประโยชน์ต่อการวางแผนการเคลื่อนที่ของแขนกลมากกว่าการอ่านค่า Depth จากจุดบริเวณผิวรอบนอกอย่างเดียว
นอกจากนี้ การใช้ ArUco marker ยังช่วยให้สามารถแสดงผล 3D bounding box ของแก้วบนภาพได้ โดยใช้ข้อมูลระนาบและทิศทางของ marker เป็นพื้นฐาน การแสดงผลดังกล่าวใช้เป็นเครื่องมือช่วยตรวจสอบความถูกต้องของการประมาณตำแหน่งลภาพ หากกล่องสามมิติที่แสดงผลมีตำแหน่งและทิศทางสอดคล้องกับแก้วจริง แสดงว่าการประมาณ pose ของ marker และตำแหน่งของแก้วมีความสมเหตุสมผลและยังสามารถนำไปประยุคใช้กับ UI บนเว็ป ที่จะโชในส่วนของ webcam

ภาพตัวอย่าง 3D bounding box ของแก้วกาแฟ
ดังนั้น ในระบบนี้จึงใช้ ArUco marker เป็นตัวอ้างอิงหลักสำหรับการประมาณตำแหน่งแก้วบนระนาบโต๊ะ ส่วนข้อมูลจากกล้อง Depth สามารถใช้เป็นข้อมูลเสริมหรือใช้ในขั้นตอนอื่นของระบบ เช่น การตรวจสอบระยะเข้าใกล้แก้วในขั้นตอนการจัดแนว gripper เพื่อช่วยให้ระบบสามารถทำงานได้ครบถ้วนและเสถียรมากขึ้น.
อีกปัจจัยหนึ่งที่มีผลต่อแนวทางการออกแบบระบบ Vision คือช่วงเวลาการพัฒนาอุปกรณ์จริง ในช่วงแรกของการพัฒนา ระบบ Vision ถูกพัฒนาและทดสอบโดยใช้กล้องเว็บแคมทั่วไป เนื่องจากกล้อง Depth camera ยังไม่ได้มาถึงในช่วงเริ่มต้นของโปรเจกต์ ทำให้โครงสร้างหลักของโค้ด โดยเฉพาะส่วนของการตรวจจับแก้วและการใช้ ArUco marker ถูกออกแบบให้สามารถทำงานได้จากภาพ RGB เพียงอย่างเดียว
เมื่อ Depth camera มาถึงในช่วงหลังของการพัฒนา จึงมีเวลาที่จำกัดในการพัฒนาด้วย Depth camera เป็นตัวหลัก จึงเลือกนำข้อมูลจาก Depth camera ไปใช้ในส่วนที่มีความจำเป็นและเกิดประโยชน์ชัดเจนที่สุดก่อน คือใน grasp_align.py สำหรับการคำนวณระยะ forward ระหว่างกล้องหรือ gripper กับแก้ว หลังจากที่ระบบจัดแนวให้แก้วอยู่ใกล้กึ่งกลางภาพแล้ว ซึ้งเดิมทีแนวคิดของการวัดระยะในขั้นตอนนี้เคยพิจารณาการใช้ ultrasonic sensor เช่น HC-SR04 แต่เมื่อมีกล้อง Depth camera แล้ว จึงสามารถใช้ข้อมูลระยะจากกล้องโดยตรงแทนได้ ซึ่งเหมาะสมกว่าในบริบทของระบบ Vision เพราะสามารถผูกข้อมูลระยะเข้ากับตำแหน่งของแก้วที่ตรวจจับได้จากภาพ
ในส่วนของ main_aruco_pic.py เคยมีการทดลองนำข้อมูล Depth เข้ามาช่วยในการประมาณตำแหน่งของแก้วเช่นกัน แต่จากการพัฒนาและทดสอบพบว่า ArUco marker เพียงอย่างเดียวสามารถให้ข้อมูลระนาบอ้างอิงและตำแหน่งของแก้วบนระนาบโต๊ะได้เพียงพอต่อความต้องการของระบบ อีกทั้งการเพิ่มข้อมูล Depth เข้าไปในขั้นตอนดังกล่าวไม่ได้ส่งผลสำคัญต่อผลลัพธ์มากนัก เมื่อเทียบกับความซับซ้อนที่เพิ่มขึ้นจากปัญหา noise หรือค่าความลึกที่อาจไม่เสถียรบนพื้นผิวของแก้วรวมไปถึงการกินทรัพยากาของอุปกรณ์ที่มากขึ้น ดังนั้นจึงเลือกให้ ArUco เป็นตัวอ้างอิงหลักในการหาตำแหน่งแก้ว
แนวทางนี้ยังมีข้อดีอีกหนึ่ง คือทำให้ระบบสามารถปรับใช้กับกล้องเว็บแคมทั่วไปได้ง่ายกว่าระบบที่พึ่งพา Depth camera อย่างเต็มรูปแบบ เนื่องจากส่วนการตรวจจับแก้วและการประมาณตำแหน่งจาก ArUco ใช้เพียงภาพ RGB เป็นหลัก หากไม่มี Depth camera ระบบยังสามารถใช้เว็บแคมราคาถูกในการตรวจจับแก้วและประมาณตำแหน่งบนระนาบอ้างอิงได้ ส่วน Depth camera ที่มีบทบาทในขั้นตอนการวัดระยะ forward เมื่อแก้วอยู่ตรงกลางกับกล้องเพื่อพร้อมจับเราก็ยังสามารถใช้แผนเดิมที่ใช้ HC-SR04 ที่ถูกและยังสามารถหาระยะ forward ที่ต้องการได้โดยถึงแม้จะไม่แม่นเท่ากับค่า depth ของ Depth camera
สรุป การที่ระบบไม่ได้ใช้ Depth camera เป็นอุปกรณ์หลักในทุกการตรวจจับแก้ว เป็นผลจากแนวทางการพัฒนาและข้อจำกัดของเวลาในโปรเจกต์ โดยระบบเริ่มจากการใช้เว็บแคมและ ArUco marker เป็นพื้นฐานก่อน จากนั้นจึงนำ Depth camera มาเสริมในส่วนที่มีผลต่อการทำงานของหุ่นยนต์มากที่สุด คือการวัดระยะเข้าใกล้แก้วในขั้นตอน grasp_align.py และสามารถพัฒนาต่อให้ใช้ Depth camera ได้มากขึ้นในอนาคต
ในการออกแบบระบบ Vision ยังมีการปรับปรุงการเตรียมให้โค้ดสามารถนำไปใช้งานบน Jetson Nano ได้ เนื่องจากในระบบจริงต้องการให้อุปกรณ์ประมวลผลภาพสามารถติดตั้งใกล้กับแขนกลหรืออยู่ภายในระบบหุ่นยนต์ได้ โดยไม่จำเป็นต้องพึ่งพาคอมพิวเตอร์ขนาดใหญ่ตลอดเวลา Jetson Nano จึงถูกเลือกเป็นอุปกรณ์สำหรับการรัน Vision เนื่องจากมีขนาดเล็ก ใช้พลังงานไม่สูง และเหมาะกับการนำไปติดตั้งร่วมกับระบบหุ่นยนต์
โค้ดยังถูกออกแบบให้สามารถทดสอบได้ทั้งบน Laptop และ Jetson Nano โดย Laptop ใช้สำหรับการพัฒนา ทดลอง และ debug เนื่องจากสะดวกและมีประสิทธิภาพสูงกว่า ส่วน Jetson Nano ถูกใช้เป็นเป้าหมายสำหรับการ deploy ในระบบจริง การออกแบบลักษณะนี้ช่วยให้สามารถพัฒนาและทดสอบได้รวดเร็วบนคอมพิวเตอร์หลัก

ภาพ NVIDIA Jetson Nano Developer Kit รุ่นที่ใช้
โมเดลสำหรับตรวจจับแก้วกาแฟ
ในส่วนของระบบ Vision ของแขนกล จำเป็นต้องมีโมเดลสำหรับตรวจจับตำแหน่งของแก้วกาแฟในภาพ เพื่อให้ระบบสามารถนำตำแหน่งของแก้วไปใช้ต่อกับขั้นตอนการคำนวณพิกัดและการควบคุมแขนกลได้
โมเดลที่เลือกใช้เป็นพื้นฐานคือ YOLO26n เนื่องจากเป็นโมเดลขนาดเล็ก เหมาะกับงานตรวจจับวัตถุแบบ real-time และมีจำนวนพารามิเตอร์ไม่มาก จึงเหมาะกับการนำไปใช้งานบนระบบที่ต้องการความเร็ว เช่น Jetson หรือระบบหุ่นยนต์
ในโปรเจกต์นี้ โมเดลไม่ได้ใช้เพื่อตรวจจับวัตถุหลายชนิด แต่ต้องการตรวจจับเพียงคลาสเดียวคือ
“coffee_cup” ดังนั้นจึงมีการ Fine-tuning โมเดลให้เหมาะกับแก้วกาแฟและสภาพแวดล้อมจริงของโปรเจกต์

ภาพแสดงประสิทธิภาพของ YOLO รุ่นล่าสุด
การเตรียมชุดข้อมูลสำหรับฝึกและทดสอบ
ชุดข้อมูลที่ใช้สำหรับฝึกโมเดลมาจากภาพถ่ายของแก้วกาแฟในหลายมุมมอง โดยเน้นให้ใกล้เคียงกับสภาพแวดล้อมจริงที่แขนกลจะทำงาน เช่น ภาพจากมุมกล้องด้านบน กล้องเอียงลงเล็กน้อย แก้วอยู่บนโต๊ะหรือพื้นที่ทำงาน และระยะห่างประมาณ 30-60 เซนติเมตร รวมถึงเพิ่มภาพที่ ไม่มีแก้วกาแฟ เพื่อช่วยให้โมเดลเรียนรู้ว่าในบางกรณีไม่ควรตรวจจับอะไรเลย
| Dataset | แบ่งเป็น |
| ภาพทั้งหมด: 565 ภาพ | Training set 452 ภาพ |
| ภาพที่มีแก้ว: 500 ภาพ | Validation set 113 ภาพ |
| ภาพที่ไม่มีแก้ว: 65 ภาพ |


ตัวอย่างรูปภาพที่ใช้ทดสอบ
ขั้นตอนการติดป้ายกำกับรูปภาพ
การติดป้ายกำกับรูปภาพใช้โปรแกรม LabelImg โดยตั้งค่าให้อยู่ในรูปแบบ YOLO Format
สำหรับภาพที่มีแก้ว จะวาด bounding box รอบแก้วกาแฟและกำหนดชื่อคลาสเป็น “coffee_cup” สำหรับภาพที่ไม่มีแก้ว จะสร้างไฟล์ .txt ที่ว่างเปล่า เพื่อบอกโมเดลว่าภาพนี้ไม่มีวัตถุที่ต้องตรวจจับ

ตัวอย่างการใช้โปรแกรม LabelImg
การปรับแต่งโมเดล YOLO26n ด้วยชุดข้อมูลของโปรเจกต์
เริ่มจากการนำโมเดล YOLO26n ที่ผ่านการ train มาก่อนแล้วมาทำ Fine-tuning ด้วยชุดข้อมูลของโปรเจกต์ โดยปรับให้ตรวจจับเพียงคลาสเดียวคือ coffee_cup หลังจากเพิ่มข้อมูลจากสภาพแวดล้อมจริงและภาพ no-cup โมเดลที่ดีที่สุดถูกบันทึกเป็น “best3.pt”
ผลลัพธ์ของโมเดลนี้ค่อนข้างดีมาก โดยสามารถตรวจจับแก้วกาแฟในภาพ validation ได้อย่างแม่นยำ และมีค่า mAP สูง
นอกจากการใช้ YOLO26n ปกติ ยังมีการทดลองปรับโครงสร้างโมเดลให้เล็กลง เพื่อดูว่าสามารถลดขนาดโมเดลได้หรือไม่ โดยโมเดลทดลองนี้เรียกว่า “navybest.pt” สิ่งที่ปรับหลัก ๆ คือ max_channels: 1024 -> 512 เป้าหมายคือทำให้โมเดลมีจำนวนพารามิเตอร์น้อยลง และอาจเหมาะกับการนำไปใช้งานบนอุปกรณ์ที่มีทรัพยากรจำกัด
ผลการเปรียบเทียบระหว่างโมเดล
มีการเปรียบเทียบโมเดลทั้งหมด 3 แบบ ได้แก่ base YOLO26n, โมเดล YOLO26n ที่ fine-tune แล้ว best3.pt และโมเดล YOLO26 ที่ปรับโครงสร้างให้เล็กลง navybest.pt โดยใช้ validation set เดียวกันจากชุดข้อมูลของโปรเจกต์
Validation set ที่ใช้ภาพทั้งหมด: 113 ภาพ แบ่งเป็น ภาพที่มีแก้ว: 100 ภาพ และ ภาพ no-cup/background: 13 ภาพจำนวนแก้วทั้งหมด: 165 instances
| Model | Parameters | GFLOPs | Precision | Recall | mAP50 | mAP50-95 |
| yolo26n.pt | 2.41M | 5.4 | 81.0% | 70.9% | 80.2% | 75.1% |
| best3.pt | 2.38M | 5.2 | 100.0% | 99.2% | 99.5% | 97.0% |
| navybest.pt | 1.28M | 4.3 | 96.9% | 99.4% | 99.4% | 95.0% |
ตาราง ผลการเปรียบเทียบระหว่างโมเดล
จากผลการทดสอบ พบว่า base YOLO26n สามารถตรวจจับแก้วได้ในระดับหนึ่ง เพราะโมเดลเดิมมีคลาส cup อยู่แล้ว แต่ยังไม่เหมาะกับสภาพแวดล้อมจริงของโปรเจกต์ ทำให้ค่า recall และ mAP ต่ำกว่าโมเดลที่ผ่านการ fine-tune อย่างชัดเจน
หลังจาก fine-tune เป็น best3.pt ค่า precision, recall และ mAP เพิ่มขึ้นมาก โดยเฉพาะ mAP50-95 ที่เพิ่มจาก 75.1% เป็น 97.0% แสดงว่าโมเดลสามารถตรวจจับแก้วกาแฟได้แม่นยำขึ้นและ bounding box มีคุณภาพดีขึ้น
ส่วน navybest.pt เป็นโมเดลที่ปรับโครงสร้างให้เล็กลง โดยลดจำนวน parameters ลงเหลือประมาณ 1.28M แต่ยังคงให้ผลลัพธ์ใกล้เคียงกับ best3.pt แม้ว่า mAP50-95 จะต่ำกว่าเล็กน้อย
โมเดลที่เหมาะสมที่สุดสำหรับใช้งานจริงในระบบตอนนี้คือ “best3.pt”
เนื่องจากมีความแม่นยำสูงกว่า และสามารถตรวจจับแก้วกาแฟได้เสถียรกว่า แม้จะมีขนาดใหญ่กว่า navybest.pt เล็กน้อย ส่วน navybest.pt สามารถลดจำนวนพารามิเตอร์ของโมเดลได้มาก แต่เมื่อทดสอบจริงยังไม่ได้ให้ความเร็วที่แตกต่างอย่างชัดเจน ดังนั้นจึงเหมาะสำหรับใช้เป็นแนวทางทดลองต่อในอนาคตมากกว่าการใช้เป็นโมเดลหลัก
การทำงาน ของ Cup detection vision
ในส่วนของ Vision system มีโค้ดหลักที่ใช้ในการทำงาน 2 ไฟล์ คือ main_aruco_pic.py และ grasp_align.py โดยทั้งสองไฟล์มีหน้าที่ต่างกันในระบบหุ่นยนต์ โค้ดชุดแรกใช้สำหรับค้นหาและประมาณตำแหน่งแก้ว โค้ดชุดที่สองใช้สำหรับจัดแนว gripper หรือกล้องให้ตรงกับแก้ว และคำนวณระยะเข้าใกล้แก้วก่อนเข้าสู่ขั้นตอนการหยิบ
1 การทำงานของ main_aruco_pic.py
main_aruco_pic.py เป็นโค้ดที่ใช้สำหรับตรวจจับตำแหน่งของแก้วในลักษณะ snapshot กล่าวคือ ระบบจะรับภาพจากกล้องจำนวนหนึ่ง แล้วเลือกภาพที่เหมาะสมที่สุดมาใช้ในการประมวลผลโดยคำนึงถึงค่า confident ว่าเป็นแก้วแค่ไหน แทนที่จะประมวลผลวิดีโอต่อเนื่องตลอดเวลา แนวทางนี้ช่วยลดภาระการประมวลผล และเหมาะกับขั้นตอนที่ต้องการหาตำแหน่งเป้าหมายของแก้วเพียงครั้งเดียวก่อนส่งข้อมูลไปยังระบบวางแผนหรือระบบควบคุมหุ่นยนต์
ขั้นตอนแรกของโค้ดคือการเปิดกล้องและดึงภาพ RGB จากกล้อง จากนั้นระบบจะตรวจจับ ArUco marker เพื่อใช้เป็นจุดอ้างอิงของระนาบโต๊ะ และตรวจจับแก้วด้วยโมเดล YOLO เพื่อหาตำแหน่งของแก้วในภาพ หากระบบตรวจพบทั้ง ArUco marker และแก้ว จึงจะเข้าสู่ขั้นตอนการคำนวณตำแหน่งต่อไป
หลังจากตรวจพบแก้ว ระบบจะเลือกจุดบริเวณด้านล่างของแก้วจาก Bounding Box หรือ contour ภายในบริเวณของแก้ว จากนั้นนำจุดพิกเซลดังกล่าวไปฉายลงบนระนาบอ้างอิงที่ได้จาก ArUco marker เพื่อประมาณตำแหน่งฐานของแก้วบนโต๊ะเป็นจุดสีแดง ตำแหน่งนี้จะถูกแปลงจากพิกัดกล้องหรือพิกัดอ้างอิงของ ArUco ไปเป็นพิกัดที่สัมพันธ์กับฐานของหุ่นยนต์ โดยใช้ข้อมูล pose ของ end-effector จากระบบ ROS topic /ee_pose
ผลลัพธ์ที่ได้จาก main_aruco_pic.py คือพิกัดของแก้วเมื่อเทียบกับ base frame ของหุ่นยนต์ เช่น ค่า X, Y และ Z ในหน่วยมิลลิเมตร ซึ่งสามารถใช้เป็นข้อมูลสำหรับวางแผนการเคลื่อนที่ของแขนกลไปยังตำแหน่งใกล้แก้วได้ นอกจากนี้โค้ดยังสามารถแสดงผลภาพพร้อม Bounding Box ของแก้ว แกนของ ArUco และ 3D bounding box เพื่อใช้ตรวจสอบความถูกต้องของการประมาณตำแหน่ง
ในกรณีที่เปิดใช้งานการเชื่อมต่อกับ task planner โค้ดสามารถส่ง state ผ่าน ROS topic ได้ เช่น state ที่บอกว่าระบบตรวจพบแก้วและ ArUco แล้ว หรือตำแหน่งของแก้วสามารถนำไปใช้งานต่อได้ ข้อมูลเหล่านี้ช่วยให้ task planner ทราบว่าส่วน Vision ทำงานสำเร็จในขั้นตอนการค้นหาแก้ว และสามารถส่งต่อไปยังขั้นตอนถัดไป เช่น การจัดแนว gripper หรือการเคลื่อนที่ไปยังตำแหน่งหยิบแก้ว

รูปแสดงการทำงานของ main_aruco_pic.py
2 การทำงานของ grasp_align.py
grasp_align.py เป็นโค้ดที่ทำงานแบบวิดีโอ frame ต่อเนื่อง โดยมีหน้าที่หลักคือช่วยจัดแนว gripper หรือกล้องให้ตรงกับแก้ว หลังจากระบบทราบตำแหน่งของแก้วในภาพแล้ว โค้ดนี้จะตรวจสอบว่าแก้วอยู่กึ่งกลางภาพหรือไม่ โดยพิจารณาจากตำแหน่งกึ่งกลางของ Bounding Box ของแก้วที่ตรวจจับได้จาก YOLO เทียบกับจุดกึ่งกลางของภาพจากกล้อง
ค่าหลักที่ใช้ในขั้นตอนนี้คือ error_distance_px ซึ่งเป็นค่าความคลาดเคลื่อนในหน่วยพิกเซลระหว่างตำแหน่งกึ่งกลางของแก้วกับตำแหน่งกึ่งกลางของภาพ หากค่า error เป็นบวก หมายความว่าแก้วอยู่ทางด้านขวาของภาพ หากค่า error เป็นลบ หมายความว่าแก้วอยู่ทางด้านซ้ายของภาพ ระบบจะใช้ค่านี้ในการตัดสินใจว่าควรส่งคำสั่งให้ gripper หรือ end-effector เคลื่อนที่ไปในทิศทางใดเพื่อให้แก้วมาอยู่ตรงกลางภาพ
เมื่อแก้วยังไม่อยู่กึ่งกลางภาพ โค้ดจะส่งคำสั่ง jog ไปยัง ROS topic ที่ใช้ควบคุมการเคลื่อนที่ของ end-effector โดยคำสั่งนี้เป็นการเคลื่อนที่ทีละเล็กน้อยเพื่อปรับตำแหน่งซ้าย-ขวาของ gripper ให้ตรงกับแก้ว และยังมีการพิจารณา yaw ของ end-effector เพื่อเลือกแกนการเคลื่อนที่ที่เหมาะสมมากขึ้น เยกตัวอย่างเช่นถ้า กรณี yaw = 0 องศา end-effector จะเลื่อนซ้ายขวาด้วยแกน Y ของ Base frame ส่วนถ้า yaw = 90 องศา, end-effector จะเลื่อนซ้ายขวาด้วยแกน X ของ Base frame เป็นต้น
เมื่อระบบตรวจพบว่าแก้วอยู่ภายในช่วงกึ่งกลางที่กำหนด เช่น อยู่ในระยะ error ไม่เกินค่าความคลาดเคลื่อนที่ตั้งไว้ ระบบจะเริ่มนับเวลาความเสถียร หากแก้วอยู่กึ่งกลางต่อเนื่องเป็นระยะเวลาหนึ่ง เช่น 3 วินาที ระบบจะถือว่าแก้วอยู่ตรงกลางกล้องจริงๆสำเร็จ จากนั้นจึงใช้ข้อมูลจาก Depth camera เพื่อคำนวณระยะ forward ระหว่างกล้องหรือ gripper กับแก้ว
การใช้ Depth ใน grasp_align.py มีความสำคัญ เพราะในขั้นตอนนี้ระบบไม่ได้ต้องการประมาณตำแหน่งบนระนาบโต๊ะเหมือนใน main_aruco_pic.py แต่ต้องการทราบระยะเข้าใกล้แก้วโดยตรง เมื่อแก้วอยู่กึ่งกลางภาพแล้ว การอ่านค่าความลึกจากบริเวณ Bounding Box ของแก้วสามารถใช้ประมาณระยะจากกล้องไปยังแก้วได้ โค้ดจะสุ่มหรือเลือกค่าความลึกจากหลายจุดใน Bounding Box เพื่อหลีกเลี่ยงปัญหาค่า Depth ที่อ่านไม่ได้หรือมี noise จากบางพิกเซล จากนั้นนำค่าที่ได้ไปคำนวณเป็น forward_distance_mm
เมื่อระบบจัดแนวสำเร็จและได้ค่า forward distance แล้ว grasp_align.py จะส่งคำสั่ง forward ผ่าน ROS topic เพื่อแจ้งระยะที่ gripper ควรเคลื่อนที่เข้าใกล้แก้ว คำสั่งนี้มีรูปแบบเป็น JSON เช่นมี label เป็น forward และมีค่า forward เป็นระยะทางในหน่วยมิลลิเมตร นอกจากนี้ หากเปิดใช้งาน task planner โค้ดยังสามารถส่ง state เช่น at(perpendicular) เพื่อแจ้งว่าขั้นตอนการจัดแนวสำเร็จแล้ว และระบบสามารถเข้าสู่ขั้นตอนถัดไปได้

รูปแสดงการทำงานของ grasp_align.py
เนื้อหาและสรุปเรียบเรียงโดย

นาย ปณิธิ สีหะวงษ
