Слежение за лицом через Huskylens

dennche70
Offline
Зарегистрирован: 23.01.2022

Прошу  форумчан пнуть в нужном направлении. Бьюсь уже несколько дней)

Связка Ардуино Уно и 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())

 

 

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

dennche70 пишет:

И еще вопрос.

В loop в 42, 43 и 44 строках указаны восклицательные знаки. Насколько я понимаю. знак ! - отрицание. К чему он в этих переменных?

Очевидно, функции возвращают некоторое число, причем число 0 соответствует ошибке. Инверсия нужна для того, чтобы условный оператор реагировал на ошибку, а не на ее отсутствие.