การทดสอบระบบเคลื่อนที่แต่ละแกน
ทดลองสั่งเคลื่อนไปที่ตำแหน่ง x=0.5 y=0 z=0.5 roll =0 pitch=0 yaw =0 ด้วยการเคลื่อนที่แบบ joint space ผลลัพธ์ที่ได้คือคือ แกนx=0.487 y=0 เนื่องจากไม่มีการขยับของแกน 1 z=0.51

ผลลัพท์ที่ได้จากการแสดงตำแหน่งใน rviz มีความคลาดเคลื่อนจากความจริงเฉลี่ย7.7 mm.



Joint angle in simulation for joint space
ทดลองสั่งเคลื่อนไปที่ตำแหน่ง x=0.5 y=0 z=0.5 roll =0 pitch=0 yaw =0 ด้วยการเคลื่อนที่แบบ task space ผลลัพท์ที่ได้เมื่อเทียบกับใน rviz พบว่าไม่สามารถเคลื่อนที่ให้ตรงตาม ที่คำนวณไว้ได้เนื่องจากความเร็วของ task spaceจาก jacobian และความเร็วมอเตอร์ในส่วนของ motion control ไม่สัมพันธ์กัน อีกทั้งด้วยข้อจำกัดด้านเวลาจึงไม่สามารถแก้ไขได้อย่างทันเวลา




Joint angle in simulation for task space
Task Planning
Task PLanning สามารถค้นหาเส้นทางที่สั้นที่สุดได้หลังจากที่ได้รับ initial stateและ goal state ซึ่งเป็นจุดเริ่มต้นจนถึงจุดสุดท้าย ได้ในเวลา 0.1 ms ซึ่งอาจเพิ่มขึ้นเมื่อ state มีจำนวนมากขึ้นและ แต่ละ operation มีความต้องการstate ที่ซับซ้อนมากขึ้น

เมื่อส่งstate ที่ต้องการแล้ว(ในหัวข้อ complete when:) สามารถทำงานoperationถัดไปได้ตามปกติ

การทดสอบระบบตรวจจับแก้ว
หลังจากพัฒนาระบบ Vision แล้ว จำเป็นต้องมีการทดสอบเพื่อประเมินว่าระบบสามารถทำงานได้ดีเพียงใดในสภาพแวดล้อมจริงของโปรเจกต์ โดยการทดสอบในส่วนนี้ไม่ได้มีเป้าหมายเพื่อวัดความแม่นยำเชิง absolute แบบงานวิจัยเต็มรูปแบบ แต่ต้องการประเมินความสามารถหลักที่จำเป็นต่อการใช้งานของระบบ ได้แก่ ความสามารถในการตรวจจับแก้วและ ArUco marker ความเสถียรของตำแหน่งที่คำนวณได้เมื่อวัตถุอยู่ตำแหน่งเดิม และความเร็วในการทำงานของระบบแบบวิดีโอเฟรมต่อเนื่อง
การทดสอบที่เลือกใช้มีทั้งหมด 3 ส่วนหลัก ได้แก่ Detection Success Rate, Position Repeatability และ FPS test ของ grasp_align.py
Detection Success Rate ใช้สำหรับประเมินว่า ระบบสามารถตรวจพบแก้วและ ArUco marker ได้บ่อยเพียงใดจากภาพที่ถ่ายในหลายมุมมอง แม้ว่าจะอยู่ในสภาพแวดล้อมเดียวกัน แต่มีการเปลี่ยนตำแหน่งของแก้ว marker และมุมกล้อง การทดสอบนี้มีความสำคัญ เพราะหากระบบไม่สามารถตรวจพบแก้วหรือ marker ได้ ขั้นตอนการคำนวณตำแหน่งและการส่งข้อมูลไปยังหุ่นยนต์ก็จะไม่สามารถทำงานต่อได้
Position Repeatability ใช้สำหรับประเมินความเสถียรของตำแหน่งที่ระบบคำนวณได้ เมื่อวางแก้วและ ArUco marker ไว้ในตำแหน่งเดิม แล้วรันระบบซ้ำหลายครั้ง การทดสอบนี้ไม่ได้วัดว่าตำแหน่งที่คำนวณได้ตรงกับค่าจริงในโลกจริงมากน้อยเพียงใด แต่เน้นดูว่าหากสภาพแวดล้อมเหมือนเดิม ระบบให้ผลลัพธ์ซ้ำได้ใกล้เคียงกันหรือไม่ ซึ่งเป็นสิ่งสำคัญสำหรับระบบ Vision ที่ต้องนำค่าตำแหน่งไปใช้ในขั้นตอนการวางแผนของหุ่นยนต์
FPS test ของ grasp_align.py ใช้สำหรับประเมินความเร็วของระบบในขั้นตอนจัดแนวแบบวิดีโอต่อเนื่อง โดยทดสอบว่าระบบสามารถรับและประมวลผลเฟรมจริงจากกล้องได้กี่เฟรมต่อวินาทีภายใต้การตั้งค่าต่าง ๆ ของ YOLO เช่น ขนาดภาพที่ส่งเข้าโมเดล และจำนวนเฟรมที่เว้นก่อนรัน YOLO ซ้ำ การทดสอบนี้มีความสำคัญต่อ grasp_align.py เพราะขั้นตอนนี้ต้องอาศัย visual feedback ต่อเนื่องในการตรวจสอบว่าแก้วอยู่ตรงกลางภาพหรือไม่
1. ผลการทดสอบ Detection Success Rate
ในการทดสอบนี้ได้เก็บภาพทั้งหมด 100 ภาพ โดยถ่ายในสภาพแวดล้อมเดียวกันและตำแหน่งพื้นที่ทดสอบเดียวกัน แต่มีการปรับเปลี่ยนตำแหน่งของแก้วและ ArUco marker รวมถึงขยับมุมกล้องหลายมุม เพื่อจำลองสถานการณ์ที่ระบบอาจพบระหว่างการทำงานจริง จากนั้นนำภาพทั้งหมดเข้าสู่กระบวนการตรวจจับด้วยโมเดล YOLO สำหรับตรวจจับแก้ว และตรวจจับ ArUco marker เพื่อประเมินความสามารถของระบบในการรับรู้วัตถุและจุดอ้างอิง
ผลการทดสอบพบว่า ระบบสามารถตรวจจับแก้วได้ 93 ภาพจากทั้งหมด 100 ภาพ คิดเป็นอัตราความสำเร็จ 93.00% และสามารถตรวจจับ ArUco marker ได้ 96 ภาพจากทั้งหมด 100 ภาพ คิดเป็น 96.00% เมื่อพิจารณาเงื่อนไขที่ต้องตรวจพบทั้งแก้วและ ArUco marker พร้อมกัน ระบบสามารถทำได้ 89 ภาพจากทั้งหมด 100 ภาพ หรือคิดเป็น 89.00%
ผลลัพธ์นี้แสดงให้เห็นว่าระบบมีความสามารถในการตรวจจับวัตถุและ marker ได้ค่อนข้างเสถียรภายใต้สภาพแวดล้อมที่ควบคุมได้ โดยค่า “Both detected” มีความสำคัญที่สุดสำหรับระบบนี้ เนื่องจากการทำงานของ main_aruco_pic.py จำเป็นต้องตรวจพบทั้งแก้วและ ArUco marker เพื่อใช้ในการคำนวณตำแหน่งของแก้วในระบบพิกัดอ้างอิง หากตรวจพบเพียงแก้วแต่ไม่พบ ArUco marker ระบบจะยังไม่สามารถแปลงตำแหน่งไปยังพิกัดที่ใช้งานกับหุ่นยนต์ได้อย่างสมบูรณ์
| รายการทดสอบ | จำนวนที่ตรวจพบ | อัตราความสำเร็จ |
| ตรวจจับแก้ว | 93/100 | 93.00% |
| ตรวจจับ ArUco marker | 96/100 | 96.00% |
| ตรวจพบทั้งแก้วและ ArUco | 89/100 | 89.00% |
ตารางผลการทดสอบ Detection Success Rate
สรุปได้ว่า ระบบมีอัตราความสำเร็จรวมในการตรวจพบข้อมูลที่จำเป็นต่อการคำนวณตำแหน่งแก้วอยู่ที่ 89.00% ภายใต้การทดสอบในสภาพแวดล้อมเดียวกันแต่มีการเปลี่ยนมุมกล้องและตำแหน่งวัตถุหลายรูปแบบ เพื่อประเมินความทนทานของระบบต่อมุมมองที่แตกต่างกัน จากการตรวจสอบภาพที่ระบบตรวจจับไม่สมบูรณ์ พบว่าสาเหตุหลักของความผิดพลาดแบ่งออกได้เป็น 2 กรณี คือ กรณีที่ระบบตรวจพบเฉพาะแก้วแต่ไม่พบ ArUco marker มักเกิดจากตำแหน่งของแก้วบดบังบางส่วนของ marker ทำให้ลักษณะสำคัญของ ArUco ไม่ครบถ้วนและไม่สามารถตรวจจับรหัส marker ได้อย่างถูกต้อง ส่วนกรณีที่ระบบตรวจพบเฉพาะ ArUco marker แต่ไม่พบแก้ว มักเกิดจากกล้องอยู่ในระยะที่ไกลเกินไป หรืออยู่ในมุมมองที่เอียงมากเมื่อเทียบกับแก้ว ส่งผลให้ลักษณะของแก้วในภาพมีขนาดเล็ก เปลี่ยนรูปทรง หรือไม่ชัดเจนเพียงพอสำหรับโมเดล YOLO ในการตรวจจับ
ดังนั้น ค่าความสำเร็จที่ตรวจพบทั้งแก้วและ ArUco marker พร้อมกันที่ 89.00% จึงสะท้อนข้อจำกัดของระบบในกรณีที่ marker ถูกบดบัง หรือวัตถุอยู่ในมุมกล้องที่ยากต่อการตรวจจับ อย่างไรก็ตาม ผลลัพธ์โดยรวมยังแสดงให้เห็นว่าระบบสามารถทำงานได้ค่อนข้างเสถียรในสภาพแวดล้อมทดสอบเดียวกัน เมื่อมีการจัดวาง marker และแก้วให้อยู่ในมุมมองของกล้องอย่างเหมาะสม.



รูปภาพกรณีจับได้แก้ว, ตรวจจับ ArUco marker, และ ตรวจพบทั้งแก้วและ ArUco
2.ผลการทดสอบของ Position repeatability
ในการทดสอบความสามารถในการทำซ้ำของตำแหน่ง ได้วางแก้วและ ArUco marker ให้อยู่ในตำแหน่งเดิม แล้วรันระบบตรวจจับตำแหน่งซ้ำทั้งหมด 20 ครั้ง โดยพิจารณาค่าพิกัดของแก้วในเฟรมฐานหุ่นยนต์เฉพาะแกน X และ Y ส่วนค่า Z ไม่ได้นำมาวิเคราะห์ เนื่องจากตำแหน่งความสูงของแก้วอยู่บนระนาบเดียวกับฐานอ้างอิง ทำให้ค่า Z มีค่าคงที่ใกล้ศูนย์เลยไม่มีความจำเป็นในการนำมาคำนวณ
| ครั้งที่รันโค้ด | แกน X (mm) | แกน Y (mm) |
| 1 | 966.6 | -97.7 |
| 2 | 964.5 | -97.7 |
| 3 | 965.5 | -98.8 |
| 4 | 964.3 | -97.7 |
| 5 | 965.8 | -98.8 |
| 6 | 964.5 | -98.7 |
| 7 | 965.2 | -97.7 |
| 8 | 964.5 | -98.7 |
| 9 | 965.5 | -97.7 |
| 10 | 964.6 | -98.7 |
| 11 | 963.9 | -98.7 |
| 12 | 964.6 | -98.7 |
| 13 | 965.3 | -98.8 |
| 14 | 965.4 | -98.8 |
| 15 | 964.3 | -98.7 |
| 16 | 964.4 | -97.7 |
| 17 | 965.2 | -97.7 |
| 18 | 965.5 | -97.7 |
| 19 | 966.2 | -98.7 |
| 20 | 965.5 | -98.7 |
ตารางการตรวจจับตำแหน่งซ้ำทั้งหมด 20 ครั้ง
จากข้อมูล Position Repeatability จำนวน 20 ครั้ง สรุปได้แบบนี้
| แกน | ค่าเฉลี่ย (mm) | Standard Deviation (mm) | ค่าต่ำสุด (mm) | ค่าสูงสุด (mm) | range (mm) |
| X | 965.07 | 0.71 | 963.90 | 966.60 | 2.70 |
| Y | -98.32 | 0.52 | -98.80 | -97.70 | 1.10 |
ตารางผลการทดสอบของ Position repeatability
จากผลการทดสอบ พบว่าค่าเฉลี่ยของตำแหน่งแก้วอยู่ที่ X = 965.07 mm และ Y = -98.32 mm โดยมีค่าเบี่ยงเบนมาตรฐานเท่ากับ 0.71 mm ในแกน X และ 0.52 mm ในแกน Y แสดงให้เห็นว่าระบบสามารถคำนวณตำแหน่งซ้ำได้ค่อนข้างเสถียรเมื่อวัตถุอยู่ในตำแหน่งเดิม ภายใต้สภาพแวดล้อมการทดสอบเดียวกัน
ผลนี้ถือว่าดีมากสำหรับระบบ vision estimation เพราะค่าความแกว่งอยู่ในระดับประมาณ 1 mm หรือน้อยกว่าในเชิงค่าเบี่ยงเบนมาตรฐาน.

รูปของการวางแก้วสำหรับการทดสอบทั้งหมด 20 ครั้ง
3. ผลการทดสอบ FPS ของ grasp_align.py
การทดสอบนี้มีวัตถุประสงค์เพื่อประเมินความสามารถในการทำงานแบบวิดีโอเฟรมต่อเนื่องของโปรแกรม grasp_align.py ซึ่งเป็นส่วนที่ใช้สำหรับตรวจสอบตำแหน่งของแก้วในภาพ และประเมินว่าแก้วอยู่กึ่งกลางกล้องหรือไม่ เพื่อใช้เป็นข้อมูลสำหรับการจัดแนว gripper ให้ตรงกับแก้วก่อนเข้าสู่ขั้นตอนการเคลื่อนที่เข้าไปหยิบวัตถุโดยประเมินจาก FPS ของกล้อง YDLIDAR HP60C DEPTH CAMERA
ในการทดสอบนี้มีวิธีการวัดให้เริ่มนับเมื่อระบบตรวจพบแก้วเป็นครั้งแรกหลังจากเปิดกล้อง และนับจำนวนเฟรมใหม่จากกล้องเป็นระยะเวลา 10 วินาที จากนั้นนำค่า FPS ในแต่ละวินาทีมาคำนวณหาค่า FPS เฉี่ยในช่ง 10 วินาทีนั้น
พารามิเตอร์ที่ใช้ในการทดสอบประกอบด้วย YOLO_IMGSZ และ YOLO_EVERY_N_FRAMES โดย YOLO_IMGSZ คือขนาดภาพที่ส่งเข้าโมเดล YOLO สำหรับตรวจจับแก้ว ส่วน YOLO_EVERY_N_FRAMES คือจำนวนเฟรมที่ระบบเว้นก่อนรัน YOLO ซ้ำอีกครั้ง เช่น หากกำหนด YOLO_EVERY_N_FRAMES = 5 หมายความว่าระบบจะรัน YOLO หนึ่งครั้งแล้วใช้ผลการตรวจจับล่าสุดซ้ำในเฟรมถัดไประหว่างที่ยังไม่ถึงรอบการตรวจจับใหม่ วิธีนี้ช่วยลดภาระการประมวลผลของโมเดล และลดการใช้ YOLO กับเฟรมที่ไม่จำเป็นได้
ในการทดสอบ ได้เปรียบเทียบผลระหว่างการทำงานบน Laptop และ Jetson Nano โดยทดสอบที่ขนาดภาพ YOLO เท่ากับ 256, 320 และ 640 pixels และกำหนดค่า YOLO_EVERY_N_FRAMES เป็น 1, 3, 5 และ 10 ตามลำดับ ผลการทดสอบแสดงดังตาราง
| YOLO_IMGSZ | YOLO_EVERY_N_FRAMES | FPS บน Laptop | FPS บน Jetson Nano |
| 256 | 1 | 20.00 | 3.50 |
| 256 | 3 | 20.00 | 3.98 |
| 256 | 5 | 20.00 | 4.56 |
| 256 | 10 | 20.00 | 5.10 |
| 320 | 1 | 20.00 | 2.72 |
| 320 | `3 | 20.00 | 3.13 |
| 320 | 5 | 20.00 | 3.38 |
| 320 | 10 | 20.00 | 3.60 |
| 640 | 1 | 12.18 | 0.91 |
| 640 | 3 | 15.30 | 1.12 |
| 640 | 5 | 16.89 | 1.17 |
| 640 | 10 | 18.78 | 1.72 |
ตารางผลการทดสอบ FPS ของ grasp_align ที่ parameters ต่าง
จากผลการทดสอบพบว่า เมื่อใช้ขนาดภาพ YOLO_IMGSZ = 256 และ YOLO_IMGSZ = 320 บน Laptop ระบบสามารถทำงานได้ที่ประมาณ 20 FPS ในทุกค่าของ YOLO_EVERY_N_FRAMES ซึ่งใกล้เคียงกับขีดจำกัดสูงสุดของกล้อง HP60 ตามเอกสารอุปกรณ์ที่ระบุว่ากล้องสามารถส่งภาพได้สูงสุด 20 FPS ดังนั้นในกรณีของ Laptop ข้อจำกัดหลักไม่ได้อยู่ที่ความสามารถในการประมวลผลของโปรแกรม แต่เป็นข้อจำกัดของตัวกล้องเองหรือก็คือแม้โปรแกรมจะสามารถประมวลผลได้เร็วกว่านี้ แต่ก็ไม่สามารถได้รับภาพใหม่จากกล้องเกินกว่าความเร็วที่กล้องส่งออกมาได้
อย่างไรก็ตาม เมื่อเพิ่มขนาดภาพเป็น YOLO_IMGSZ = 640 ค่า FPS บน Laptop เริ่มลดลง โดยเฉพาะเมื่อรัน YOLO ทุกเฟรม (YOLO_EVERY_N_FRAMES = 1) ซึ่งได้ FPS ประมาณ 12.18 FPS แสดงให้เห็นว่าขนาดภาพที่ใหญ่ขึ้นส่งผลต่อภาระการประมวลผลของ YOLO อย่างชัดเจน เนื่องจากโมเดลต้องประมวลผลข้อมูลภาพที่มีรายละเอียดมากขึ้น ทำให้เวลาประมวลผลต่อเฟรมเพิ่มขึ้น
ในส่วนของ Jetson Nano พบว่าค่า FPS ต่ำกว่า Laptop อย่างชัดเจนในทุกเงื่อนไข โดยเฉพาะเมื่อใช้ YOLO_IMGSZ = 640 ซึ่ง FPS ลดลงเหลือเพียง 0.91 FPS เมื่อรัน YOLO ทุกเฟรม และเพิ่มขึ้นเป็น 1.72 FPS เมื่อกำหนด YOLO_EVERY_N_FRAMES = 10 ผลลัพธ์นี้สะท้อนให้เห็นว่า Jetson Nano มีข้อจำกัดด้านกำลังประมวลผลเมื่อรัน YOLO ด้วย CPU โดยเฉพาะเมื่อใช้ขนาดภาพขนาดใหญ่ หากต้องการใช้งานบน Jetson Nano ให้มีประสิทธิภาพสูงขึ้นในอนาคต อาจจำเป็นต้องใช้การเร่งความเร็วด้วย GPU, CUDA, TensorRT หรือโมเดลที่มีขนาดเล็กลง
เมื่อพิจารณาผลของ YOLO_EVERY_N_FRAMES พบว่า การเพิ่มค่าดังกล่าวช่วยเพิ่ม FPS ได้ โดยเฉพาะบน Jetson Nano เนื่องจากระบบไม่ต้องรัน YOLO ทุกเฟรม แต่ใช้ผลการตรวจจับเดิมซ้ำในเฟรมที่ไม่ได้รันโมเดล ตัวอย่างเช่น ที่ YOLO_IMGSZ = 256 บน Jetson Nano ค่า FPS เพิ่มจาก 3.50 FPS เมื่อ YOLO_EVERY_N_FRAMES = 1 เป็น 4.56 FPS เมื่อ YOLO_EVERY_N_FRAMES = 5 และเพิ่มเป็น 5.10 FPS เมื่อ YOLO_EVERY_N_FRAMES = 10 อย่างไรก็ตาม การเพิ่ม YOLO_EVERY_N_FRAMES มากเกินไปทำให้ระบบอัปเดตตำแหน่งของแก้วช้าลง แม้ FPS จะเพิ่มขึ้น แต่การเคลื่อนไหวบนหน้าจอและการตอบสนองของตำแหน่ง Bounding Box จะดูไม่ลื่นไหลเท่าที่ควรทำให้มีโอการของความผิดพลาดในตองเคลื่อนไหวของตัว Gripper ได้
จากการทดสอบพบว่าแม้ YOLO_EVERY_N_FRAMES = 10 จะให้ค่า FPS สูงที่สุดในบางกรณี แต่การแสดงผลและการตอบสนองของระบบไม่ราบรื่นเพียงพอสำหรับการจัดแนว gripper ดังนั้นค่าที่เหมาะสมสำหรับระบบนี้จึงเลือกเป็น YOLO_IMGSZ = 256 และ YOLO_EVERY_N_FRAMES = 5 ซึ่งให้สมดุลที่ดีระหว่างความเร็วและความต่อเนื่องของการตรวจจับ โดยบน Laptop สามารถทำงานได้ที่ประมาณ 20 FPS และบน Jetson Nano ได้ประมาณ 4.56 FPS ซึ่งเป็นค่าที่สูงกว่าการรัน YOLO ทุกเฟรม และยังคงให้การอัปเดตตำแหน่งของแก้วที่ดูต่อเนื่องกว่าการใช้ YOLO_EVERY_N_FRAMES = 10
สรุปได้ว่า ขนาดภาพของ YOLO และความถี่ในการรันโมเดลมีผลโดยตรงต่อประสิทธิภาพของระบบจัดแนวแก้ว การใช้ภาพขนาดใหญ่ เช่น 640 pixels ช่วยเพิ่มรายละเอียดของภาพ แต่ทำให้ FPS ลดลงอย่างมาก โดยเฉพาะบน Jetson Nano ในขณะที่การใช้ภาพขนาดเล็ก เช่น 256 pixels ร่วมกับการรัน YOLO ทุก ๆ 5 เฟรม เป็นค่าที่เหมาะสมที่สุดสำหรับระบบนี้ เนื่องจากยังคงให้ความเร็วในการประมวลผลที่ดี และไม่ทำให้การอัปเดตตำแหน่งของแก้วช้าเกินไป
สรุปค่าที่เลือกใช้งาน YOLO_IMGSZ = 256 และ YOLO_EVERY_N_FRAMES = 5
ค่าดังกล่าวถูกเลือกเนื่องจากให้สมดุลระหว่าง FPS และความลื่นไหลของการตรวจจับ โดยไม่เลือก YOLO_EVERY_N_FRAMES = 10 แม้ว่าจะให้ FPS สูงกว่า เพราะการอัปเดตตำแหน่งแก้วช้าลงและทำให้ภาพรวมของการจัดแนวไม่ต่อเนื่องเท่าที่ต้องการ
