Пишем программу для вывода логов формата CSV
Уже давно являюсь обладателем системы ПитЛаб.
С наземной станции которой можно получить весьма развёрнутый лог практически всех параметров полёта. Всего их больше тридцати…
Просматривать эти логи можно только через питлабовский фпв менеджер, но там отображается лишь маршрут на карте и моментальные значения некоторых параметров. Но зато можно конвертировать этот лог в файл CSV. В принципе если нужно то можно потом его изучать в экселе. Но это очень не удобно.
Было решено написать программу для вывода, ещё давно хотел выучить какой то язык. Выбор пал на Java. Примером мне послужила программа от Кастл.
В итоге спустя месяц, родил програмку.
И того:
*могу рисовать все численные данные лога в виде графика (так же есть не численные, например статус автопилота).
*Все графы нормируются, в смысле если графе дистанция, максимальное значение 5000, а в угол крена 90, то оба этих графа будут читаться одинаково на экране. Это позволяет в дальнейшем применять зумирование не по отдельности к каждому графу, а ко всем сразу.
*Само “листание” и зумирование осуществляется мышкой.
так же, как и в кастловской программе, можно просто выбрать правой кнопкой мыши какую то часть экрана и она растянется на весь экран. Так же это можно сделать колёсиком.
*Есть четыре уровня “сглаживания”: от оригинала, до очень сильного.
*Выбор нужных данных осуществляется “на лету”.
*решил повыпендриваться и написал метод для так называемой сплайн интерполяции. С помощью которой число точек возрастает в пять раз.
Но появляются артефакты (похожие артефакты можно встретить на жпег картинках). Плюс пересчёт занимает около 10-20 секунд.
Нужно поэкспериментировать с разными условиями уравнений, что бы убрать эти артефакты. Пока что этот способ лишь для “галочки”, нужно дорабатывать.
*Так же решил добавить способ получения отчёта параметров батареи в таблице эксель. То есть можно открыв лог, сгенерировать очёт\таблицу с разрешением xls, в которую пишется макс\средний\мин напряжение, средний\максимальный ток, затраченная энергия в Вт\ч, затраченная ёмкость, продолжительность полёта, дата и порядковый номер. Если такая таблица уже создана, то в неё можно эти данные дописывать.
*Добавил свой граф по которому видно эффективность полёта в Вт\ч на километр.
* По просьбе трудящихся запилил конвертер в IGC формат, его воспринимают некоторые программки большой авиации, по типу того же SeeYou.
Буквально сегодня допилил функцию просчёта среднего ветра.
На удивление считает достаточно точно. Просмотрел около 10 своих старых логов, везде ветер показывает правильно.
Что хочу доделать:
*Вместе с графиками выводить одновременно статистику полёта, сделать это отключаемо.
Добавить к табличке сводки батареи, вторую таблицу (на втором листе xls файла) Статистику полёта. Добавить опцию для комментария - то есть когда вы сохраняете лог в эту таблицу, могли вписать свою информацию о полёте.
* Не горит, но хочу сделать несколько “тем-расцветок”. Сейчас фон на котором рисуются графики светлый, хочу добавить чёрный или близкий к нему.
По большому счёту в течении часика, могу переделать на вывод лога с какой то другой системы, не только ПитЛаб.
Теперь немного грусти… Из за того что жава требует установленную виртуальную машину жава, решил использовать программу Jet excelsior, который на выходе создаёт вариант программы, которой не нужно машина жавы. И я не знаю почему, но винда ругается на возможный вред. То есть при первом открытии нужно насильно разрешить винде открывать эту программу.
Кто знает решение этой проблемы, буду очень благодарен за помощь.
Версия с установщиком:
drive.google.com/open?id=0B-tFJd0x5X5xaklHWDdLYmM5…
Версия просто архив:
drive.google.com/open?id=0B-...Ug2NE5xVU8wOTA
“ветрометра” в этой версии ещё нет…
Программа открывается только после загрузки Питлабовского лога. Если кто хочет посмотреть вот пример такого лоа:
drive.google.com/open?id=0B-tFJd0x5X5xQmFobEFmTEJK…
…, решил использовать программу Jet excelsior, который на выходе создаёт вариант программы, которой не нужно машина жавы. И я не знаю почему, но винда ругается на возможный вред. То есть при первом открытии нужно насильно разрешить винде открывать эту программу.
Кто знает решение этой проблемы, буду очень благодарен за помощь.
Винда на любой исполняемый файл ругается при первом запуске - типа функция безопасности. Это не значит, что винда считает этот файл - вирусом, она лишь считает его подозрительным (незнакомый цифровой сертификат, неизвестный источник файла и т.д.), в некоторых случаях это может спасти нерадивого пользователя от вриусни.
А что бы этого не было, нужно как то сертифицировать? И если эта сертификация стоит денег, как же тогда весь бесплатный софт?
Небольшое обновление:
Полностью переделал шкалу времени. Теперь она не статическая и более читабельна.
Доработал некоторые непонятки с управлением при повторной загрузке нового лога.
Добавлена панель статистики. Его нужно включить в меню настройках, по умолчанию оно выключено.
Изменил сохраняемую информацию в эксель табличке: теперь сохраняется вся статистика + личные комментарии о полёте.
( обещаю, больше изменять её не буду. Как говорится в последний раз…)
По крайней мере попытался высчитать направление и скорость ветра. Работает в большинстве случаев. Не работает, если ветер каждый раз менялся и весь полёт проходил с постоянным набором\потерей высоты. Сбор статистики ведётся только на около нулевой вертикальной скорости и ±1А от среднего арифметического тока за весь полёт. Датчик воздушной скорости в расчёте роли не играет.
drive.google.com/open?id=0B-tFJd0x5X5xNFoxdUpCT2tI…
нужно как то сертифицировать? И если эта сертификация…
- Скорее всего получение цифровой подписи (которая будет через сервисы маздая как-то верифицироваться) стоит каких-то денег, а потом этой подписью можно любой свой исполняемый файл “подписать”. Про платформы распространения M$ я не вникал, может там эта цифровая подпись автоматом выдается при заведении аккаунта. При этом “ругаться” при первом запуске может и на продукты крупных издателей;
- К спободности/платности самого софта это отношения не имеет и вообще не является, по сути, ограничением;
- В вашем случае ругается не на вашу ява-программу, а на софтину, которая предоставляет обёртку с ВМ.
Вообще, все это полная ерунда и забивать ею мозг не стоит.
Раз уж взялся писать…
- программа должна запоминать старый путь до файла, задалбывает каждый раз ей один и тот же путь указывать… Причём должна запоминать даже после выхода из программы и нового входа…
- Выбор отражаемых параметров должен быть так же на главном экране, либо снизу либо сбоку… каждый раз лазить в меню некомильфо…
- Зумм должен производиться относительно перекрестия (мышки) как это делается во всех уважающих себя программах… Сейчас получается что экран зумируется и всё уезжает вниз или вверх…
По первому пункту, проблем нет, сделаем.
По второму… Сбоку точно нет…Что ни будь придумаю.
По поводу зума, главный инструмент в зуме это выделение правой кнопкой мыши, при этом выделенная часть растягивается на весь экран.
Зумирование с колёсиком прикрутил в последнюю очередь и то, только для обратного зума. Постараюсь поправить.
Печаль, что не используете увеличение правой кнопкой.
Зумирование с колёсиком прикрутил в последнюю очередь и то, только для обратного зума. Постараюсь поправить.
Печаль, что не используете увеличение правой кнопкой.
Зум колесом с привязкой к точке курсора - это стандарт во всех смотрелках графика.
Да и что там править, там математика проста как два рубля:
- Найти координаты графика под курсором;
- Координаты пределов графика пересчитать в дельты относительно координат под курсором;
- Умножтить дельты на коэффициент (меньше 1, если приближаем, и больше 1, если откатываем);
- Из дельт пересчитать обратно в координаты пределов.
- Ну и всякие доп. проверки на случай потопа и пожара: чтобы верхний предел всегда был выше нижнего, чтобы сохранялись пропорции, может быть, чтобы за пределы графика не выглядывало.
Такс… Зум по перекрестию есть.
Список Сергея добью и выложу.
В общем всё готово:
*При повторном открытии файла, диалог открывается с последне-выбранной директории.
*Панель “галочек” теперь отображается в главном окне, естественно включается\отключается.
*Зум колёсиком бъёт прицельно по кресту.
drive.google.com/open?id=0B-tFJd0x5X5xdmwyWkhDODBR…
Теперь немного о смешном, попробовал нарисовать иконку… Рассчитывал на силуэт самолёта, получил зонтик блин…
Вообще, все это полная ерунда и забивать ею мозг не стоит.
Пока все свои, то да.
Но как только программа будет написана не для “своих”, это уже будет напрягать…
Я бы например два раза подумал, увидев такое сообщение при открытии незнакомой программы, разрешать винде или нет…
Скриншот программы с панелью выбора графов.
В конкретном случае можно увидеть точность определения ветра.
Красный граф скорость гпс, малиновый курс. Минимум скорости как раз на 50 градусов и полный размах перепада скоростей около 22 км\ч.
Что точно посчитано и выведено в панели статистики.
Так же привожу таблицу, которую можно создать и дополнять.
Всего пять категорий параметров: зелёный - общие, красный - параметры батареи, синий - лётные данные, оливковый - ветер и жёлтый - комментарии.
Таблицу изменять больше не буду, как и говорил раньше. А то запарит каждый раз званого всю статистику заполнять.
Обнаружился баг, который валит программу на этапе загрузки. Баг очень редкий, уже поправил, но выкладывать пока не буду.
Подожду пока не наберу чуток по больше изменений.
Баг случается, если не обнаруживается ни одной строчки в логе с средним значением тока ±1А.
Продолжаем…
Поменял алгоритм с сплайн третей степени на сплайн Акима. Теперь нет тех диких выбросов и тем самым это позволило не применять фильтр. Что в свою очередь повысило скорость просчёта и реально добавить информативность, а не только её иллюзию. По прежнему кол-во точек увеличивается в 5 раз.
Скорость просчёта Акима без сглаживания около секунды.
Вот для наглядности с обычной линейной и Акимовской:
Баг случается, если не обнаруживается ни одной строчки в логе…
Есть правило хорошего тона - перед любой операцией деления проверять, что делитель != 0.
А при старте любой функции, если та работает с неким массивом, первым делом проверять, что массив != null. Точнее если равен: if (data == null) return;
PS: просто к слову, прошу простить, если надоедаю 😒
Да сам затупил малёх, вернее не ожидал такого момента.
Для просчёта ветра, создаю два массива на 360 ячеек. Далее с некоторыми условиями, прохожу по всему логу и суммирую скорости в этот массив в ячейку подходящую под курс .Во второй массив при каждом прибавлении скорости, прибавляю единицу. На выходе два массива, один с “интегрированной” скоростью, другой с счётчиком, так же по каждому курсу. Далее каждую ячейку первого массива, делю на соответствующее значение счётчика, с проверкой на ноль.
В итоге получаю массив с средними скоростями по каждому курсу.
Следующий шаг, выбираю курс с наибольшей скоростью. Так вот на этом этапе, я не мог предположить, что возможен случай, когда в массиве, вообще ни окажется ни одного значения.
Теперь организовал следующую проверку: разбиваю массив на 8 секторов. И в каждом секторе, обязано быть хотя бы одно значение, если нет, то просчёт прерывается и выдаёт нули, что говорит о невозможности определения ветра.
То есть, если максимальная 60км\ч курсом 120, и даже курсом 300 есть значение скорости 50км\ч, это ничего не значит, если в массиве нет хотя бы по одному значению скорости в других секторах (скажем от 0 до 45, 46-90 и тд…), так как может быть самолёт не летал по ветру с условиями по которым, скорость учитывается в изначальной интеграции.
Условия пока следующие: ток ±1А от среднего по всему логу, вертикальная скорость ±0.7м/с. Можно ещё проанализировать угол тангажа и проверить, когда первых двух условий не хватает и пробивается “левое значение скорости”.
Можно пойти путём, которым пошли разрабы Питлаба. То есть можно отслеживать темп изменения курса (то есть частное) и выявить участки, где курс меняется на 360 градусов при одинаковом темпе разворота (можно задать нижний придел этого темпа) и без скачков тока.
Тогда попадание будет сто пудовым. Но это будет работать только на тех логах, на которых пилот совершал такие развороты.
Переделал алгоритм усреднения угловых величин.
То есть раньше усреднение скажем 358 градусов и 2 градуса, давало 180, что бред ядерный. Теперь суммируется как вектор и на примере 358 и 2, даст ответ 0.
Кстати, в последнее время в связи просмотра большого кол-ва всяких логов, заметил одну не понятную мне особенность. Я и раньше замечал, но не придавал особого внимания.
Так вот, летим мы допустим с одинаковым газом и одинаковой воздушной скоростью строго по ветру (наземная при этом равна воздушная +ветер), потом разворачиваемся на 180 и летим с той же воздушной против ветра (наземная при этом равна воздушная - ветер). Но теперь обращаю внимание на тангаж, он же относительный угол атаки (воздушная скорость не поменялась, вертикальная в обеих случаях 0). Так вот почему при полёте ПО ветру, тангаж меньше, чем при полёте против ветра? В обеих случаях воздушка одинаковая, почему меняется тангаж?
Полет по ветру и против - без изменения высоты?
А как тангаж измеряется?
В градусах… Не понял вопроса…
Не понял вопроса…
Не в чём измеряется, а как измеряется. Показания IMU или, ну не знаю, может через траекторию по жыпиэс?
Показания с IMU.
Сейчас думаю, как выводить данные статуса автопилота. Всего два вида: сам статус типа выкл\стаб\авто и параметры навигации, коих много.
Рисовать слова на графике не вариант, так как всё будет сливаться.
Идея следующая: на графике (где ни будь сверху) рисуем широкую полосу . Цвет полоски зависит от статуса: типа красный - выкл, зелёный - стаб, синий - авто. Далее там где параметр навигации поменялся, выводим вертикальную чёрную линию на цветной полосе. То есть будет наглядно видно режим автопилота и где поменяли режим навигации. На панели статистики, добавить окно автопилота и уже там будет видно какая именно навигация, то есть только там будет текстовая информация. Другого решения я не нашёл.
Да, кодировать цветом - нормальный вариант
А тангаж на сколько градусов отличался по ветру и против?
Перепад около 1.5-2 градуса… Единственное, что приходит на ум, низходящие\восходящие потоки помимо ветра и мой Х8 в соответствии куда они дуют, поднимает или опускает нос…
Такс… Как и говорил организовал вывод статуса автопилота и его навигацию.
Малость подкорректирую меню и выложу. Хочу включение\отключение панели статистики и панели с “галками” вывести наружу в виде кнопок.
Шаг следующий, получение информации онлайн через СОМ порт…
Перепад около 1.5-2 градуса.
Так это тупо разные режимы могут быть! Диапазон допустимых углов атаки от 0 до 12 с хвостом градусов. Конечно, не у любого реального самолета можно во всем даиапазоне этих углов нащупать полетные режимы, но перепад в пару градусов - запросто.
PS: а на планшетах и профих моб. устройствах не пробовали запускать?
Нет, не пробовал. Что бы открыть полноценный jar, нужно устанавливать JRE на андроид, что требует рут права и прочий головняк.
Да и как то несуразно swing библиотеку открывать на телефоне…