สารบัญ:

หุ่นยนต์ติดตามบอล: 8 ขั้นตอน
หุ่นยนต์ติดตามบอล: 8 ขั้นตอน

วีดีโอ: หุ่นยนต์ติดตามบอล: 8 ขั้นตอน

วีดีโอ: หุ่นยนต์ติดตามบอล: 8 ขั้นตอน
วีดีโอ: เลือก รูบิค อะไร?? Which Rubik will choose? 2024, พฤศจิกายน
Anonim
หุ่นยนต์ติดตามบอล
หุ่นยนต์ติดตามบอล
หุ่นยนต์ติดตามบอล
หุ่นยนต์ติดตามบอล
หุ่นยนต์ติดตามบอล
หุ่นยนต์ติดตามบอล

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

หมายเหตุ: การมอบหมายชิ้นส่วนนี้ส่งไปยัง Deakin University, School of IT, SIT-210 Embedded Systems Development

เสบียง

www.hackster.io/junejarohan/ball-tracking-robot-7a9865

ขั้นตอนที่ 1: บทนำ

บทนำ
บทนำ

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

ระบบเฝ้าระวังกลางแจ้งใดๆ จะต้องสามารถติดตามวัตถุที่เคลื่อนไหวในขอบเขตการมองเห็น จำแนกวัตถุเหล่านี้ และตรวจจับกิจกรรมบางอย่างของพวกมัน ฉันได้พัฒนาวิธีการติดตามและจำแนกวัตถุเหล่านี้ในสถานการณ์จริง การติดตามวัตถุในกล้องตัวเดียวดำเนินการโดยใช้การลบพื้นหลัง ตามด้วยการติดต่อตามภูมิภาค โดยพิจารณาจากสัญญาณชี้นำหลายอย่าง รวมถึงความเร็ว ขนาด และระยะทางของกรอบกั้นเขต

ขั้นตอนที่ 2: วัสดุและซอฟท์แวร์ที่ใช้ในโครงการนี้

วัสดุและซอฟท์แวร์ที่ใช้ในโครงการนี้
วัสดุและซอฟท์แวร์ที่ใช้ในโครงการนี้
วัสดุและซอฟท์แวร์ที่ใช้ในโครงการนี้
วัสดุและซอฟท์แวร์ที่ใช้ในโครงการนี้
วัสดุและซอฟท์แวร์ที่ใช้ในโครงการนี้
วัสดุและซอฟท์แวร์ที่ใช้ในโครงการนี้

ส่วนประกอบฮาร์ดแวร์ที่ใช้:

  • ราสเบอร์รี่ Pi (x1)
  • โมดูลกล้อง Raspberry Pi (x1)
  • อัลตราโซนิกเซนเซอร์ (x3)
  • SparkFun Dual H-Bridge ตัวขับมอเตอร์ L298 (x1)
  • มอเตอร์กระแสตรง (x1)
  • เขียงหั่นขนม (x1)
  • สายเชื่อมต่อ

ซอฟต์แวร์ที่ใช้:

OpenCV

เครื่องมือช่าง:

Python

ขั้นตอนที่ 3: จะทำอย่างไร?

ระบบเฝ้าระวังกลางแจ้งใดๆ จะต้องสามารถติดตามวัตถุที่เคลื่อนไหวในขอบเขตการมองเห็น จำแนกวัตถุเหล่านี้ และตรวจจับกิจกรรมบางอย่างของพวกมัน ฉันได้พัฒนาวิธีการติดตามและจำแนกวัตถุเหล่านี้ในสถานการณ์จริง การติดตามวัตถุในกล้องตัวเดียวดำเนินการโดยใช้การลบพื้นหลัง ตามด้วยการติดต่อตามภูมิภาค โดยพิจารณาจากสัญญาณชี้นำหลายอย่าง รวมถึงความเร็ว ขนาด และระยะทางของกรอบกั้นเขต

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

สำหรับการวิเคราะห์ภาพ ฉันกำลังถ่ายแต่ละเฟรมแล้วปิดบังด้วยสีที่ต้องการ จากนั้นฉันก็หารูปทรงทั้งหมดและหาที่ใหญ่ที่สุดในหมู่พวกเขาแล้วมัดเป็นรูปสี่เหลี่ยมผืนผ้า และแสดงสี่เหลี่ยมบนภาพหลักและค้นหาพิกัดของจุดศูนย์กลางของสี่เหลี่ยม

ในที่สุด บอทจะพยายามนำพิกัดของลูกบอลมาที่ศูนย์กลางของแกนพิกัดของมัน นี่คือการทำงานของหุ่นยนต์ สิ่งนี้สามารถปรับปรุงเพิ่มเติมได้โดยใช้อุปกรณ์ IoT เช่นอนุภาคโฟตอนซึ่งสามารถแจ้งให้คุณทราบเมื่อตรวจพบสิ่งและหุ่นยนต์กำลังติดตามหรือเมื่อหุ่นยนต์หลงทางและตอนนี้กำลังกลับสู่ฐาน.

เพื่อวัตถุประสงค์ในการประมวลผลภาพ คุณต้องติดตั้งซอฟต์แวร์ OpenCV บน raspberry pi ของคุณ ซึ่งค่อนข้างยุ่งยากสำหรับฉัน

คุณสามารถรับข้อมูลที่จำเป็นในการติดตั้ง OpenCV ผ่านลิงค์นี้: คลิกที่นี่

ขั้นตอนที่ 4: แผนผัง

Image
Image
แผนผัง
แผนผัง
แผนผัง
แผนผัง

ด้านบน ฉันได้จัดเตรียมแผนผังสำหรับโครงการของฉันและพร้อมกับเป็นแผ่นวงจรพิมพ์ (PCB)

และนี่คือการเชื่อมต่อหลักบางส่วนที่คุณต้องทำ:

• ก่อนอื่นโมดูลกล้อง Raspberry Pi เชื่อมต่อโดยตรงกับ Raspberry Pi

• เซ็นเซอร์อัลตราโซนิก VCC เชื่อมต่อกับเทอร์มินัลทั่วไปเช่นเดียวกับ GND (กราวด์) และพอร์ตที่เหลืออีกสองพอร์ตของเซ็นเซอร์อัลตราโซนิกเชื่อมต่อกับหมุด GPIO บน Raspberry Pi

• มอเตอร์เชื่อมต่อโดยใช้สะพาน H

• จ่ายไฟโดยใช้แบตเตอรี่

ฉันได้เพิ่มวิดีโอที่อาจช่วยให้เข้าใจการทำงานของเซ็นเซอร์อัลตราโซนิกและวิธีการทำงาน

และคุณสามารถไปตามลิงก์นี้หากคุณไม่พบวิดีโอด้านบน

ขั้นตอนที่ 5: ทำอย่างไร

ฉันทำโครงงานนี้โดยวาดภาพหุ่นยนต์พื้นฐานที่สามารถติดตามลูกบอลได้ หุ่นยนต์ใช้กล้องในการประมวลผลภาพโดยการถ่ายเฟรมและติดตามลูกบอล ใช้คุณสมบัติต่าง ๆ ในการติดตามลูกบอล เช่น สี ขนาด รูปทรง

หุ่นยนต์พบสีที่ฮาร์ดโค้ดแล้วค้นหาลูกบอลสีนั้นและติดตามมัน ฉันได้เลือก Raspberry Pi เป็นไมโครคอนโทรลเลอร์ในโครงการนี้เพราะช่วยให้เราใช้โมดูลกล้องและให้ความยืดหยุ่นอย่างมากในโค้ดเนื่องจากใช้ภาษาไพ ธ อนซึ่งเป็นมิตรกับผู้ใช้มากและยังช่วยให้เราใช้ไลบรารี OpenCV เพื่อวิเคราะห์ภาพ

มีการใช้สะพาน H เพื่อเปลี่ยนทิศทางการหมุนของมอเตอร์หรือหยุดมอเตอร์

สำหรับการวิเคราะห์ภาพ ฉันกำลังถ่ายแต่ละเฟรมแล้วปิดบังด้วยสีที่ต้องการ จากนั้นฉันก็หารูปทรงทั้งหมดและหาที่ใหญ่ที่สุดในหมู่พวกเขาแล้วมัดเป็นรูปสี่เหลี่ยมผืนผ้า และแสดงสี่เหลี่ยมบนภาพหลักและค้นหาพิกัดของจุดศูนย์กลางของสี่เหลี่ยม

ในที่สุด บอทจะพยายามนำพิกัดของลูกบอลมาที่ศูนย์กลางของแกนพิกัดของมัน นี่คือการทำงานของหุ่นยนต์ สิ่งนี้สามารถปรับปรุงเพิ่มเติมได้โดยใช้อุปกรณ์ IoT เช่น อนุภาคโฟตอน ซึ่งสามารถแจ้งให้คุณทราบเมื่อมีการตรวจพบสิ่งของและหุ่นยนต์กำลังติดตามหรือเมื่อหุ่นยนต์หลงทางและตอนนี้กำลังกลับสู่ฐาน. และในการทำเช่นนี้ เราจะใช้แพลตฟอร์มซอฟต์แวร์ออนไลน์ที่เชื่อมต่ออุปกรณ์ต่างๆ และช่วยให้พวกเขาดำเนินการบางอย่างกับทริกเกอร์เฉพาะที่เป็นทริกเกอร์ IFTTT

ขั้นตอนที่ 6: รหัสหลอก

รหัสเทียม
รหัสเทียม

นี่คือรหัสหลอกสำหรับส่วนการตรวจจับโดยใช้ OpenCV ที่เราตรวจจับลูกบอล

ขั้นตอนที่ 7: รหัส

รหัส
รหัส
รหัส
รหัส
รหัส
รหัส
รหัส
รหัส

ด้านบนคือตัวอย่างโค้ด และด้านล่างคือคำอธิบายโดยละเอียดของโค้ด

#นำเข้าแพ็คเกจที่จำเป็น

เรานำเข้าแพ็คเกจที่จำเป็นทั้งหมด

จาก picamera.array นำเข้า PiRGBArray #เนื่องจากมีปัญหาความละเอียดใน raspberry pi จะไม่สามารถจับภาพเฟรมด้วย VideoCapture

จาก picamera นำเข้า PiCamera นำเข้า RPi. GPIO เป็น GPIO นำเข้าเวลานำเข้า numpy เป็น np

ตอนนี้เราตั้งค่าฮาร์ดแวร์และกำหนด PIN ที่เชื่อมต่อกับ RASPBERRY PI

GPIO.setmode(GPIO.บอร์ด)

GPIO_TRIGGER1 = 29 #ซ้ายเซ็นเซอร์อัลตราโซนิก

GPIO_ECHO1 = 31

GPIO_TRIGGER2 = 36 #เซ็นเซอร์อัลตราโซนิกด้านหน้า

GPIO_ECHO2 = 37

GPIO_TRIGGER3 = 33 #ขวาเซ็นเซอร์อัลตราโซนิก

GPIO_ECHO3 = 35

MOTOR1B=18 #มอเตอร์ซ้าย

MOTOR1E=22

MOTOR2B=21 #มอเตอร์ขวา

MOTOR2E=19

LED_PIN=13 #ถ้าเจอบอลก็จะไฟled

# ตั้งพินเป็นเอาต์พุตและอินพุต

GPIO.setup (GPIO_TRIGGER1, GPIO. OUT) # Trigger GPIO.setup (GPIO_ECHO1, GPIO. IN) # Echo GPIO.setup (GPIO_TRIGGER2, GPIO. OUT) # ทริกเกอร์ GPIO.setup (GPIO_ECHO2, GPIO. IN) GPIO.setup (GPIO_TRIGGER3, GPIO. OUT) # ทริกเกอร์ GPIO.setup (GPIO_ECHO3, GPIO. IN) GPIO.setup (LED_PIN, GPIO. OUT)

# ตั้งค่าทริกเกอร์เป็นเท็จ (ต่ำ)

GPIO.output(GPIO_TRIGGER1, เท็จ) GPIO.output(GPIO_TRIGGER2, เท็จ) GPIO.output(GPIO_TRIGGER3, เท็จ)

ฟังก์ชันนี้ใช้เซ็นเซอร์อัลตราโซนิกทั้งหมดที่รวบรวมระยะทางจากวัตถุรอบ ๆ BOT ของเรา

# อนุญาตให้โมดูลที่จะชำระ

def โซนาร์ (GPIO_TRIGGER, GPIO_ECHO): start=0 stop=0 # ตั้งพินเป็นเอาต์พุตและอินพุต GPIO.setup (GPIO_TRIGGER, GPIO. OUT) # ทริกเกอร์ GPIO.setup (GPIO_ECHO, GPIO. IN) # Echo # ตั้งค่าทริกเกอร์เป็นเท็จ (ต่ำ) GPIO.output (GPIO_TRIGGER, เท็จ) # อนุญาตให้โมดูลชำระ time.sleep (0.01) # ในขณะที่ระยะทาง > 5: # ส่งพัลส์ 10us เพื่อเรียก GPIO.output (GPIO_TRIGGER, True) time.sleep (0.00001) GPIO เอาต์พุต (GPIO_TRIGGER, เท็จ) เริ่มต้น = time.time() ในขณะที่ GPIO.input(GPIO_ECHO)==0 และ time.time()

ทำให้ DC MOTORS ทำงานร่วมกับ RASPBERRY PI

GPIO.setup (MOTOR1B, GPIO.ออก)

GPIO.setup (MOTOR1E, GPIO.ออก)

GPIO.setup (MOTOR2B, GPIO. OUT) GPIO.setup (MOTOR2E, GPIO. OUT)

การกำหนดฟังก์ชันในการใช้งานหุ่นยนต์และทำให้เคลื่อนที่ไปในทิศทางที่แตกต่างกัน

def ไปข้างหน้า ():

GPIO.output(MOTOR1B, GPIO.สูง) GPIO.output(MOTOR1E, GPIO. LOW) GPIO.output(MOTOR2B, GPIO.สูง) GPIO.output(MOTOR2E, GPIO. LOW) def ย้อนกลับ (): GPIO.output (MOTOR1B), GPIO. LOW) GPIO.output(MOTOR1E, GPIO. HIGH) GPIO.output(MOTOR2B, GPIO. LOW) GPIO.output(MOTOR2E, GPIO. HIGH) def rightturn(): GPIO.output(MOTOR1B, GPIO. LOW) GPIO.output(MOTOR1E, GPIO.สูง) GPIO.output(MOTOR2B, GPIO.สูง) GPIO.output(MOTOR2E, GPIO. LOW) def leftturn(): GPIO.output(MOTOR1B, GPIO. HIGH) GPIO.output(MOTOR1E), GPIO. LOW) GPIO.output(MOTOR2B, GPIO. LOW) GPIO.output(MOTOR2E, GPIO.สูง)

def หยุด ():

GPIO.output(MOTOR1E, GPIO. LOW) GPIO.output(MOTOR1B, GPIO. LOW) GPIO.output(MOTOR2E, GPIO. LOW) GPIO.เอาท์พุท(MOTOR2B, GPIO. LOW)

ทำให้โมดูลกล้องทำงานและปรับการตั้งค่า

#กล้องจับภาพ

#initialize กล้องและคว้าการอ้างอิงถึงกล้องจับกล้องดิบ = PiCamera() กล้องความละเอียด = (160, 120) กล้อง. เฟรมเรต = 16 rawCapture = PiRGBArray (กล้อง, ขนาด = (160, 120)) # อนุญาตกล้อง เพื่อวอร์มอัพ time.sleep(0.001)

ตอนนี้ใช้สิ่งสำคัญที่บอทติดตามลูกบอลและหลีกเลี่ยงอุปสรรคใด ๆ

ในขณะที่ (1<10): { #ระยะทางที่มาจากระยะเซ็นเซอร์อัลตราโซนิกด้านหน้าC = โซนาร์ (GPIO_TRIGGER2, GPIO_ECHO2) #ระยะทางที่มาจากระยะเซ็นเซอร์อัลตราโซนิกขวาR = โซนาร์ (GPIO_TRIGGER3, GPIO_ECHO3) #ระยะทางที่มาจากระยะเซ็นเซอร์อัลตราโซนิกซ้าย L = โซนาร์ (GPIO_TRIGGER1, GPIO_ECHO1) if(distanceC=8: rightturn() time.sleep(0.00625) stop() time.sleep(0.0125) forward() time.sleep(0.00625) stop() time.sleep(0.0125) #while found== 0: leftturn() time.sleep(0.00625) elif distanceL>=8: leftturn() time.sleep(0.00625) stop() time.sleep(0.0125) forward() time.sleep(0.00625) stop() time.sleep (0.0125) rightturn() time.sleep(0.00625) stop() time.sleep(0.0125) else: stop() time.sleep(0.01) อื่น: #otherwise มันเคลื่อนไปข้างหน้า () time.sleep(0.00625) if(DistanceC>10): #มันนำพิกัดของลูกบอลมาที่กึ่งกลางแกนจินตภาพของกล้อง if(centre_x=20): if(centre_x0): flag=1 leftturn() time.sleep(0.025) forward() time.sleep(0.00003125) stop() time.sleep(0.00625) อื่น: stop() time.sleep(0.01)

อื่น:

#ถ้าพบลูกบอลและอยู่ใกล้เกินไป ไฟ LED จะสว่างขึ้น GPIO.output(LED_PIN, GPIO. HIGH) time.sleep(0.1) stop() time.sleep(0.1) #cv2.imshow("draw", frame) rawCapture.truncate(0) # clear the stream in prepare for the เฟรมถัดไป }

ทำความสะอาดที่จำเป็น

GPIO.cleanup() #free หมุด GPIO ทั้งหมด

ขั้นตอนที่ 8: ลิงก์ภายนอก

ลิงก์ไปยังวิดีโอสาธิต: คลิกที่นี่ (Youtube)

ลิงก์ไปยังโค้ดบน Git-hub: คลิกที่นี่ (Git-Hub)

แนะนำ: