TeleManipulation of Robot Hand using Human Gesture คืออะไร
TeleManipulation of Robot Hand using Human Gesture คือการควบคุมการเคลื่อนไหวของหุ่นยนต์จากระยะไกล โดยใช้การตรวจจับท่าทางของมือ ไม่ว่าจะเป็นการขยับตำแหน่งของหุ่นยนต์หรือการบังคับการทำงานของตัวกริปเปอร์
ขอบเขตของโปรเจกต์
- รับค่าตำแหน่ง Keypoint ของมือในพิกัด x y z โดยใช้กล้อง webcam ควบคู่กับ Mediapipe library
- ควบคุมตำแหน่งกริปเปอร์ ของหุ่นยนต์ UR3 โดยรับค่าจากตำแหน่งของข้อมือ
- ควบคุมการเปิดปิดการทำงานของกริปเปอร์ โดยรับค่าจากท่าทางของมือ
System scenario
Dataflow Diagram
Mediapipe Handpose Detection คืออะไร?
Mediapipe Handpose Detection คือ machine learning solution สำหรับการตรวจจับท่าทางของมือ โดยจะสามารถตรวจจับตำแหน่งพิกัด x y z ของ keypoint ต่างๆของมือได้ทั้งหมด 21 keypoint ซึ่งผู้ใช้จะสามารถนำจุด keypoint เหล่านี้ไปประยุกต์ใช้กับงานต่างๆได้ เช่นการตรวจจับท่าทาง การหาตำแหน่งของมือ ฯลฯ
UR คืออะไร?
UR หรือ Universal Robot นั้นเป็นหุ่นยนต์ที่มีความสามารถในการทำงานร่วมกับมนุษย์หรือเรียกว่า “Cobot” เนื่องจากตัวหุ่นยนต์มีความปลอดภัยโดยมีระบบตรวจจับแรงกระแทก เมื่อเจอแรงกระแทกจะหยุดทำงานทันที โดยตัวหุ่นยนต์จะมีข้อต่อที่เคลื่อนที่ได้ทั้งหมด 6 ข้อต่อด้วยกันในแต่ละรุ่นก็จะมีน้ำหนักและขนาดที่แตกต่างกันเพื่อทำให้เหมาะกับงานหลากหลายประเภท โดยในโปรเจกต์นี้ได้ทำการเลือกใช้เป็นหุ่นยนต์ UR3
การควบคุม UR3
สำหรับการติดตั้งโปรแกรมสามารถเข้าไปที่เว็บไซต์ของ Universal Robot และทำการติดตั้งโปรแกรมได้ เมื่อทำการติดตั้งโปรแกรมเสร็จแล้วผู้ใช้สามารถทดลองควบคุมหุ่นยนต์จากโปรแกรมตัวอย่างในเว็บไซต์ได้ เช่น
โปรแกรมควบคุมหุ่นยนต์ โดยเราต้องทำการใส่เลข IP ของตัวหุ่นยนต์ ตามในตัวอย่างคือ “127.0.0.1” และทำการควบคุมหุ่นยนต์ด้วยคำสั่ง moveL ค่าภายในจะเป็นค่าตำแหน่ง ค่าการหมุน ความเร็ว ความเร่งดังนี้ ([x,y,z,rx,ry,rz],v,a)
โปรแกรมรับค่าตำแหน่งหุ่นยนต์ โดยเราต้องใส่เลข IP ของหุ่นยนต์เหมือนกับการควบคุมหุ่นยนต์และใช้คำสั่ง getActualQ() เพื่อรับค่าตำแหน่งของหุ่นยนต์โดยจะได้ค่า ตำแหน่ง และค่าการหมุนดังนี้ [x,y,z,rx,ry,rz]
ลื้งค์สำหรับติดตั้งโปรแกรม : Installation — ur_rtde 1.5.5 documentation (sdurobotics.gitlab.io)
ขั้นตอนการทำโปรเจกต์
- การกำหนดพื้นที่ทำงานของหุ่นยนต์
เริ่มต้นเราต้องทำการกำหนดพื้นที่การทำงานของหุ่นยนต์ โดยเราจะทำการกำหนดให้หุ่นยนต์ทำงานอยู่ในพื้นที่ที่เป็นกล่องขนาดสี่เหลี่ยม
ขนาดกว้าง 15 เซนติเมตร ยาว 15 เซนติเมตรและสูง 10 เซนติเมตร จากนั้นกำหนดให้จุดเริ่มต้นอยู่บริเวณกึ่งกลางของกล่อง
การเก็บค่าตำแหน่งของหุ่นยนต์
เราจะทำการเก็บค่าตำแหน่งที่สามารถไปได้มากสุดในแต่ละทิศทาง เพื่อนำค่าที่ได้ไปปรับสเกลของส่วนตรวจจับท่าทางเพื่อทำให้เมื่อควบคุมหุ่นยนต์ หุ่นยนต์จะไม่ออกนอกพื้นที่การทำงานโดยเราจะทำการควบคุมหุ่นยนต์จากรีโมทไปตามมุมของพื้นที่การทำงานจุดต่างๆและเก็บค่ามาเพื่อหาค่าตำแหน่งมากสุดของแต่ละทิศโดยโปรแกรมมีดังนี้
2.การรับค่าจากท่าทางของมือ
2.1 สร้าง class สำหรับการทำงานของ Mediapipe
2.2 สร้าง funtion สำหรับตรวจจับมือ และวาดจุด keypoint
2.3 สร้าง function สำหรับการส่งค่าตำแหน่งพิกัด x y z ของข้อมือ โดยทำการเทียบค่าพิกเซลกับพิกัดพื้นที่การทำงานของหุ่นยนต์
2.4 สร้าง function สำหรับส่งค่าท่าทางการชูนิ้วต่างๆ ของข้อมือ โดยการเปรียบเทียบตำแหน่ง keypoint ของปลายนิ้วเทียบกับข้อนิ้ว
2.5 ทำการเปิดกล้อง webcam โดยใช้ opencv เพื่อตรวจจับท่าทางของมือ และเรียกใช้ function ต่างๆ เพื่อส่งค่าไปควบคุมหุ่นยนต์ในขั้นตอนต่อไป
การแสดงผลของกล้อง
- ) FPS ของกล้อง
- ) ท่าทางของมือ [มือซ้าย/ขวา,นิ้วโป้ง,นิ้วชี้,นิ้วกลาง,นิ้วนาง,นิ้วก้อย]
- ) พิกัดตำแหน่งของหุ่นยนต์ [x, y, z]
- ) keypoint ของมือที่ตรวจจับได้
ท่าทางที่ใช้ในการควบคุมหุ่นยนต์
- กำมือ : set home
2.ขยับมือไปในแนวซ้าย-ขวา/ขึ้น-ลง/เข้าหาจอ-ออกจากจอ : ขยับตำแหน่งหุ่นยนต์ในแนวซ้าย-ขวา/ขึ้น-ลง/เข้า-ออก
3. พับนิ้วโป้ง : ควบคุมการเปิดปิดกริปเปอร์
3.การควบคุมหุ่นยนต์
3.1 การควบคุมตำแหน่งหุ่นยนต์
การควบคุมหุ่นยนต์จะทำการรับค่าตำแหน่งที่ได้จากการตรวจจับท่าทาง และนำค่ามาทำการใส่เป็นตำแหน่ง x y z เป็นตำแหน่งของหุ่นยนต์และค่า rx ry rz เราจะใช้ค่าเดิมที่ได้จากการหาจุดเริ่มต้น (ต้องทำการ import rtde_control ก่อนจึงใช้ได้)
3.2 การควบคุมการเปิดปิดกริปเปอร์
การควบคุมกริปเปอร์จะทำการรับค่าท่าทางเพื่อนำค่าที่ได้มาเช็คสถานะ หากผู้ใช้พับนิ้วโป้งจำทำการส่งค่า Status ให้มีค่า 1 และเข้าเงื่อนไขที่จะสั่งงานกริปเปอร์ให้หนีบหากนิ้วโป้งไม่ได้พับให้ส่งค่า 0 และทำการปล่อยกริปเปอร์ (ต้องทำการ import rtde_io ก่อนจึงใช้ได้)
วิดิโอแสดงการทำงาน
System Performance
- พื้นที่การทำงานของหุ่นยนต์: 15x15x10 cm^3
- การเชื่อมต่อ: LAN
- ระบบปฏิบัติการ: Window
- ระยะในการตรวจจับท่าทางของมือ: 1-1.5 m
- อัตราการตอบสนองของหุ่นยนต์: 1000ms
- เฟรมเรทของกล้อง: 25-30 FPS
การทดสอบความแม่นยำในการตรวจจับท่าทางด้วยมือของ Media pipe
ทางผู้จัดทำได้ทำการทดลองใช้ Media pipe library มาทดสอบการตรวจจับท่าทางของมือจำนวน 64 ท่าทาง โดยทดลองในระยะ 1 เมตร และ 1.5 เมตร โดยสามารถดูรายละเอียดในการทดลองได้ในลิงค์นี้: https://drive.google.com/drive/u/3/folders/1r0tJQ4O5s3TPGfyaAzy81qM-S5mh2E62
สรุปผลการทดสอบ
1. สามารถตรวจจับท่าทางของมือได้ 64 ท่าทาง (100%) ในระยะ 1 เมตร
2. สามารถตรวจจับท่าทางของมือได้ 59 ท่าทาง (92.19%)
การทดสอบกับผู้ใช้
ทางผู้จัดทำได้มีการออกแบบภารกิจ ให้ผู้ใช้ควบคุมแขนกลไปยกถุงสกรูเพื่อเคลื่อนย้ายไปยังจุดเป้าหมายที่มีระยะทางและความสูงที่แตกต่างกัน โดยได้ทำการทดสอบกับผู้ใช้ จำนวน 13 คน ซึ่งจะมีการอธิบายวิธีการใช้งานและทดลองใช้ก่อนให้ทำภารกิจ โดยในการทดสอบผู้จัดทำจะทำการจับเวลาในการทำภารกิจและให้ผู้ใช้กรอกแบบสอบถามและให้ข้อเสนอแนะเพิ่มเติมในการพัฒนาระบบ
วิดิโอผู้ทดลองคนอื่นๆ : https://drive.google.com/drive/folders/1mjao0cclPdbLI3jeejhwjg1gZieaGIpJ?usp=share_link
การประเมินการใช้งานจากแบบสอบถาม:
1.ด้านความเสถียรของระบบ 3.9/5 คะแนน
2.ด้านความน่าสนใจของระบบ 4.5/5 คะแนน
3.ด้านความยากง่ายของภารกิจ 4.2/5 คะแนน
4.ด้านความเหมาะสมของท่าทางควบคุม 4.2/5 คะแนน
ระยะเวลาที่ผู้ใช้ทำภารกิจ
ระยะเฉลี่ย: 56 วินาที
ระยะเวลาน้อยสุด: 28 วินาที
ระยะเวลามากสุด: 143 วินาที
ความคิดเห็นอื่นๆ
- การควบคุมทิศทางเลื่อนเข้าเลื่อนออกมีความสับสนเล็กน้อย
- การควบคุมเป็นระยะเวลานาน อาจทำให้ผู้ใช้เกิดความเมื่อยล้า
- การออกแบบภารกิจมีความน่าสนใจ
ปัญหาที่พบ
- ผู้ใช้ไม่ได้ทำท่าทางที่ขนานกับกล้อง ทำให้การตรวจจับท่าทางเกิดข้อผิดพลาด
- ผู้ใช้ทำท่าทางหลุดออกระยะของจอ ทำให้ไม่สามารถตรวจจับท่าทางได้
- พื้นที่การทำงานของหุ่นยนต์มีขนาดเล็ก
- อัตราการตอบสนองช้า
SourceCode : https://github.com/Resdle/FinalProject.git
ข้อเสนอแนะ
- ควรพัฒนาการเขียนโปรแกรมเป็นแบบ Multiprocessing เพื่อให้ระบบสามารถตอบสนองได้อย่างรวดเร็วมากยิ่งขึ้น
- สามารถพัฒนาให้สามารถควบคุมได้จากระยะไกล โดยทำระบบ Communication ระหว่างรับข้อมูลจากจากผู้ใช้ และระบบสั่งการหุ่นยนต์
- สามารถปรับรูปแบบการรับข้อมูลจากผู้ใช้ จากแบบ absolute postion เป็นแบบ increment position เพื่อแก้ปัญหาข้อจำกัดจากเฟรมของกล้อง
สมาชิกผู้จัดทำ
นายกรณ์กฤตย์ รัตนสำเนียง รหัสนักศึกษา 63340500001
หน้าที่:
- ประยุกต์ใช้ระบบ Hand tracking จาก Media pipe library
- เขียน Function สำหรับแปลงค่าพิกัด x y z ตาม work space ของหุ่นยนต์เพื่อส่งค่าไปควบคุมตำแหน่งกริปเปอร์
- เขียน Function สำหรับระบุท่าทางของมือ เพื่อส่งค่าไปควบคุมการทำงานของกริปเปอร์
.
.
นายธีรนันท์ อนุพันธ์ รหัสนักศึกษา 63340500029
หน้าที่:
• ประยุกต์ใช้หุ่นยนต์ UR3 จาก rtde library
• เขียน Function สำหรับส่งค่า work space ของหุ่นยนต์เพื่อให้ส่วน Hand tracking สามารถแปลงค่าได้
• เขียน Function สำหรับรับค่าที่ส่งมาจากส่วน Hand tracking มาควบคุมตำแหน่งและการทำงานของกริปเปอร์