สารบัญ:

Gesture Hawk: หุ่นยนต์ควบคุมด้วยท่าทางมือโดยใช้อินเทอร์เฟซที่ใช้การประมวลผลภาพ: 13 ขั้นตอน (พร้อมรูปภาพ)
Gesture Hawk: หุ่นยนต์ควบคุมด้วยท่าทางมือโดยใช้อินเทอร์เฟซที่ใช้การประมวลผลภาพ: 13 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Gesture Hawk: หุ่นยนต์ควบคุมด้วยท่าทางมือโดยใช้อินเทอร์เฟซที่ใช้การประมวลผลภาพ: 13 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Gesture Hawk: หุ่นยนต์ควบคุมด้วยท่าทางมือโดยใช้อินเทอร์เฟซที่ใช้การประมวลผลภาพ: 13 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: Gesture Hawk - Hand Gesture Controlled Bot, Robotics Club, IIT Guwahati 2024, พฤศจิกายน
Anonim
Gesture Hawk: หุ่นยนต์ควบคุมด้วยท่าทางมือโดยใช้อินเทอร์เฟซที่ใช้การประมวลผลภาพ
Gesture Hawk: หุ่นยนต์ควบคุมด้วยท่าทางมือโดยใช้อินเทอร์เฟซที่ใช้การประมวลผลภาพ

Gesture Hawk จัดแสดงใน TechEvince 4.0 ในรูปแบบอินเทอร์เฟซระหว่างมนุษย์และเครื่องจักรในการประมวลผลภาพอย่างง่าย ประโยชน์ของมันคือความจริงที่ว่าไม่มีเซ็นเซอร์เพิ่มเติมหรือสวมใส่ได้ยกเว้นถุงมือเป็นสิ่งจำเป็นในการควบคุมรถหุ่นยนต์ที่ทำงานบนหลักการไดรฟ์ที่แตกต่างกัน ในคำแนะนำนี้ เราจะนำคุณผ่านหลักการทำงานเบื้องหลังการติดตามวัตถุและการตรวจจับท่าทางที่ใช้ในระบบ ซอร์สโค้ดของโครงการนี้สามารถดาวน์โหลดได้จาก Github ผ่านลิงค์:

ขั้นตอนที่ 1: สิ่งที่จำเป็น:

สิ่งที่ต้องการ
สิ่งที่ต้องการ
สิ่งที่ต้องการ
สิ่งที่ต้องการ
สิ่งที่ต้องการ
สิ่งที่ต้องการ
สิ่งที่ต้องการ
สิ่งที่ต้องการ
  1. ตัวขับมอเตอร์ L298N
  2. มอเตอร์กระแสตรง
  3. โครงรถหุ่นยนต์
  4. Arduino Uno
  5. แบตเตอรี่ LiPo
  6. สาย USB Arduino (ยาว)
  7. ไลบรารี OpenCV พร้อม Python

ขั้นตอนที่ 2: หลักการทำงาน:

หลักการทำงาน
หลักการทำงาน

Gesture Hawk เป็นระบบประมวลผลสามเฟสดังที่คุณเห็นในไดอะแกรมด้านบน

ขั้นตอนที่ 3: จับอินพุตและประมวลผล:

การจับอินพุตและการประมวลผล
การจับอินพุตและการประมวลผล

การจับอินพุตสามารถเข้าใจได้ในหมวดหมู่ที่กว้างขึ้นในแผนภาพด้านบน

ในการดึงรูปร่างของมือออกจากสิ่งแวดล้อม เราจำเป็นต้องใช้การมาส์กหรือการกรองสีที่แน่นอน (ในกรณีนี้ – ฟ้าม่วง’) ในการทำเช่นนั้น คุณต้องแปลงรูปภาพจาก BGR เป็นรูปแบบ HSV ที่สามารถทำได้โดยใช้ข้อมูลโค้ดต่อไปนี้

hsv = cv2.cvtColor (เฟรม cv2. COLOR_BGR2HSV)

ตอนนี้ ขั้นตอนต่อไปคือการค้นหาช่วงของพารามิเตอร์ HSV ที่ต้องการเพื่อดึงมือออกผ่านหน้ากากหรือตัวกรอง สำหรับสิ่งนี้ วิธีที่ดีที่สุดคือการใช้แทร็กบาร์เพื่อค้นหาช่วงที่เหมาะสม นี่คือภาพหน้าจอของแถบแทร็กที่ใช้สำหรับโครงการนี้

ขั้นตอนที่ 4:

ภาพ
ภาพ

ขั้นตอนที่ 5:

มีข้อมูลโค้ดด้านล่างเพื่อสร้างแทร็กบาร์สำหรับการสร้างมาสก์:

นำเข้า cv2

นำเข้า numpy เป็น npdef ไม่มีอะไร (x): ส่ง cv2.namedWindow('image') img = cv2. VideoCapture(0) cv2.createTrackbar('l_H', 'image', 110, 255, ไม่มีอะไร) cv2.createTrackbar('l_S ', 'image', 50, 255, ไม่มีอะไร) cv2.createTrackbar('l_V', 'image', 50, 255, ไม่มีอะไร) cv2.createTrackbar('h_H', 'image', 130, 255, ไม่มีอะไร) cv2. createTrackbar('h_S', 'image', 255, 255, nothing) cv2.createTrackbar('h_V', 'image', 255, 255, nothing) while(1): _, frame = img.read()

hsv = cv2.cvtColor(frame, cv2. COLOR_BGR2HSV)lH = cv2.getTrackbarPos('l_H', 'image') lS = cv2.getTrackbarPos('l_S', 'image') lV = cv2.getTrackbar'Pos, ('l_V' 'image') hH = cv2.getTrackbarPos('h_H', 'image') hS = cv2.getTrackbarPos('h_S', 'image') hV = cv2.getTrackbarPos('h_V', 'image') lower_R = np array([lH, lS, lV]) above_R = np.array([hH, hS, hV]) mask = cv2.inRange(hsv, lower_R, above_R) res = cv2.bitwise_and(frame, frame, mask= mask) cv2.imshow('image', res) k = cv2.waitKey(1) & 0xFF if k == 27: break cv2.destroyAllWindows()

ขั้นตอนที่ 6: ส่วนการประมวลผล:

ส่วนประมวลผล
ส่วนประมวลผล

เรามีรูปทรงเรขาคณิตของมือแล้ว ตอนนี้ถึงเวลาที่จะใช้มันและใช้มันเพื่อหาท่าทางของมือ

นูนฮัลล์:

เราพยายามใส่รูปหลายเหลี่ยมโดยประมาณผ่านจุดสุดขั้วที่มีอยู่ในรูปร่างผ่านตัวเรือนูน รูปภาพทางด้านซ้ายแสดงรูปหลายเหลี่ยมโดยประมาณที่กำหนดให้กับรูปร่างโดยมีจุดนูนที่ทำเครื่องหมายด้วยสีแดง

จุดนูนคือจุดที่อยู่ในรูปร่างซึ่งอยู่ห่างจากด้านข้างของรูปหลายเหลี่ยมโดยประมาณนี้มากที่สุด แต่ปัญหาของตัวเรือนูนคือในระหว่างการคำนวณ เราจะได้รับอาร์เรย์ของจุดนูนทั้งหมด แต่สิ่งที่เราต้องการคือจุดนูนแหลมสีน้ำเงิน เราจะบอกคุณว่าทำไมจึงจำเป็น

ในการหาจุดนูนนี้ เราต้องใช้สูตรระยะทางตั้งฉากเพื่อหาระยะห่างของจุดนูนที่มีด้านที่ใกล้ที่สุด เราสังเกตว่าจุดแหลมสีน้ำเงินมีระยะห่างสูงสุดจากด้านข้าง ดังนั้นเราจึงได้จุดนี้

ขั้นตอนที่ 7:

ภาพ
ภาพ

ขั้นตอนที่ 8:

ภาพ
ภาพ

ต่อไปเราต้องหาความเอียงของเส้นที่เชื่อมปลายหัวแม่มือ (หรือจุดสุดขั้ว) กับจุดนูนนี้ด้วยแนวนอน

ขั้นตอนที่ 9:

ภาพ
ภาพ

ในกรณีข้างต้น มุม α ควรอยู่ระหว่าง 0 ถึง 90 องศา หากท่าทางสัมผัสเป็นการเลี้ยวซ้าย นั่นคือ tan(α) ควรเป็นค่าบวก

ขั้นตอนที่ 10:

ภาพ
ภาพ

ในกรณีข้างต้น มุม α ควรอยู่ระหว่าง 180 ถึง 90 องศา หากท่าทางสัมผัสเป็นการเลี้ยวขวา นั่นคือ tan(α) ควรเป็นลบ

ดังนั้น ถ้า Tan α เป็นบวก ให้เลี้ยวซ้าย ถ้า Tan α เป็นลบ ให้เลี้ยวขวา ถึงเวลาดูวิธีตรวจหาคำสั่งหยุดที่สำคัญที่สุด

ในที่นี้ อัตราส่วนที่ระบุ (พบจากการชนและการทดลอง) จะถูกตรวจสอบ และในกรณีสูงสุด อัตราส่วนของระยะทางนี้ยังคงอยู่ในช่วงเฉพาะนี้

ขั้นตอนที่ 11:

ภาพ
ภาพ

ในที่สุด ท่าทางการเคลื่อนไหวไปข้างหน้าจะถูกวิเคราะห์โดยฟังก์ชัน matchShape() ใน OpenCV ฟังก์ชันนี้เปรียบเทียบรูปร่างของตัวนับสองตัว ในกรณีนี้ ระหว่างตัวอย่างการฝึกบน thright ในภาพด้านบนกับเส้นขอบทางด้านซ้ายของภาพด้านบน ส่งกลับค่าตั้งแต่ 0 ถึง 2 หรือ 3 ตามรูปแบบที่มีอยู่ในรูปร่างของสองรูปทรง สำหรับรูปร่างที่เหมือนกัน จะส่งกลับ 0

ret = cv2.matchShapes (cnt1, cnt2, 1, 0.0)

ในที่นี้ cn1 และ cnt2 เป็นรูปทรงสองเส้นที่จะนำมาเปรียบเทียบกัน

ขั้นตอนที่ 12: การควบคุมการเคลื่อนไหว:

การควบคุมการเคลื่อนไหว
การควบคุมการเคลื่อนไหว

PySerial:

เราใช้ไลบรารี PySerial ของ python เพื่อแปลงข้อมูลที่ประมวลผลเป็นข้อมูลอนุกรมเพื่อสื่อสารกับ Arduino Uno ผ่าน Arduino USB Cable เมื่อตรวจพบท่าทางสัมผัสเฉพาะโดย opencv เราได้สร้างตัวแปรชั่วคราวที่บอกว่า 'x' และกำหนดค่าที่ไม่ซ้ำกันให้กับมันและแปลงเป็นอินพุตแบบอนุกรมโดยใช้บรรทัดคำสั่งต่อไปนี้: -

นำเข้าซีเรียล #เพื่อนำเข้าไลบรารี Pyserial

serial. Serial('', baudrate = '9600', timeout = '0') # setting up serial output.. PORT NAME คือชื่อพอร์ตที่การรับส่งข้อมูลจะเกิดขึ้น

serial.write(b'x') # x คือตัวอักษรที่ส่งไปยังพอร์ต …b คือการแปลงสตริงนี้เป็นไบต์

การประมวลผล Arduino:

ตอนนี้ Arduino ได้รับการเข้ารหัสในลักษณะที่แต่ละอนุกรม x ต่างกันถูกแมปเชิงเส้นกับการกระทำบางอย่างที่รับผิดชอบสำหรับการเคลื่อนไหวที่ราบรื่นของหุ่นยนต์ (เช่นการตรวจจับท่าทางซ้ายจะทำให้มอเตอร์ทางด้านขวาเพื่อเลี้ยวซ้าย) เราสามารถควบคุมการเคลื่อนที่ของล้อแต่ละล้อได้ทั้งแบบแปลและหมุนโดยเปลี่ยนรหัสอย่างเหมาะสม

L298N ตัวขับมอเตอร์:-

Motor Driver ถูกใช้เป็นตัวกลางระหว่างมอเตอร์และแหล่งพลังงาน เนื่องจากมอเตอร์ไม่สามารถขับเคลื่อนโดยตรงได้เนื่องจากพิกัดแรงดันไฟฟ้าต่ำ แบตเตอรี่ Li-Po เชื่อมต่อกับขั้วอินพุต 12V และเราเชื่อมต่อซ็อกเก็ต 5V ของ Arduino กับซ็อกเก็ตอินพุต 5V ของไดรเวอร์มอเตอร์ ในที่สุดเชื่อมต่อกับกราวด์ของ Li-Po และ Arduino ในซ็อกเก็ตกราวด์ทั่วไปของไดรเวอร์มอเตอร์

ตอนนี้ขั้วต่อของมอเตอร์เชื่อมต่ออยู่ที่ซ็อกเก็ตที่ให้ไว้ ในที่สุดเราก็เชื่อมต่อขั้วอินพุตสำหรับมอเตอร์กับซ็อกเก็ตเอาต์พุต PWM ของ Arduino ทำให้เราตัดสินใจเกี่ยวกับการหมุนและการแปลของการเคลื่อนไหวได้อย่างแม่นยำ

แนะนำ: