цифровая электроника
вычислительная техника
встраиваемые системы

 
» » » Распознавание движений с помощью доплеровского радара НВ100 для Аурдино


Распознавание движений с помощью доплеровского радара НВ100 для Аурдино

Автор: Mike(admin) от 7-01-2021, 11:55

Случайно в интернете попалась информация по идентификации различных видов распальцовки на датчике жестов APDS-9960. Попутно натолкнулся еще и на радар НВ100. Торкнула мысль – а почему бы с его помощью не пораспознавать всякие телодвижения? Захотелось проверить идею. В закоулках чума нашлась Распознавалка - мои алгоритмы 80-х годов прошлого века под задачи ВПК – сейчас называется «Бубен».


Идея.


Радар НВ100 не реагирует на статичные объекты, игнорирует помехи в виде шума, пыли, температуры, освещения. Говорят, что может увидеть движущийся объект за стеной, обладает дальностью измерения 20 метров, на которой чувствует движение пальцев.


При движении пациента в зоне радара имеет место динамичное изменение амплитуды и частоты сигнала во времени, а раз так, то этот сигнал можно связать с конкретными телодвижениями. Задача - в конечном итоге скрестить Аурдину и радар НВ100 в автономную распознавалку движений пациента.


Тех средства.


Приобрел Arduino Uno и доплеровский радарный модуль НВ100 (хунвейбин продакшен), а также причиндалы – макетные платы, провода. Из-за отсутствия в чуме ОУ, работающих с низким напряжением питания (LM358 и тем более TLV247x) усилитель для НВ100 был выполнен на оказавшемся под рукой ОУ 584УН1А. Однако при совокуплении с НВ100 прилично зашумел. Пришлось использовать питание от внешних источников. Для управления сбором сигналов к Аурдине подключил кнопку на длинном проводе для ножного запуска записи. Для контроля состояния сигнала радара на выходе усилителя поставлен осциллограф С1-112. Скетч для оцифровки и сбора сигналов простой, подсмотрен из различных источников.


Распознавание движений с помощью доплеровского радара НВ100 для Аурдино




const int buttonPin = 2; //к цифровому входу №2 подкл. кнопка с другим конт. на землю
boolean Button = false;  //флаг остановки или запуска ввода данных
int dataHB100 = 0;       //принимает сигнал с НВ100
unsigned long lastTime;  //для частоты дискретизации (таймера)

void setup() {  
pinMode(buttonPin, INPUT);     // цифровой пин №2 на ввод
digitalWrite(buttonPin, HIGH); //подключаем подтягивающий резистор к пин №2
pinMode(13, OUTPUT);           // объявляем пин 13 как выход для контроля светодиодом
}
void loop() {  
int buttonState = digitalRead(buttonPin); // считываем состояние кнопки
               //если кнопка нажата и флаг false - начать вывод сигнала
if (buttonState == LOW && Button == true) { 
    Serial.begin(115200); //включить порт и начать ввод данных
    Button = false; // флаг что была остановка
    digitalWrite(13, HIGH); // включаем светодиод   
                 }
               //проверка условия что кнопка не нажата и флаг остановки был
if (buttonState==HIGH && Button == false) { 
   Serial.end();            // закрыть порт остановить вывод данных
   Button = true;           // восстановил исходные условия 
   digitalWrite(13, LOW);   //выключаем светодиод
     }        
 
if (millis() - lastTime >= 1) {      //читать АЦП каждую 1 миллисекунду
         lastTime = millis();        // просто таймер
        dataHB100 = analogRead(A0);  // Чтение на алоговом входе А0   
        Serial.println(dataHB100);   // Вывод данных 0-1023 с АЦП
        }
}

Сбор данных.


Не долго думая, для распознавания выбраны следующие движения. 0.Исходное, 1. Летят перелетные утки - два взмаха, 2. Пионер – один салют, 3. Винт – два оборота, 4. Халлова – 2-3 движения руки.


Распознавание движений с помощью доплеровского радара НВ100 для Аурдино

Дистанции для записи сигналов выбраны 1.5м и 2,5м. Подтягиваем ножную кнопку на дистанцию. Включаем оборудование. Загружаем скетч сбора данных. Открываем Монитор порта Аурдино. Выходим на дистанцию. Принимаем исходную позу. Ждем перехода радара в статический режим. Ногой нажимаем кнопку, запуская запись в Монитор порта. Выполняем выбранное движение с возвратом в исходное положение. Ждем перехода радара в статический режим. Повторяем движение... Отпускаем кнопку, останавливая запись. В Мониторе порта выделяем весь массив данных Ctrl+A, копируем его Ctrl+C. Открываем Блокнот компьютера и вставляем данные Ctrl+V, сохраняем их как txt файл. Очищаем Монитор порта под следующую запись.


Так собрано 3 блока по 6 сигналов от каждого из 4-х движений с 2-х дистанций. Всего 144 сигнала целей.


Ханами (созерцание) сигналов.


Созерцаем реальные сигналы. Надо рассмотреть в них характерные особенности – признаки, по которым можно эти сигналы различать. После процедуры Scratch turnip отмечаем – у одноименных целей динамика амплитуд во времени в целом сохраняется. Также можно выделить частотные интервалы сигналов, по которым цели различаются. По всему этому целесообразно вычислять признаки в амплитудно-частотной области. Ни коим образом не надо преобразования Фурье, Уолша, Адамара и других уважаемых лиц. Для Аурдины пусть будут простые, не ресурсоемкие алгоритмы. Из неприятного – у радара НВ100 ну совсем не очень воспроизводимость деталей сигналов при одинаковых телодвижениях.


Обработка.


Берем «Бубен» (без него никак), запеваем чукотскую песню с не сложным ладомелодическим строением. Препарируем сигнал и анализируем подходящие обработки.


Распознавание движений с помощью доплеровского радара НВ100 для Аурдино

Распознавание движений с помощью доплеровского радара НВ100 для Аурдино

Распознавание движений с помощью доплеровского радара НВ100 для Аурдино

Распознавание движений с помощью доплеровского радара НВ100 для Аурдино

Выбрал двух полупериодное детектирование, пару простейших усредняющих фильтров. Кстати, эти обработки можно реализовать до АЦП аппаратно и тем самым разгрузить вычислительные ресурсы Аурдины. Еще добавил захват сигнала. После обработки сигналы выглядят так.


Распознавание движений с помощью доплеровского радара НВ100 для Аурдино

Разбиваем сигналы на фрагменты и вычисляем признаки. Один фрагмент сигнала переводится в вектор из 10 признаков. Способ вычисления самый примитивный – на уровнях сигнала. Пересеченность признаков целей выглядит так.


Распознавание движений с помощью доплеровского радара НВ100 для Аурдино

Распознавалка.


Вариант 1.


Самый простой. Надеваем розовые очки и принимаем всю имеющуюся базу признаков от 144-х записей сигналов как полную, охватывающую все вариации сигналов при разных условиях, т.е. идеальный случай. Или же определяем конечную цель как распознавание исключительно этих сигналов. Бьем в «Бубен» и звеним колокольчиками (бубенчики пока не нужны). По всей имеющейся базе признаков формируем распознавалку. Подтягиваем исходные txt файлы сигналов, проводим их распознавание и оцениваем результат. Имело место 1 ложное срабатывание.


Распознавание движений с помощью доплеровского радара НВ100 для Аурдино

При распознавании одного из сигналов Винт в одном из его фрагментов была идентифицирована Утка. Итого из 144 сигналов правильно распознаны 144, пропусков цели 0, ложное срабатывание 1. Чем полнее база – тем надежнее результат. Но всё-таки абсолютно полная база это маловероятный случай.


Вариант 2.


Неполная база. Делим на две кучки имеющиеся сигналы - на обучающую и контрольную. При этом ни один сигнал в одной половине базы не повторяется в другой. Стучим Бубном о голову, потому что следующее решение выбрано «в лоб».


Распознавание движений с помощью доплеровского радара НВ100 для Аурдино

Формируем распознавалку из одной половины имеющейся базы признаков. Распознаем исходные сигналы. Смотрим результат. На идентификацию подано 144 сигнала, правильно опознано 100, пропусков цели 44, ложных распознаваний 22.


Разогреваем бубен, начинаем с мелких ударов в него, сопровождая протяжными выкриками «ай-яй» в естественной тесситуре. Поем заунывные песни народов севера, Методом научного тыка – некоторые ученые называют его стохастическим, ищем вариант приличной распознавалки. Теория скорее всего есть, но мне она неизвестна. Один из вариантов дает результат - из 144 сигналов правильно распознаны 108, пропусков цели 36, ложных срабатываний 13.


Включаемся в танцы с «Бубном». Двигаясь шагом по кругу, издаем горловые звуки. Ускоряем темп с переходом шагов в прыжки. Формируем 4 отдельные распознавалки для каждой цели. Склеиваем все четыре в одну общую в виде последовательной линейной иерархии. В «Бубне» реализовал только этот линейный вариант. Проводим распознавание исходных сигналов и оцениваем результат.


Из 144 сигналов правильно распознаны 97, пропусков цели 47, ложных срабатываний 2. Есть в «Бубне» методы, которые могут улучшить этот результат, в том числе и использование признаков с хорошим разделяющим эффектом. Но это требует несколько большего ресурса памяти. Продолжать не стал. Не собирался реализовывать в железе эту идею.


Распознавание движений с помощью доплеровского радара НВ100 для Аурдино

Впихнуть не впихуемое.


Я совсем не программист (скорее пародия) и вот моя оценка потребности в ресурсах. Циклический буфер под прием сигнала с АЦП (в значениях 0-1023) размером в 4000 отсчетов (2*4=8 Кб). Два буферных целочисленных массива, которые используются в обработках, такого же размера (2*2*4=16 Кб). Целочисленные массивы констант. Для распознавалки 1-го варианта или 2-го промежуточного - массивы констант размерностью 11х10 и 11х70 (~ 1.6 Кб). Для варианта, склеенного из 4-х распознавалок, массивы констант размерностью 11х10 и 11х130 (~ 3 Кб). На переменные как целочисленные так и с плавающей запятой пусть будет 0,5 Кб. Итого конечный вариант отслюнит 27,5 Кб памяти.


Распознавание движений с помощью доплеровского радара НВ100 для Аурдино

Программный код не сложный, но сколько места займет не знаю. Производительности Аурдины для работы в реальном времени вполне хватит, так как при частоте дискретизации сигнала 1 кГц шаг смещения окна распознавания (шаг фрагментации) по сигналу составлял 100 отсчетов или 100 мс (шаг может быть и больше).


Выводы.


  1. Для Аурдинщиков всех времен и народов «Бубен» может быть полезным инструментов для реализации различных своих замыслов. Не знаю такого направления, где нельзя применить методы распознавания. На мой взгляд, наиболее интересные задачи в биометрии.
  2. Для идентификации движений пациента скорее всего более эффективным был бы вариант на паре радаров с распознаванием по разностному сигналу. Но вызывает сомнение воспроизводимость сигналов радарами. Есть также мысль, что распознавание видов распальцовки должна быть более удачной на паре светодиодов и одном фотоприемнике. Будет скучно – попробую.

Цели.


Хотелось, что бы нашлась бы группа энтузиастов, которые перенесут «Бубен» на современную программную платформу с комфортным интерфейсом и дополнят более продвинутыми методами. При создании коммерческой версии обязательно должна быть бесплатная для распространения широкому кругу пользователей.


Для любознательных. Алгоритмы, заложенные в «Бубен» создавались, когда процессор Z80 был пределом мечтаний, а двух стольный компьютер Д3-28 с языком программирования Васек радовал своими возможностями. Это к тому, что в ту пору задача создания автономных устройств распознавания требовала решения на весьма ограниченных аппаратных возможностях. Появился компьютер Электроника 60, но сменилась эпоха. Пришли эффективные менеджеры и инженеры стали не нужны. Их заменили «медночайзерами» - специалистами по расстановке посуды на прилавках магазинов. Пришлось выживать в других отраслях уже не народного хозяйства и все наработки были заброшены.


В «Бубне» слабо проработаны способы оптимизации распознавалки, да и те, которые есть, мало использовались. Поэтому для любознательных есть широкое поле деятельности. Как уже говорил - теория скорее всего есть, но мне она неизвестна.




15.12.2020 Chukcha


chukchachum@yandex.ru




Теги: Arduino, радар




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий