VirtualArm Sort & Store [Computer vision]

รับผิดชอบโดย => นายกวิน แย้มต่วน 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