мне тоже не понятно, какие выгоды даст прогнозирование аппогея
- - - Добавлено - - -
для избежания случайного срабатывания есть способ проще - учитывать изменения в значениях серии высоты
мне тоже не понятно, какие выгоды даст прогнозирование аппогея
- - - Добавлено - - -
для избежания случайного срабатывания есть способ проще - учитывать изменения в значениях серии высоты
давайте возьмём график второго полёта Мрии и проверим, чей алгоритм сработает лучше - а именно, не сломается на тех скачках давления и даст наиболее точное значение апогея
с меня проверка параболы
на всякий случай скажу, что все эти параболы никак не меняют моего мнения, какой датчик апогея лучше, о чём я писал здесь:
http://forum.modelka.com.ua/threads/...l=1#post724642
я программку написал на си, только типа для ардуины, она в рил-тайме считает время апогея
с небольшими манипуляциями можно заюзать где и как угодно.Код:struct TmpData { int i; int x; int y; int x2; int x3; int x4; int xy; int x2y; } tmpVars; void setup() { memset(&tmpVars, 0, sizeof(TmpData)); } void loop() { int x; int y; // - SETUP x AND y! // x - current time in milliseconds // y - current altitude int apogeeTime = processData(x, y, tmpVars); } int processData(int x, int y, TmpData& tmp) { int x2 = x*x; tmp.i++; tmp.x += x; tmp.y += y; tmp.x2 += x2; tmp.x3 += x2 * x; tmp.x4 += x2 * x2; tmp.xy += x * y; tmp.x2y += x2 * y; if(tmp.i < 3) return -1; int d = calcMatrix(tmp.x2, tmp.x, tmp.i, tmp.x3, tmp.x2, tmp.x, tmp.x4, tmp.x3, tmp.x2); if(d == 0) return -1; int da = calcMatrix(tmp.y, tmp.x, tmp.i, tmp.xy, tmp.x2, tmp.x, tmp.x2y, tmp.x3, tmp.x2); int db = calcMatrix(tmp.x2, tmp.y, tmp.i, tmp.x3, tmp.xy, tmp.x, tmp.x4, tmp.x2y, tmp.x2); float a = (float)da/(float)d; if(a == 0) return -1; float b = (float)db/(float)d; float ret = -(b/(2*a)); return ret; } int calcMatrix(int a1, int b1, int c1, int a2, int b2, int c2, int a3, int b3, int c3) { return a1*b2*c3+b1*c2*a3+a2*b3*c1-a3*b2*c1-a2*b1*c3-a1*b3*c2; }
только обязательно сначала обнулить tmpVars, а потом там будет обновляться инфа с каждой итерацией
да, можно, для контроллера нужна оптимизация максимальная.
и еще. я его потестил только что, так там небольшие погрешности возникают из-за того, что я везде инты заюзал. если время - это будут тысячи милисекунд, а высота сотни метров, то погрешность небольшая.
и еще, вычисление коэф-тов нужно написать так:
float a = (float)da/(float)d;
........
float b = (float)db/(float)d;
а то деление целочисленное выполнится на интах...
- - - Добавлено - - -
там не просто квадрат икса считается, а сразу сумма квадратов.
можно поменять код на такой:
Код:int x2 = x*x; tmp.i++; tmp.x += x; tmp.y += y; tmp.x2 += x2; tmp.x3 += x2 * x; tmp.x4 += x2 * x2; tmp.xy += x * y; tmp.x2y += x2 * y;
Прогнал данные второго полета Мрии через усреднение 10 последовательных значений разности приращений высоты и сделал вывод, даже такой простой алгоритм точно бы определил момент прохождения аппогея.
1 - ошибка
2 - истина
3 - расчет усреднением разницы
- - - Добавлено - - -
Чем больше последовательность усреднения - тем больше фильтрация ошибок, но больше задержка в моменте определения аппогея (10 - отлично, 5 хуже но приемлимо, 3 - есть ошибки).
Цена новой версии составит две разбитых ракеты
почему две?
в 75-й тоже был маленький скачок?
есть её график?
- - - Добавлено - - -
пробую параболу
взял данные второго полёта Мрии, в приложении
реальный апогей, определённый глазом - 7.8с с начала подъёма
построил параболу по точкам первой секунды полёта, парабола естественно получилась вершиной вниз, мы разгоняемся
M2.xls
- - - Добавлено - - -
парабола 0-2 с
тоже пока вершиной вниз
- - - Добавлено - - -
0-3 с
вершина вверх, прогноз апогея на 9.1с, поздно
- - - Добавлено - - -
0-4 с
вершина очень далеко
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)