Class Project : TeleManipulation of Robot Hand using Human Gesture

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)


ขั้นตอนการทำโปรเจกต์

  1. การกำหนดพื้นที่ทำงานของหุ่นยนต์

เริ่มต้นเราต้องทำการกำหนดพื้นที่การทำงานของหุ่นยนต์ โดยเราจะทำการกำหนดให้หุ่นยนต์ทำงานอยู่ในพื้นที่ที่เป็นกล่องขนาดสี่เหลี่ยม

ขนาดกว้าง 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 ต่างๆ เพื่อส่งค่าไปควบคุมหุ่นยนต์ในขั้นตอนต่อไป

การแสดงผลของกล้อง

  1. ) FPS ของกล้อง
  2. ) ท่าทางของมือ [มือซ้าย/ขวา,นิ้วโป้ง,นิ้วชี้,นิ้วกลาง,นิ้วนาง,นิ้วก้อย]
  3. ) พิกัดตำแหน่งของหุ่นยนต์ [x, y, z]
  4. ) keypoint ของมือที่ตรวจจับได้

ท่าทางที่ใช้ในการควบคุมหุ่นยนต์

  1. กำมือ : 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 มาควบคุมตำแหน่งและการทำงานของกริปเปอร์