Слежение за лицом через 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 соответствует ошибке. Инверсия нужна для того, чтобы условный оператор реагировал на ошибку, а не на ее отсутствие.