Слежение за лицом через Huskylens
- Войдите на сайт для отправки комментариев
Прошу форумчан пнуть в нужном направлении. Бьюсь уже несколько дней)
Связка Ардуино Уно и AI камера Huskylens плюс 2 сервы. Стоит задача поиска и слежения за лицом. Вчасти слежения за лицом реализовать удалось. В части поиска лица (поворот сервы в одну сторону и в другую) не совсем.
Есть код:
#include <Servo.h> // подключаем библиотеку для работы с сервоприводом
#include "HUSKYLENS.h"
#include "SoftwareSerial.h"
Servo servo1;
Servo servo2;
HUSKYLENS huskylens;
SoftwareSerial mySerial(A4, A5); // RX, TX
//HUSKYLENS green line >> Pin 10; blue line >> Pin 11
void printResult(HUSKYLENSResult result);
int angle1 = 80;
int angle2 = 95;
void setup() {
Serial.begin(115200);
servo1.attach(5);
servo2.attach(3);
servo1.write(angle1);
servo2.write(angle2);
Wire.begin();
while (!huskylens.begin(Wire))
{
Serial.println(F("Begin failed!"));
Serial.println(F("1.Please recheck the \"Protocol Type\" in HUSKYLENS (General Settings>>Protocol Type>>I2C)"));
Serial.println(F("2.Please recheck the connection."));
delay(100);
}
huskylens.writeAlgorithm(ALGORITHM_FACE_RECOGNITION);
}
void loop() {
if (!huskylens.request()) Serial.println(F("Fail to request data from HUSKYLENS, recheck the connection!"));
else if(!huskylens.isLearned()) Serial.println(F("Nothing learned, press learn button on HUSKYLENS to learn one!"));
else if(!huskylens.available()) Serial.println(F("No block or arrow appears on the screen!")); // Если лицо не обнаружено, в мониторе выводится это сообщение
else {
HUSKYLENSResult result = huskylens.read();
printResult(result);
// Код слежения за лицом (работает)
if (result.xCenter>200) {
Serial.println(result.xCenter);
angle1 -= 1;
servo1.write(abs((constrain(angle1, 10, 170))));
delay (10);
}
else if (result.xCenter>10 && result.xCenter <120 ) {
angle1 += 1;
servo1.write(abs((constrain(angle1, 10, 170))));
delay (10);
}
if (result.yCenter>150) {
angle2 -=1.5;
servo2.write(abs((constrain(angle2, 75, 140))));
delay (30);
}
else if (result.yCenter>10 && result.yCenter <100 ) {
angle2 +=1.5;
servo2.write(abs((constrain(angle2, 75, 140))));
delay (30);
}
}
}
void printResult(HUSKYLENSResult result){
if (result.command == COMMAND_RETURN_BLOCK){
Serial.println(String()+F("Block:xCenter=")+result.xCenter+F(",yCenter=")+result.yCenter+F(",width=")+result.width+F(",height=")+result.height+F(",ID=")+result.ID);
}
else if (result.command == COMMAND_RETURN_ARROW){
Serial.println(String()+F("Arrow:xOrigin=")+result.xOrigin+F(",yOrigin=")+result.yOrigin+F(",xTarget=")+result.xTarget+F(",yTarget=")+result.yTarget+F(",ID=")+result.ID);
}
else{
Serial.println("Object unknown!");
}
}
Как я понял, когда лицо обнаружено, срабатывает условие из 46 строчки, как только лицо теряется, срабатывает из 44 строки.
Когда лицо не обнаружено, хочу сделать, чтобы серва крутила камеру в поисках лица. Но как только я вставляю код поворота сервы в условие 44 строки, даже при обнаружении лица, условие из 46 строки уже не срабатывает. Серва так и продолжает крутить камеру от 0 до 180 градусов.
Что я делаю не так?
И еще вопрос.
В loop в 42, 43 и 44 строках указаны восклицательные знаки. Насколько я понимаю. знак ! - отрицание. К чему он в этих переменных?
if (!huskylens.request()) Serial.println(F("Fail to request data from HUSKYLENS, recheck the connection!"));
else if(!huskylens.isLearned()) Serial.println(F("Nothing learned, press learn button on HUSKYLENS to learn one!"));
else if(!huskylens.available())
И еще вопрос.
В loop в 42, 43 и 44 строках указаны восклицательные знаки. Насколько я понимаю. знак ! - отрицание. К чему он в этих переменных?
Очевидно, функции возвращают некоторое число, причем число 0 соответствует ошибке. Инверсия нужна для того, чтобы условный оператор реагировал на ошибку, а не на ее отсутствие.