Телеметрия (часть 2)
>Тимофей, чисто теоретический вопрос, а что будет если улететь за пределы 13км? (это касательно математики ГПС)
Это математика ГПС в телеметрии такая. Я точно не помню, но по-моему, я это переписывал, чтобы было то ли 64, то ли 128км. Посмотрю в коде и отпишу. В автопилоте ограничений на дальность нет.
А при каких условиях автопилот включается? Как я правильно понял, то с канала управления, тумблером и при потере сигнала приемником. А откуда автопилот знает что сигнал потерян?
Тимофей, личка у тебя переполнена, поэтому сюда. Хочется получить от тебя черновую спецификацию по передаче данных от автопилота на землю. Например - формат данных (текстовый,бинарный), скорость данных от а/пилота, размер пакета (фиксир 64,128 или сколько там будет байт или плавающий) частота повторения пакетов и пр. В свою очередь могу предложить черновую структуру пакета в наземной сети - скорость 38400 бит/с, данные текстовые, размер плавающий, структура пакета - старт символ *, потом номер источника данных (01-приемник,02-компук,03-модуль диверсити и пр.), потом тип данных в пакете (навигация, напряжения, состояние и пр.), потом длина пакета в байтах, потом тело пакетаю. потом CRC, и символ # конца пакета. Цель - облегчить добавление новых устройств на шину и ввод новых классов передаваемых данных (например подключеный голосовой информатор предельных режимов можно конфигурировать с компа по той-же шине).
Несколько мыслей:
- Бинарный формат намного экономичнее
- 38400 8/N/1 устраивает
- Содержание пачки - совпадает с содержанием пачки, отправляемой в лог. В бинарном формате сейчас, без ужатия 152 байта.
- Период следования - от 0.2/0.5/1/2/5 секунд.
- Формат:
- Смешанный с 4-байтовыми флотами и целыми, разделенными запятыми: *04,XXXX,XXXX,XXXX,XXXX,XX,XXXX,…,XXXX#X. Такое парсить быстрее и проще, чем текст. Порядковый номер каждого числа, как в NMEA, определяет смысл этого числа. Т.е. 1-е число - широта, 2-е - долгота, и т.д.
- Или такой: *04,XXXXXXXX…#X. Пачка на 152 байта в бинарном виде с добавленным префиксом и контрольной суммой. Описание пачки не передается, оно подразумевается известным.
- Или такой: *04,Y:XXXX,Y:XXXX,Y:XX…#X. Здесь перед каждым числом стоит 1-байтовый идентификатор, говорящий о том, что это собственно за число. (1-щирота, 2-долгота, 3 - напряжение … 48-текущий крен,49-текущий тангаж, и т.д.). Причем 6-й бит идентификатора может определять тип числа - целое или плавающее, а 7й может определять формат вывода числа - текстом или напрямую. Такую пачку будет легко парсить даже тогда, когда я меняю число, тип и порядок данных на выходе автопилота.
Как насчет, задействовать невидные строки на телеметрии? Если кодировать, то ICP на приеме полезен будет. Можно его защелкой от компаратора пинать (—_ -___ = 0b10 типа того- PCM тупо…)😊
Пятый. В смысле, в очереди.😊
Заказал платы автопилота и пирометров в серию в Резоните.
На платах подвинут USB разъем, чтоб не мешал проводить трубку от бародатчика скорости на телеметрии, добавлены переходные отверстия у ног USB, чтоб ненароком не оторвали, добавлен сигнал SS на телеметрию или что там будет подключаться через SPI, плюс пара фиксов, упрощающих пайку.
Ждем. -с 😃
Схему, разводку и готовые прошивки выложу ессно.
Приветствую, Тимофей!
А когда все это можно будет увидеть, а то слюнями уже весь экран забрызган.
Спустя месяц после морковки, и непонятного выхода из строя телеметрии.
Наконец то добрался с паяльником до телеметрии и заменил кварц.
И О чудо все заработало.
Еще раз спасибо за советы.
Тимофей, опять я к тебе в личку не поместился - По передаче данных - от а/пилота пойдут 152 байта бинарных данных на скорости 38400. Длительность пакета - максимум 45 мс Период повторения минимум 200 мс. Я прав? Таким образом, после паузы в данных на входе модема более 10 мс входной буффер обнуляется, последующие 152 байта запишутся в буффер и по заполнению буффера начнется передача пакета. Скорость радиоканала - 9600 бит/сек, объем данных вместе со служебными - 170 байт Время на передачу - 177 мс. На приемной стороне бинарные данные преобразуются в текст, пакет снабжается заголовком (источник,тип,длина) и CRC *04,01,152,ХХ,ХХ,ХХ,—,ХХ#NN и на скорости 38400 отдается получателям. Предполагается, что формат получателям известен. Для начала попробуем радиомодули RFM12BP и RFM12B на 433 мгц (они у меня в наличии), потом можно будет подумать и о 868 мгц. Радиус работы с 20% потеряных пакетов я теоретически оцениваю в 3-4 км (на эшелоне 200 метров)
Коллеги, с автопилотом, стало быть, ситуация такая.
Стабилизатор работает, автопилот работает за исключением удержания высоты -летает с набором высоты (багу поправил, но пока не проверил).
Логгинг работает.
Удержание скорости не проверялось, пишем не работает.
Компас с коррекцией по пирометрам на земле проверялся - работает, но в полете не проверялся. Пишем не работает.
Общение с платой телеметрии не доделано на 80%, просмотровщик логов не земле не доделан на 50%, компуковая программа-интерфейс с автопилотом готов на 90%, но, во-первых, на английском, во-вторых, часть окон я хочу перерисовать, чтоб сделать построже защиту от неправильных действий.
Плюс, хочу добавить настройки резкости руления, а то по логам на моем изике по тангажу видна раскачка с периодом в ~1 сек с амплитудой в 10 градусов.
В таком состоянии это нифига не продажный продукт, но бета-тестеры уже могут вовсю поиздеваться над ним, ибо всё-таки работает и летает.
Добивание всех недоделок перед выводом в серию и отполировка математики, интерфейса и прочего по результатам бетатестирования - главный приоритет для меня на ближайшее время.
По срокам - бетатестерам, имеющим свои модули ГПС, смогу отдать уже на следующей неделе, в серию - еще 2 недели минимум, по готовности софта, а у кого нет ГПС модулей - по приходу ГПС модулей. Оплачены, ждем.
3D просмотровщик логов выложу когда хотя бы чуток причешу, а то камера дергается, скорость проигрывания не регулируется, и т.д… Но выглядит очень прикольно. Медитативно этак. По показаниям с пирометров по крену и тангажу классно видно повадки изика. ГПС координаты шумноваты, особенно показания текущего курса. Для автопилота хватает, и с земли незаметно, а в проигрывании логов видны подергивания, когда камера за хвостом самолета в 3 метрах летит.
Тимофей, вроде у Вас личка не переполнена, а Вы не отвечаете…
Несколько мыслей:
- Бинарный формат намного экономичнее
А почему бы не использовать модбас? В АСУ популярнейшая вешь.
Формат: адресат, от кого, длина, команда, данные (диной во 2 байте), 2 байта CRC.
У меня это выглядет так:
typedef struct
{
unsigned char Address; // адрес получателя (ПК = 0, пилот = 1, штурман = 2, пироголовка = 3).
unsigned char Sender; // адрес отправителя
unsigned char Length; // длина ТОЛЬКО поля данных
unsigned char Cmd; // соманда
char Data[DATA_LENGTH_MAX]; // поле данных до 120 цифр
unsigned char CRC_H; // контрольная сумма
unsigned char CRC_L;
} Response;
/* Table of CRC values for high–order byte */
__flash unsigned char auchCRCHi[256] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40
};
/* Table of CRC values for low–order byte */
__flash char auchCRCLo[256] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,
0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,
0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,
0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,
0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,
0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,
0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,
0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,
0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,
0x40
};
unsigned int Get_CRC16(unsigned char *puchMsg, unsigned char usDataLen)
{
unsigned char uchCRCHi = 0xFF; /* high byte of CRC initialized */
unsigned char uchCRCLo = 0xFF; /* low byte of CRC initialized */
unsigned char uIndex; /* will index into CRC lookup table */
usDataLen += (HEADER_LENGTH_MAX - 2);
while ( usDataLen-- ) /* pass through message buffer */
{
uIndex = uchCRCHi ^ *puchMsg++; /* calculate the CRC */
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex];
uchCRCLo = auchCRCLo[uIndex];
}
return ((uchCRCHi << 8) | uchCRCLo);
}
А я вот развёл своего пиромонстра… Вместе с новым автопилотом планирую сдать в резонит к сентябрю. Буду облётывать осенью.
Вопрос к гурам. Патчевая GPS антенна имеет снизу металлическое напыление (равно как и сверху, но с ним всё понятно). Надо ли обеспечивать контакт этого напыления с подложкой?..
То есть антенна ставится тупо на полигон, покрытый лаком и подключается только центр, или надо ещё умудриться подпаять низ?
А че за таблы то? В gnucc есть crc16 в библиотеке… Посмотри на разводку и найди петлю! хе-хе. Да не одну. Потом давай их фильтровать! хо-хо! Matlab по вкусу пришелся- это правильно! А чем TWI не по-вкусу? Давай придумаем совершенно новое круглое колесо! Или “модбас”- это перевод?!
Обварил Изику нос в кипятке - и правда, выпрямился. Только появилась шагрень из-за того, что элапоровые шарики повздувались, но это уже не так страшно. Заклею нос скотчем, как было, и в бой 😃
Вот такое вот 3д окошко просмотровщика логов получается, на траекториях - крайние Митинские полеты.
Самик летит по траектории из лога, с реальными из лога креном и тангажом. Позиция и курс самика чуть сглажены - видно, что он чуть рядом с траекторией из лога летит - потому, что данные ГПС немного шумят, и при таком реплее самик начинает чуть дергаться, если пустить его прямо по логу.
Управление просмотровщиком - как медиаплейером. Вперед, назад, стоп, пауза, плей. Смотрим как ролик, только есть возможность переключать виды камеры (спривязана к точке старта, привязана к самику и летит вместе с ним, вид из самика).
Что еще? Шаг сетки на земле 10м, моделька самика взята специально чтоб ни у кого такой не было, чтоб никому обидно не было. Масштаб модельки не совпадает с реальным - около 3м, для правильных пропорций должно быть 1-1.5м.
Прикручу красивое удобное отображение высоты, скорости и ориентации прямо в 3д окне попозже.
Да. для комфортного просмотра лога надо с хорошей частотой лог снимать. 5 раз в секунду - самое то. Если раз в секунду или того реже, то лог в 3д будет малоинформативным.
Потом наверчу там показ высоты, координат и т.д., на землю надеюсь текстурку и рельеф положить.
Параллельно буду рисовать в соседних окошках крен, тангаж, входы-выходы PPM, батарейки и т.д.
Плоские графики всячечских параметров, как думаете, надо, или ексель спасет тех, кому надо?
Скриншоты смотрелки на этот-же лог сбоку
d-ogogo.narod.ru/gm2/
Я думаю что если не в ущерб основному делу то не помешает, но обязательно шоб с текстурами из места реальных полетов.
Самолетик-то на Jet (TwinJet?) вроде смахивает…
>Самолетик-то на Jet (TwinJet?) вроде смахивает…
Не знаю. Моделька, нарисованная, кстати, нашим соотечественником, взята из каталога бесплатных моделек для 3D. Ничего особенного, даже текстурок нет, парень явно просто тренировался, а мне вот понравилась.
>Я думаю что если не в ущерб основному делу то не помешает, но обязательно шоб с текстурами из места реальных полетов.
В этом деле - в борьбе с картами - мне один наш коллега любезно согласился помочь.
А че за таблы то? В gnucc есть crc16 в библиотеке…
Табличный?
Посмотри на разводку и найди петлю! хе-хе. Да не одну. Потом давай их фильтровать!
Во-1 петель там нет. Где Вы их там выловили? Во-2 платы показаны без заливки (что очевидно по виасам), для упрощения понимания предмета.
Matlab по вкусу пришелся- это правильно! А чем TWI не по-вкусу? Давай придумаем совершенно новое круглое колесо! Или “модбас”- это перевод?!
А этот поток как переводится?..
Если вопрос в том, почему я не использую аппаратный TWI, то причины две:
- Мне немного влом настраивать каждому пирометру индивидуальный адрес внешним девайсом или софтом. А на ноль отзываются они все.
- При софтварном TWI по таймеру я экономлю время на считывание пусть не в 6, но в 3 раза точно. Плюс выборки идут примерно одновременные со всех пирометров, а не с разрывом.