Господа, вопрос по алгоритму на смекалку)) имеется флюгер с аналоговым выходом, допустим 0-5 вольт. Сигнал преобразуется в градусы 0–359. Видимо из-за особенности конструкции, флюгер дрейфует +/- 15 градусов. Поэтому нужно сгладить по среднему значению за N секунд. Но загвоздка в следующем. Как быть с серверным направлением, при переходе с 359 в 0 градусов, аналоговый сигнал также проваливается с 5 до 0 вольт. Как получить средние значения, когда выборка данных состоит из значений 345-359 и 0-15 градусов
Комментарии: 13
Anonim
в качестве среднего значения выбирается число с наименьшей дисперсией (центральная точка). Также вместо вычитания используется модульное расстояние (то есть, расстояние по окружности). Например, модульное расстояние между 1° и 359° равно 2°, а не 358° (на окружности между 359° и 360°==0° - один градус, между 0° и 1° - тоже 1°, в сумме - 2°).
Z-vladimir
Как это математически описать?
Anonim
https://qastack.ru/programming/491738/how-do-you-calculate-the-average-of-a-set-of-circular-data это много букв надо читать ) но задача у же встречалась такая и решение тоже. Где то уже видел как считали положение флюгера по оптопаре и выводили среднее тоже решали такую проблему. Но думаю вам предстоит много чтиво, ибо каждый решает свою задачу и нет общего решения
Anonim
мне вот это решение понравилось, и алгоритма на Java
Z-vladimir
Это подходит для получения среднего значения двух векторов. В принципе можно использовать совместно при получении минимального и максимального значения за определенное время. Только вот арктангенс с двумя аргументами не для плк)). Вообще мойпервый вариант получился такой. Вычисляю косинус и синус полученного угла A=sin(x) и B=cos(x) и разбиваю на два потока обратным преобразованием в градусы M=arcsin(A) и N=arccos(B) , которое усредняю. Готовы результат через if, если значение M положительное, то результат равен N , а если M отрицательное, то результат равен 360-N . В целом приемлемо, но есть нюанс при усреднении в положениях около 180 и около 360 градусов. Например при двух точках 355 и 10 значения N равно -5 и 10, среднее значение точное и соответствует 2,5. А вот M всегда положительное 5 и 10, среднее уже неправильное и равно 7.5. Вариант разбить на секторы и получать значение через синус или косинус, в зависимости от направления, но как-то уже выглядит с костылями. Ищется возможный вариант упрощения
Strat
А какая должна быть скорость опроса, и главное - в каком виде данные на выходе? Именно в цифрах в градусах? Есть мысль что 0 не нужно вообще использовать, а абстрагировать так сказать выходную величину
Z-vladimir
Пока визуализация в градусах
Strat
А скорость?
Z-vladimir
В смысле игнорировать переходное состояние?
Strat
Да, мысль витает где-то не не могу пока ухватиться за неё Грубо говоря, не смотреть на текущий угол, а заполнять буфер текущей позиции постепенно, только не ограничиваться 360 градусов, а взять например 3 полных оборота
Z-vladimir
Система достаточно инертная, главное чтобы значение соответствовала действительности Так ведь выходной сигнал при переходе 359-0 с 5 вольт сразу в ноль сваливается
Z-vladimir
Ну кстати мысль, данные можно сохранять в массив с нужным количеством для сглаживания, и проверять есть ли значения около нуля и около 359 из последних данных, если больше значений около 359, то из малых значений можно получить 360+ или наоборот, если больше значений околонулевых, остальные сделать отрицательными
Strat
я бы именно не привязывался к "абсолютному углу", а взял большой жирный размах - нам то не важно на какой конкретно градус флюгер повернут прямо сейчас - важно увидеть настоящее значение - а оно будет получено именно относительно предыдущего) всё в тех же градусах - но минуя невозможность нормально усреднить без сложной геометрии из-за численно большой разницы а на выходе 0-360 градусов уже можно конвертировать из услоного числа с учетом полных оборотов - 36000