Господа, вопрос по алгоритму на смекалку)) имеется флюгер с аналоговым выходом, допустим 0-5 вольт. Сигнал преобразуется в градусы 0–359. Видимо из-за особенности конструкции, флюгер дрейфует +/- 15 градусов. Поэтому нужно сгладить по среднему значению за N секунд. Но загвоздка в следующем. Как быть с серверным направлением, при переходе с 359 в 0 градусов, аналоговый сигнал также проваливается с 5 до 0 вольт. Как получить средние значения, когда выборка данных состоит из значений 345-359 и 0-15 градусов

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

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

  2. Strat

    А какая должна быть скорость опроса, и главное - в каком виде данные на выходе? Именно в цифрах в градусах? Есть мысль что 0 не нужно вообще использовать, а абстрагировать так сказать выходную величину

    • Z-vladimir

      Пока визуализация в градусах

      • Strat

        А скорость?

    • Z-vladimir

      В смысле игнорировать переходное состояние?

      • Strat

        Да, мысль витает где-то не не могу пока ухватиться за неё Грубо говоря, не смотреть на текущий угол, а заполнять буфер текущей позиции постепенно, только не ограничиваться 360 градусов, а взять например 3 полных оборота

        • Z-vladimir

          Система достаточно инертная, главное чтобы значение соответствовала действительности Так ведь выходной сигнал при переходе 359-0 с 5 вольт сразу в ноль сваливается

        • Z-vladimir

          Ну кстати мысль, данные можно сохранять в массив с нужным количеством для сглаживания, и проверять есть ли значения около нуля и около 359 из последних данных, если больше значений около 359, то из малых значений можно получить 360+ или наоборот, если больше значений околонулевых, остальные сделать отрицательными

          • Strat

            я бы именно не привязывался к "абсолютному углу", а взял большой жирный размах - нам то не важно на какой конкретно градус флюгер повернут прямо сейчас - важно увидеть настоящее значение - а оно будет получено именно относительно предыдущего) всё в тех же градусах - но минуя невозможность нормально усреднить без сложной геометрии из-за численно большой разницы а на выходе 0-360 градусов уже можно конвертировать из услоного числа с учетом полных оборотов - 36000

Не нашли ответ?

Вам также может быть интересно