รับผิดชอบโดย => นายกวิน แย้มต่วน 66340700401
Objective
- สามารถจำแนก class ของวัตถุได้
- สามารถบอกพิกัดของวัตถุได้ (x,z)
Material and Method
ภาพรวมของงานจะแสดงในวิดีโอ ในงานนี้จะเป็นการตรวจจับวัตถุที่มีสีของฝาที่แตกต่างกันโดยเครื่องมือที่ใช้หลักๆจะเป็น openCV จะถูกเขียนด้วยภาษา Python โปรแกรมนี้จะสามารถตรวจจับตำแหน่งของวัตถุแต่ละสี ซึ่งสามารถระบุตำแหน่ง และสีของมันได้
ในงานนี้ได้ใช้กล้องที่มีชื่อว่า ZED mini stereo camera ซึ่งกล้องนี้มีวิธีการดึงภาพที่แตกต่างจากการใช้กล้อง webcam ทั่ว
# ซึ่งข้อมูลภาพจะถูกอ่านด้วย
zed.retrieve_image(image_left, sl.VIEW.LEFT)
zed.retrieve_image(image_right, sl.VIEW.RIGHT)
# ข้อมูลภาพจะถูกนำไปเก็บไว้
img = image_left.get_data()
ระบบประมวลผลหลักของระบบวิเคราะห์ภาพ
ต่อมาจะเป็นส่วนการทำงานหลักของระบบประมวลผลภาพ โดย อัลกอริทึม (algorithm) หลักๆจะเป็นการวิเคราะห์สี ตัดวัตถุออกมาจากพื้นหลัง หาพื้นที่ของบริเวณนั้นเพื่อวิเคราะห์ว่าใช่วัตถุไหม วิเคราะห์ตำแหน่ง เป็นต้น ปริภูมิสี HSV นั้นจะทำให้เราสามารถลดปัญหาในเรื่องของแสงได้ และในปริภูมินี้ทำให้เราสามารถแยกสีได้อย่างชัดเจน
โดยโปรแกรมจะมีการตั้งช่วงของสีแดงไว้ และภาพที่นำเข้ามาในตอนแรกจะถูกแปลงเป็นปริภูมิสี HSV ก่อน
low_red1 = np.array([170, 70, 50])
high_red1 = np.array([180, 255, 255])
red_mask1 = cv2.inRange(hsv_frame, low_red1, high_red1)
low_red2 = np.array([0, 70, 50])
high_red2 = np.array([10, 255, 255])
red_mask2 = cv2.inRange(hsv_frame, low_red2, high_red2)
red_mask = red_mask1 | red_mask2
ช่วงของสีน้ำเงินจะอยู่ที่
low_blue = np.array([94, 80, 2])
high_blue = np.array([126, 255, 255])
blue_mask = cv2.inRange(hsv_frame, low_blue, high_blue)
ช่วงของสีเขียวจะอยู่ที่
low_green1 = np.array([25, 52, 72])
high_green1 = np.array([102, 255, 255])
green_mask1 = cv2.inRange(hsv_frame, low_green1, high_green1)
จากนั้นภาพที่ถูกแยกโดยใช้ช่วงสีดังกล่าวแล้วจะผลลัพธ์ออกมาเป็นส่วนที่น่าจะเป็นสีนั้น จากนั้นจะมีการประยุกต์ cv2.findContours เพื่อใช้ในการหาพื้นที่ของภาพรวมทั้งตำแหน่งกึ่งกลางจากนั้นจะใช้พื้นที่นั้นในการเช็คเงื่อนไขว่าถ้าหากพื้นที่บริเวณนั้นมีขนาดมากกว่า area_min ก็จะนับว่าพื้นที่นั้นเป็นวัตถุ จากนั้นก็จะเก็บข้อมูลในแต่ละรอบและใส่ไว้ใน return img, red, blue, green โดยที่ img จะเป็นภาพที่เป็นผลลัพธ์
red = [n_red, c_red, red_mask]
blue = [n_blue, c_blue, blue_mask]
green = [n_green, c_green, green_mask]
โดยที่ n คือ จำนวนของวัตถุที่เป็นสีนั้น c คือตำแหน่งกึ่งกลางของวัตถุพร้อมทั้ง id ของมัน mask คือพื้นที่ของวัตถุที่ถูกแยกออกจากพื้นหลังแล้ว
ในส่วนของการสื่อสารระหว่างโปรแกรม
ในงานนี้จะใช้การสื่อสารผ่าน MQTT โดยใน code จะมีการเขียนแยกไว้ระหว่างการ Pub และการ Sub โดยต้องระบุ topic ที่ต้องการ และ broker_address
ลำดับการทำงาน
state ที่ t = 0 ก็คือเมื่อเริ่มต้น หุ่นจะต้องเคลื่อนที่ไปยังตำแหน่งการส่องวัตถุ เมื่อหุ่นเคลื่อนที่ไปถึงตำแหน่งนั้นระบบควบคุมจะส่งข้อความมาด้วยคำว่า ‘set_camera’
จากนั้นเมื่อไม่ได้เป็นการเริ่มทำงานครั้งแรก
ก็จะประกอบไปด้วยเริ่มจากการรับข้อมูลจากกล้อง จากนั้นระบบจะให้ผู้ใช้เลือกว่าต้องการใช้พื้นที่บริเวณไหนเป็นพื้นที่การทำงานบ้าง จากนั้นเมื่อผู้ใช้เลือกเสร็จระบบจะเปลี่ยน state state r เป็นการดำเนินการถัดไป
ในการทำงานขั้นต่อไปจะเป็นการประเมินระยะความสูงของกล้องเมื่อเทียบกับบริเวณที่ทำงาน ถ้าหากมันไม่สามารถระบุความห่างได้จะไม่มีการทำงานในลำดับถัดไป หรือก็แปลว่าในระยะความสูงเท่านี้ความแม่นยำในการระบวัตถุจะน้อยลงไปมากดังนั้นต้องลดความสูงของกล้องลงมา
ต่อมาในขั้นต่อไปจะให้ผู้ใช้เป็นคนนำเอาวัตถุไปวางในพื้นที่การทำงาน โดยในขั้นตอนนี้จะทำเพียงครั้งเดี่ยวเท่านั้นในครั้งแรกที่มีการเปิดใช้งานระบบ
state = 0 เป็นตอนเริ่มต้นเพื่อรอหุ่นเคลื่อนที่ไปยังตำแหน่งของการตั้งกล้อง
state = 1 จะเป็นการทำงานหลักโดยจะดึงค่าทั้งหมดที่ได้จาก CheckColor โดยจะมีการทำงานคือ Pub พิกัดให้กับระบบควบคุม จากนั้นจะรอหุ่นยนต์ทำงานเสร็จจึงจะส่งตำแหน่งไปซ฿่งจะทำงานวนไปแบบนี้จนไม่มีวัตถุเหลือในระบบก็จะทำการปรับ state ทุกอย่างเป็นค่าเริ่มต้น
function สำหรับการคำนวณ Rotation matrix
Gantt Chart: Project Planner
ผลการทดสอบความแม่นยำของการระบุตำแหน่งของระบบประมวลผล
สมการที่ใช้ในการคำนวณค่าความคาดเคลื่อน
ขั้นตอนในการวัดผล
- วางเส้นแนวเเกนตามแนวแกน X Z ของหุ่นยนต์
- ใช้ระบบประมวลในการระบุตำแหน่งของวัตถุ จากนั้นใช้อุปกรณ์วัดในการวัดตำแหน่งที่ได้จริงๆ
- บันทึกผลลง excel จากนั้นทำการวิเคราะห์ผล
- ตำแหน่งในตารางจะเรียงตามเข็มนาฬิกา 1 – 4