Телеметрия (часть 1)

mask2002

Мне кажется по изображению с камеры не чуствуется в какую сторону ускорение, а тут ясно будет.

Brandvik

И в какую сторону вам ускорение надо чувствовать? И как вы его хотите чувствовать(в како форме выводить данные с аксеелрометра)?

ReGet
mask2002:

Мне кажется по изображению с камеры не чуствуется в какую сторону ускорение, а тут ясно будет.

Почему не чувствуется? Влево-вправо - отлично видно, куда нос задирается - тоже. На счет изменения высоты - сложнее, но тут не акселерометр нужен, нужно просто дописать индикатор изменения высоты к уже существующей телеметрии

РД00
Brandvik:

И в какую сторону вам ускорение надо чувствовать? И как вы его хотите чувствовать(в како форме выводить данные с аксеелрометра)?

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

Ролик с чем-то подобным лежал на Youtube, жаль, не найду. Там в центре экрана выводился качающийся-отклоняющийся крест наподобие ILS в авиасимуляторах-игрушках.

smalltim

Замечательная вещь, аж завидно. Такая, разве что, кофе сварить не сможет 😃

Мне на качающийся крест, на 99% уверен, ресурсов процессора не хватит. А вот вариометр, индикатор качества RC приема и управление платой телеметрии с передатчика (переключение на крупные шрифты, отключение отображения второстепенных данных по выбору и полное включение-выключение наложения на видео) - скоро будет. Спасибо Vad64 за идею с таймером.

Мануалов по Атмеге накурился до предела, теперь надо найти время и сесть за написание кода… 😃

Потихоньку подготавливаюсь еще к верстанию платы сопряжения с ГПС и горизонтом на пирометрах со вторым процессором на борту.

Кстати, коллеги, где и в каком виде на экране вы бы посоветовали поместить новые строки с данными - вариометр и качество приема RC сигнала, плюс, если надо, положение ручки управляющего канала? Управление телеметрией можно подключить на отдельный канал, а можно хоть к газу, только придется прямо в полете ставить газ, скажем, в ноль, потом сразу в 100%, потом в ноль, и т.д. для управления телеметрией - сами понимаете.

В текущем варианте отображение см здесь: rcopen.com/files/000000000000000000000000

Brandvik

Уровень сигнала вверху слева, а вариометр справа посредине. А как будут выглядить эти данные? Желательно что бы вариометр выглядел в виде полоски которая увеличивается вверх или вниз.

ReGet
РД00:

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

Ролик с чем-то подобным лежал на Youtube, жаль, не найду. Там в центре экрана выводился качающийся-отклоняющийся крест наподобие ILS в авиасимуляторах-игрушках.

Если я правильно понимаю, то акселерометр не может использоваться для создания авиагоризонта, т.к. после того как он один раз соврет (например, как вы сказали, на вираже), далее он будет врать все остальное время. Поэтому телеметрии нужны датчики, которыми она будет видеть настоящий горизонт (пирометры)

Brandvik

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

РД00
ReGet:

Если я правильно понимаю, то акселерометр не может использоваться для создания авиагоризонта, т.к. после того как он один раз соврет (например, как вы сказали, на вираже), далее он будет врать все остальное время.

Нет. В этом отличие акселерометра (датчика линейного ускорения) от гироскопа (датчика углового ускорения с двойным интегрированием). Акселерометр напрямую чувствует силу тяжести, точнее степень совпадения ее направления со своей осью.

Brandvik:

По идее, для не долгого полета хватит и одного хорошего гироскопа, дрейф конечно будет но он не такой уж и большой в течении 10 мин скажем.

Очень сомневаюсь. В свое время имел дело с гироскопами в профессиональной деятельности, причем не с пьезоэлектрическими (как в моделизме), а с на порядки более точными волоконно-оптическими. Так вот для нас разумный сдвиг после интегрирования за десятки минут был недостижимой целью.

Думаю, что вертолетный гироскоп за 10 мин своей “горизонталью” навертит не один десяток оборотов.

smalltim

Vad64> Подавать канальный импульс на ногу ICP можно (лучше через резистор).

А какой именно резистор? 1 кОм пойдет?

smalltim

Ух, как пришлось поизвращаться… 😃

Добавил вывод строк текста вверху экрана. Теперь работа в кадре выглядит так:
ждем - рисуем верхние строки теста - опрашиваем АЦП - делаем математику - ждем - рисуем нижние строки текста

Сделал поддержку крупного и мелкого шрифта и переключения размера шрифта и отключения вывода на экран “на лету”.

Сделал программный вариометр. Не сделал красивое отображение, пока только циферки.

Сделал заглушку для индикации уровня сигнала RC (специальные символы и расположение на экране). Пока не сделал собственно анализ PPM.

Картинки:

Вопросы 😃 :

  1. Какое нужно разрешение вариометра в метрах и единицы измерения? “В лоб”, без включения мозга (как сделано сейчас) разрешение получается 0.75 метров в секунду и единицы измерения, соответственно, метры в секунду.

  2. Делать вариометр на основе показаний высоты, усредненных по 16 пачкам по 64 измерения (как сделано сейчас) некошерно, поскольку в усреднение попадают показания высоты на протяжении последних 1.92 секунд полета. И если, образно говоря, резко и коротко дунуть в датчик давления, то вариометр показывает короткий положительный скачок вертикальной скорости, а через 1.92 секунды - короткий отрицательный. На медленных самолетах 2 секунды не роляют, но всё равно некрасиво.
    По-хорошему, надо делать вариометр на основе неусредненных по 16 пачкам данных, но тогда его показания могут слегка “шуметь”.

Стоит ли овчинка выделки?
Впрочем, всё равно завтра поэкспериментирую, перепробовать надо все варианты.

РД00
smalltim:

Делать вариометр на основе показаний высоты, усредненных по 16 пачкам по 64 измерения (как сделано сейчас)… По-хорошему, надо делать вариометр на основе неусредненных по 16 пачкам данных…

Не думали вместо усреднения по отдельным пачкам применить непрерывную фильтрацию ? Это т.наз Infinite Impulse Responce Filter (IIR).

Напр., пусть у нас есть последовательность отсчетов X0, X1, … Xn, Xn+1 … Тогда результат выражения Yn = A * Yn-1 + (1-A) * Xn будет фильтром НЧ первого порядка для последовательности Xn. Усреднение идет не по конкретному размеру пачки отсчетсчетов, а по непрерывной последовательности предыдущих.

В переводе на псевдокод :

[codebox]# define A (…) // заранее посчитанный параметр А в диапазоне -1…+1

float LowPassFilter(int X) // усредняемый X в диапазоне -1…+1
{
static float Y0;
float Y;

Y = A*Y0 + (1-A)*X;
Y0 = Y;
return Y;
}

// естественно, в реальных вычислениях float’ы заменяются на знаковые int’ы соответствующей разрядности
[/codebox]

При этом коэффициент A вычисляется из требуемой частоты среза фильтра и частоты отсчетов. Грубо говоря, это программно реализованная усредняющая RC-цепочка.

То же самое можно получить для фильтра 2-го порядка, только там будет Yn = A0 * Yn-2 + A1 * Yn-1 + A0 * Xn. При этом, играя с коэффициентами, можно получить разные типы фильтров. Здесь будет полезен фильтр Баттерворта, у которого ступенька на входе не приводит к дребезгу на выходе. Комбинируя такие фильтры последовательно, можно получить фильтр любого порядка. Например, фильтр 4-го из двух таких - это подавление -24 дб/октаву, то есть напр. 2 гц по сравнению с 1 гц подавятся в 16 раз. Я упоминал здесь работу с гироскопами - там, например, удавалось вытащить из-под шума прибора скорость вращения Земли.

Самое веселое здесь - вычисление коэффициентов An. Я их выводил (страшно вспомнить) 13 лет назад для другой задачи и не помню уже решительно ни хера. Если интересно - постараюсь перетряхнуть бекапы и папки с бумажками. Но сейчас наверняка быстрее набить в Яндексе “+IIR +дискретный +фильтр +расчет” и получить чей-нибудь реферат на ту же тему.

smalltim
РД00:

Не думали вместо усреднения по отдельным пачкам применить непрерывную фильтрацию ? Это т.наз Infinite Impulse Responce Filter (IIR).

Понял. У меня сейчас что-то похожее на “непрерывную фильтрацию” с фильтром НЧ первого порядка, только в сумму входит не Хn и Хn-1, а Хn…Хn-16 и все An равны 1/16.
Почитаю, что умные люди в Сети понаписали 😃

serj

То есть у вас прямоугольное скользящее окно.

Это не совсем аналог RC-цепочки, форма переходной характеристики несколько другая.
Также прямоугольное скользящее окно (интегратор) можно получить формулой Yn=(Yn-1*(A-1)+Xn)

, что является модификацией формулы приведенной РД00 …
А здесь- ширина окна в отсчетах, и длина переходной характеристики, то есть если А=16, то результат на выходе после подачи “ступеньки” получим после 16-го отсчета.

единственный минус- это требуется плавающее умножение, которое жрет много.
с целочисленным умножением быстрее, но потребуется дополнительная ячейка ОЗУ.

А для высоты/скорости обычного интегратора вполне хватает.

РД00

Стало интересно самому. Залез в бэкап от 97 года, выдернул кусок кода и откомментировал. Это работоспособный IIR, реализующий ФНЧ второго порядка. Он применялся в обработке звука в рилтайме.

Вначале считаем коэффициенты дискретного фильтра, исходя из требуемых частоты, добротности и усиления. В данной задаче это разумно делать снаружи, перед компиляцией.

[codebox]// параметры фильтра :
double W; // частота среза фильтра в Гц
double q; // добротность фильтра, 0.71 - фильтр без всплеска на переходной характеристике
double C; // усиление фильтра. Обычно 1
double Fa; // частота дискретизации в Гц
.
// внутренние переменные
double b0,b1,b2; // коэффициенты дискретного фильтра, рассчитываются из W,q,C,Fa
.
double x1,x2; // хранилище для “прошлых состояний” фильтра
double y1,y2;
.
double k,an; // промежуточные коэффициенты
.
.
//-------------------------------------------------------------
// Инициализация фильтра. Рассчитываются коэффициенты b0,b1,b2,
// исходя из заданных частоты среза фильтра, добротности и усиления
//-------------------------------------------------------------
.
W = 2 * 3.14159 * W; // переводим частоту в круговую
.
k = 2*Fa*cos(W/(2*Fa)); // считаем промежуточные коэффициенты
an = C*W*W;
.
b0 = (W*W + W*k/q + k*k) / an; // получаем коэффициенты дискретного фильтра
b1 = 2 * (W*W - k*k) / an;
b2 = (W*W - W*k/q + k*k) / an;
[/codebox]

А теперь собственно фильтруем отсчеты :

[codebox]
//-------------------------------------------------------------
// Рабочая процедура фильтра. На основании заранее расчитанных b0,b1,b2
// входное значение X пересчитывается в выходное Y
//-------------------------------------------------------------
.
double X; // вход фильтра
double Y; // выход фильтра
.
Y = ((X + 2*x1 + x2) - b1*y1 - b2*y2) / b0; // считаем выход
.
y2 = y1; // сохраняем прошлые состояния входа и выхода
y1 = Y;
x2 = x1;
x1 = X;
[/codebox]

Для второго фрагмента есть и целочисленная 16-разрядная реализация, но она на ассемблере x86 с его аппаратным умножением и делением, так что толку от нее будет немного.

РД00

И, кстати, как фильтруют американские дядьки с большими бюджетами. Это запись с альтиметра покупного Eagle Tree E-Logger’a (слева высота в метрах, внизу время в секундах).

Общий вид :

и фрагмент набора высоты. Это не я, я по таким траекториям летать не умею. Здесь самолет равномерно лезет вверх с брошеной ручкой :

smalltim

Синусы, плавающая точка с двойной точностью… Это всё слишком сложно, мне вот тут в голову пришла как обычно гениальная идея 😃

Для высоты у меня есть плавающее окно, и этого, действительно, более чем достаточно. А для скорости есть набор слегка зашумленных (без плавающего окна) данных. В секунду у меня выдается 8 отсчетов высоты. Так кто мешает с приходом каждого нового делать линейную аппроксимацию этого набора данных по методу наименьших квадратов? Это ж самое то! Физически корректно, быстро и просто! Это получается приближение движения самолета на интервале от “секунду назад” до “сейчас” вариантом прямолинейного движения. Из уравнения прямой y=at+b, где MHK находит а и b, для вариометра нужно только а, то есть, наклон прямой. Еще больше задачу упрощает то, что набор данных имеет фиксированный размер и временные интервалы dt всегда одинаковые.
В общем, сейчас пиво допью и сяду, поковыряюсь 😃

РД00
smalltim:

Синусы, плавающая точка с двойной точностью… Это всё слишком сложно, мне вот тут в голову пришла как обычно гениальная идея 😃

Взгляните еще раз на вычислительную сложность IIRа по сравнению с усреднением значений по окну или линейной аппроксимацией (что одно и тоже в плане частотной хар-ки). Предполагается, что заранее посчитаны коэффициенты b0, b1, b2 - хоть в Екселе, хоть на калькуляторе, хоть опубликованным фрагментом кода. А микроконтроллер с приходом каждого нового значения должен посчитать :

Y = ((X + 2*x1 + x2) - b1*y1 - b2*y2) / b0;

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

Плавающая точка была приведена только для упрощения читаемости кода, чтобы можно было считать, что X и Y находятся в диапазоне -1…+1. Это несложно перевести в целочисленный 16-разрядный диапазон.

smalltim

А какие же должны быть частота среза и добротность для того, чтобы по 8 отсчетам с частотой 1/8 секунды произвольной зашумленной функции правдоподобно восстановить первую производную исходной неизвестной функции? Меня просто смущает то, что мне нужно не гармоники верхние отфильтровывать, а шум. Шум, впрочем, тоже гармоники, но с непонятной частотой. Всё уже с институтских времен забыл 😃
И потом, по Вашему алгоритму я получу сглаженную функцию высоты от времени, по которой еще надо искать первую производную или просто разность, а с МНК по исходным отсчетам нужно всего около 20 целочисленных сложений и 10 умножений для получения конечного результата. Да, и усреднение значений по окну делается не для вариометра, а только для высоты, это я и не подумаю переделывать - слишком хорошо работает 😃

РД00
smalltim:

А какие же должны быть частота среза и добротность для того, чтобы по 8 отсчетам с частотой 1/8 секунды произвольной зашумленной функции правдоподобно восстановить первую производную исходной неизвестной функции?

Я бы выбрал частоту 0.3 - 0.5 Гц и добротность 0.71.

SGordon

Меня с институтских времен интересовала проблема выбора количества разрядов для регистров и коэффициентов фильтров. Ну то есть умная теория из книг конечно есть, но что на практике получается, в 16 бит уложимся? Наверно прощще попробовать на исходных данных. Что там за диапазон измерений ( отсчетов)?

smalltim
SGordon:

Меня с институтских времен интересовала проблема выбора количества разрядов для регистров и коэффициентов фильтров. Ну то есть умная теория из книг конечно есть, но что на практике получается, в 16 бит уложимся? Наверно прощще попробовать на исходных данных. Что там за диапазон измерений ( отсчетов)?

АЦП у Атмеги 10-битный, 64 измерения в сумме у меня дают полноценные 16-битные числа. Так что всю математику приходится писать для 16…32 бит. Умножение двух 16-битных, например, уже 32 бита.

SGordon

32 уже весело Ж-) я бы все-таки попробовал сэмулировать фильтр на компе, есть что фильтровать то, какой то жизненный набор данных?