Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Mobil Robot Pelacak Wajah Cerdas

Komponen dan persediaan

Creator Ci20
× 1
SparkFun Dual H-Bridge driver motor L298
× 1
Baterai Li-Ion 1000mAh
× 1
Servo (Tower Pro MG996R)
× 2
Kamera (umum)
× 1
Kit Basis Robot GoPiGo Dexter Industries
× 1
Arduino Nano R3
× 1
Sensor Ultrasonik - HC-SR04 (Generik)
× 1

Aplikasi dan layanan online

Arduino IDE
OpenCV

Tentang proyek ini

Itu adalah mobil yang melacak wajahmu, jika aku pergi dia datang!

Anda harus menginstal ini (Ci20):

  • Opencv
  • Python
  • Izin perbaikan port serial

Saya menggunakan distro Debian 8 install &download

Saya menggunakan:

  • Kamera laptop lama (daur ulang)
  • Modul rentang ultrasonik HC - SR04
  • Baterai x2 3.7v 4000mah (laptop bekas daur ulang)
  • Servo x2
  • Konverter DC-DC
  • Arduino nano
  • Perangkat dasar robot
  • x2 L298d

Untuk instalasi gunakan perintah berikut di terminal.

Untuk memperbarui linux.

sudo apt-get update # Mengambil daftar pembaruan yang tersediaSudo apt-get upgrade # Memutakhirkan paket saat ini dengan ketatSudo apt-get dist-upgrade # Menginstal pembaruan (yang baru) 

BukaCV. Ini adalah versi 2.4.9.1 yang tidak mutakhir, tetapi berfungsi dengan baik.

sudo apt-get install libopencv-dev python-opencv 

Jika Anda ingin mengkompilasi OpenCV dari sumbernya, saya menemukan tutorial ini.

Instal PySerial.

sudo apt-get install python python-serial 

Kami mengubah izin port serial, jika Anda menggunakan USB atau asli.

sudo chown ci20:ci20 /dev/ttyUSB0 #Port serial USB dari Arduinosudo chown ci20:ci20 /dev/ttyS1 #Port serial asli di Ci20 

Menjalankan skrip python (mengubah nol jika Anda memiliki lebih dari satu sumber video, ini akan memilih sumber).

sudo python facetrackingcar.py 0 

Untuk sedikit meningkatkan kinerja, gambar yang diambil tidak ditampilkan jika Anda ingin melihatnya, Anda harus mencari dan menghapus komentar pada baris ini.

#cv.ShowImage("result", img)#cv.NamedWindow("result", 1)#cv.DestroyWindow("result") 

Anda harus memiliki haarcascade_frontalface_alt.xml file di direktori yang sama dengan skrip.

Video hanya untuk melacak kamera di Windows

Video demo di Ci20

Umpan balik dan peningkatan dipersilakan.

Kode

  • faceser.py
  • Car.ino
  • scanlinux.py
faceser.pyPython
Python scrip OpenCV face traking
#!/usr/bin/python"""Program ini adalah demonstrasi untuk deteksi wajah dan objek menggunakan fitur seperti haar.Program ini menemukan wajah dalam gambar kamera atau aliran video dan menampilkan kotak merah di sekitarnya, lalu pusatkan webcam melalui dua servo sehingga wajah berada di tengah layarBerdasarkan facedetect.py di direktori sampel OpenCV"""import sysfrom optparse import OptionParserimport serialimport cv2.cv as cvimport time# Parameter untuk deteksi haar# Dari API:# Parameter default (scale_factor=2, min_neighbors=3, flags=0) disetel# untuk deteksi objek yang akurat namun lambat. Untuk operasi yang lebih cepat pada video nyata# gambar, pengaturannya adalah:# scale_factor=1.2, min_neighbors=2, flags=CV_HAAR_DO_CANNY_PRUNING,# min_size=>> servo.move(2, 90) ... # "move servo #2 hingga 90 derajat"''' if (min_pwm <=angle <=max_pwm):ser.write(chr(255)) ser.write(chr(servo)) ser.write(chr(angle)) else:print "Servo sudut harus bilangan bulat antara 0 dan 180.\n"if __name__ =='__main__':ser=serial.Serial(port='/dev/ttyUSB0',baudrate=115200,timeout=1) #ser=serial.Serial (port='/dev/ttyS0',baudrate=115200,timeout=1) #ser=serial.Serial(port='COM14',baudrate=115200,timeout=1) # parse opsi baris cmd, atur Haar classifier parser =OptionParser(penggunaan ="penggunaan:%prog [opsi] [camera_index]") parser.add_option("-c", "--cascade", action="store", dest="cascade", type="str", help="Haar cascade file, default %default", default ="./haarcascade_frontalface_alt.xml") (options, args) =parser.parse_args() cascade =cv.Load(options.cascade) if len(args) !=1:parser.print_help() sys.exit(1) input_name =arg s[0] if input_name.isdigit():capture =cv.CreateCameraCapture(int(input_name)) cv.SetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_WIDTH, 320) cv.SetCaptureProperty(capture, cv.CV_CAP_CAP_PROP_FRAME)else print, " s[0] Kami membutuhkan masukan kamera! Tentukan indeks kamera mis. 0" sys.exit(0) # cv.NamedWindow("result", 1) if capture:frame_copy =Tidak ada gerakan(panGpioPin, servoPanPosition) move(tiltGpioPin, servoTiltPosition) while True:start =time.time() frame =cv .QueryFrame(capture) jika bukan frame:cv.WaitKey(0) break jika bukan frame_copy:frame_copy =cv.CreateImage((frame.width,frame.height), cv.IPL_DEPTH_8U, frame.nChannels) jika frame.origin ==cv.IPL_ORIGIN_TL:cv.Copy(frame, frame_copy) else:cv.Flip(frame, frame_copy, 0) midScreenX =(frame.width/2) midScreenY =(frame.height/2) midFace =detect_and_draw(frame_copy, cascade) jika midFace bukan Tidak ada:midFaceX =midFace[0] midFaceY =midFace[1] #Cari tahu apakah komponen X dari wajah berada di kiri tengah layar. if(midFaceX <(midScreenX - midScreenWindow)):#Perbarui variabel posisi pan untuk menggerakkan servo ke kanan servoPanPosition +=panStepSize print str(midFaceX) + "> " + str(midScreenX) + " :Pan Right :" + str(servoPanPosition) #Cari tahu apakah X komponen wajah adalah ke r ight dari tengah layar. elif(midFaceX> (midScreenX + midScreenWindow)):#Update variabel posisi pan untuk memindahkan servo ke kiri. servoPanPosition -=panStepSize print str(midFaceX) + " <" + str(midScreenX) + " :Pan Left :" + str(servoPanPosition) else:print str(midFaceX) + " ~ " + str(midScreenX) + " :" + str(servoPanPosition) servoPanPosition =min(servoPanPosition, max_pwm) servoPanPosition =max(servoPanPosition, min_pwm) move(panGpioPin, servoPanPosition) #Cari tahu apakah komponen Y dari wajah berada di bawah tengah layar. if(midFaceY <(midScreenY - midScreenWindow)):if(servoTiltPosition <=90):#Perbarui variabel posisi kemiringan untuk menurunkan servo kemiringan. servoTiltPosition -=tiltStepSize print str(midFaceY) + "> " + str(midScreenY) + " :Tilt Down :" + str(servoTiltPosition) #Cari tahu apakah komponen Y dari wajah berada di atas tengah layar. elif(midFaceY> (midScreenY + midScreenWindow)):if(servoTiltPosition>=1):#Perbarui variabel posisi kemiringan untuk menaikkan servo kemiringan. servoTiltPosition +=tiltStepSize print str(midFaceY) + " <" + str(midScreenY) + " :Tilt Up :" + str(servoTiltPosition) start =1; akhir =1; lain:print str(midFaceY) + " ~ " + str(midScreenY) + " :" + str(servoTiltPosition) servoTiltPosition =min(servoTiltPosition, max_pwm) servoTiltPosition =max(servoTiltPosition, min_pwm) move(tiltGpioPin) else:#Position servo akhir pengukuran waktu end =time.time()+0.1 var +=0.1 # mendapatkan waktu yang telah berlalu time_elapsed =int(end - start + var) # informasi pencetakan print 'time elapsed:\t{}'.format(time_elapsed) print ' var:\t{}'.format(var) if time_elapsed ==20:move(3, servoTiltPosition) servoPanPosition =90 servoTiltPosition =45 var=0; if cv.WaitKey(1)>=0:# 1ms delay break #cv.DestroyWindow("result")
Car.inoArduino
#include #define MA_1 2#define MA_2 3#define MB_1 4#define MB_2 5#define MC_1 6#define MC_2 7#define MD_1 8#define MD_2 9#define SERVOX_PIN 11#define SERVOY_PIN 10 #define trigPin 13#define echoPin 12// Input pengguna untuk servo dan posisiServo servo;Servo servox;int x =90, prevX;int y =45, prevY;int userInput[3]; // input mentah dari buffer serial, 3 byte startbyte; // mulai byte, mulai membaca inputint servo; // servo mana yang akan di pulse?int pos; // sudut servo 0-180int i; // iteratorint State =LOW;unsigned long beforeMillis =0 , val =100;;const long interval =100;bool scana =false;unsigned long currentMillis;void setup() { inicializate(); currentMillis =milis();}void loop() { // Tunggu input serial (min 3 byte dalam buffer) if (Serial.available()> 2) { // Baca byte pertama startbyte =Serial.read(); // Jika itu benar-benar byte awal (255) ... if (byte awal ==255) { // ... lalu dapatkan dua byte berikutnya untuk (i =0; i <2; i++) { userInput[i] =Serial.baca(); } // Byte pertama =servo bergerak? servo =masukan pengguna[0]; // Byte kedua =posisi yang mana? pos =masukan pengguna[1]; // Pengecekan dan pemulihan kesalahan paket jika (pos ==255) { servo =255; } // Tetapkan posisi baru ke sakelar servo (servo) yang sesuai { kasus 1:servoy.write(pos); // pindahkan servo1 ke 'pos' break; kasus 2:servox.write(pos); kisaran (pos); merusak; kasus 3:pindai (45); pindai (65); merusak; default:istirahat; } } }}void scan(int val) { while (Serial.available() ==0) { servoy.write(val); unsigned long currentMillis =milis(); if (Millis saat ini - Mili sebelumnya>=interval) { Mili sebelumnya =Milis saat ini; servox.write(pos); if (Status ==RENDAH ) { pos +=1; if (pos ==130) { Status =TINGGI; } } else { pos -=1; if (pos ==40) { Status =RENDAH; merusak; } } } }}jarak jauh() { durasi panjang, jarak; digitalWrite(trigPin, RENDAH); // Menambahkan baris ini delayMicroseconds(2); // Menambahkan baris ini digitalWrite(trigPin, HIGH); delayMicroseconds(10); // Menambahkan baris ini digitalWrite(trigPin, LOW); durasi =pulseIn(echoPin, TINGGI); jarak =(durasi / 2) / 29.1; return distance;}void range(int pos) { if ((pos>=80 ) &(pos <=100)) { move(); } else if ((pos>=100 ) &(pos <=180)) { kiri(); penundaan (10); Berhenti(); } else if ((pos>=1 ) &(pos <=80)) { kanan(); penundaan (10); Berhenti(); }}void move() { jarak jauh, jarak sebelumnya; jarak =jarak(); if (val <=80) { terbalik(); penundaan (50); Berhenti(); } else if (val>=140) { maju(); penundaan (50); Berhenti(); } if (jarak>=jarak sebelumnya) { val =(jarak - jarak sebelumnya); } else if (jarak <=jarak sebelumnya) { val =(jarak sebelumnya - jarak); } sebelumnyadistance =jarak;}kosongkan inicializate() { Serial.begin(115200); pinMode(MA_1, OUTPUT); pinMode(MA_2, OUTPUT); pinMode(MB_1, OUTPUT); pinMode(MB_2, OUTPUT); pinMode(MC_1, OUTPUT); pinMode(MC_2, OUTPUT); pinMode(MD_1, OUTPUT); pinMode(MD_2, OUTPUT); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); servox.attach(SERVOX_PIN); servoy.attach(SERVOY_PIN);}void forward() { digitalWrite(MA_1, HIGH); digitalWrite(MA_2, RENDAH); digitalWrite(MB_1, TINGGI); digitalWrite(MB_2, RENDAH); digitalWrite(MC_1, TINGGI); digitalWrite(MC_2, RENDAH); digitalWrite(MD_1, TINGGI); digitalWrite(MD_2, LOW);}tidak berlaku sebaliknya () { digitalWrite(MA_1, LOW); digitalWrite(MA_2, TINGGI); digitalWrite(MB_1, RENDAH); digitalWrite(MB_2, TINGGI); digitalWrite(MC_1, RENDAH); digitalWrite(MC_2, TINGGI); digitalWrite(MD_1, RENDAH); digitalWrite(MD_2, HIGH);}batalkan kanan() { digitalWrite(MA_1, LOW); digitalWrite(MA_2, TINGGI); digitalWrite(MB_1, RENDAH); digitalWrite(MB_2, TINGGI); digitalWrite(MC_1, TINGGI); digitalWrite(MC_2, RENDAH); digitalWrite(MD_1, TINGGI); digitalWrite(MD_2, LOW);}kosongkan kiri() { digitalWrite(MA_1, HIGH); digitalWrite(MA_2, RENDAH); digitalWrite(MB_1, TINGGI); digitalWrite(MB_2, RENDAH); digitalWrite(MC_1, RENDAH); digitalWrite(MC_2, TINGGI); digitalWrite(MD_1, RENDAH); digitalWrite(MD_2, HIGH);}void Stop() { digitalWrite(MA_1, LOW); digitalWrite(MA_2, RENDAH); digitalWrite(MB_1, RENDAH); digitalWrite(MB_2, RENDAH); digitalWrite(MC_1, RENDAH); digitalWrite(MC_2, RENDAH); digitalWrite(MD_1, RENDAH); digitalWrite(MD_2, RENDAH);}void StopH() { digitalWrite(MA_1, TINGGI); digitalWrite(MA_2, TINGGI); digitalWrite(MB_1, TINGGI); digitalWrite(MB_2, TINGGI); digitalWrite(MC_1, TINGGI); digitalWrite(MC_2, TINGGI); digitalWrite(MD_1, TINGGI); digitalWrite(MD_2, HIGH);}
scanlinux.pyPython
Pindai port serial linux
#! /usr/bin/env python"""\Pindai port serial. Varian khusus Linux yang juga menyertakan USB/Serialadapters.Bagian dari pySerial (http://pyserial.sf.net)(C) 2009 """import serialimport globdef scan():"""memindai port yang tersedia. mengembalikan daftar nama perangkat. pvergain@houx:~/PDEV1V160_CodesRousseau/Soft/PC/test_boost/serialport/pyserial$ python scanlinux.py Port yang ditemukan :/dev/ttyS0 /dev/ttyS3 /dev/ttyS2 /dev/ttyS1 /dev/ttyACM0 /dev/serial/by-id/usb-id3_semiconductors_MEABOARD_00000000-if00 """ mengembalikan glob.glob('/dev/ttyS*' ) + glob.glob('/dev/ttyUSB*') + glob.glob('/dev/ttyACM*') + glob.glob('/dev/serial/by-id/*')if __name__==' __main__':print "Found ports:" untuk nama di scan():print name

Suku cadang dan penutup khusus

scrip Python pelacakan wajah OpenCV dan Kode Arduino FaceTrakingCar.rar

Skema

Menggunakan arduino untuk mengontrol motor dan servo, pin-out dapat bervariasi.

Proses manufaktur

  1. Arduino Digital Dice
  2. Game Roulette LED 37 DIY
  3. ATtiny85 Mini Arcade:Ular
  4. Detektor Jangkauan Portabel
  5. MobBob:Robot Arduino DIY Dikendalikan oleh Smartphone Android
  6. Robot Piano Terkendali Arduino:PiBot
  7. Elektroplating dengan Tembaga
  8. NeoMatrix Arduino Pong
  9. Robot Ramah Pelacakan Orang Omni-Directional
  10. Pembuat Urutan Ringan