Телеметрия (часть 2)
Несколько мыслей:
- Бинарный формат намного экономичнее
А почему бы не использовать модбас? В АСУ популярнейшая вешь.
Формат: адресат, от кого, длина, команда, данные (диной во 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 раза точно. Плюс выборки идут примерно одновременные со всех пирометров, а не с разрывом.
Круто ! отличный базар. 99% форумчан все поняло и во все въехало !
А причем тут 99% форумчан? Тема крайне узко специализированная, кому надо, тот понял, а для 99% форумчан это разжевывать не надо, ибо всеравно они ничего дельного не скажут.
Выложил смотрелку для логов smalltim’а
(точнее предварительный макет смотрелки 😃 )
тут d-ogogo.narod.ru/gm2/
(Карта только для лога-2)
Что-то у меня не получилось ничего увидеть, скачал, разархивировал. Запускаю, на экране белый круг ( наверное это шар) Приближается, удаляется, катринки нет, может я чего не туда разархивировал?
В каталоге с прогай должны быть папки gnu, osg, img ? или это все нужно свалить в кучу? Хотя по бат файлу похоже что не надо.
Ага, нашел, когда стартует он пишет что не найден плаг для чтения файлов картинок…
В каталоге с прогай должны быть папки gnu, osg, img ? или это все ужно свалить в кучу?
Должно получится так
Из файла prg1 -
…\smtlv\Run.bat, …
…\smtlv\gnu - dll’ки
…\smtlv\osg - dll’ки из lib1
…\smtlv\osg\osgPlugins-2.8.2 - dll’ки из lib2 и lib3
…\smtlv\img - картинки из img1
На круге (это шар) д.б. облака, а земля с треком - внутри.
Нашел, ддлки из второй библиотеке почему то не попали по назначению. Все заработало, круто! Пожелание, можно точку старта сделать постоянным центром вращения? И запретить камере опускаться под землю?
Нашел, ддлки из второй библиотеке почему то не попали по назначению. Все заработало, круто! Пожелание, можно точку старта сделать центром вращения? Точнее что бы ось проходила через нее?
Т.е. зафиксировать точку наблюдения?
Тогда нельзя будет смотреть сверху или сбоку.
А сейчас можно разглядеть скачки ЖПСа, висящий хвостик трека,
непонятные прямые участки (похоже провалы в ЖПСе).
Под землю - закрою
(пока заглядываю 😉 там из-за ошибок с высотой поверхности появляется часть трека).
Возможно я поспешил с некоторыми предложениями 😃 Просто по началу надо привыкнуть к тому как все это дело вращается.
Но, я имел ввиду закрепить не камеру, а направление, что бы камера всегда смотрела на точку взлета, тогда камера будет облетать только вокруг трека (на данный момент трек может летаь где-то там сам по себе 😃 )
Это конечно может быть полезным, возможность рассматривания под абсолютно любым углом, но чутка напрягает такое обилие свобод перемещения 😉 Если смотрелка будет развиваться и появятся менюшки, то может быть будет пелезным сделать кнопочки что бы блокировать степени свободы. Пример- базовое состояние- камера может летать вокруг трека только в плоскости параллельной земле, приближение-удаление, вверх-вни и камера смотрит всегда в центр трека(или на точку старта, но лучше центр трека )
И мод про.- камера перемещаестя как сейчас.
Выложил смотрелку для логов smalltim’а
(точнее предварительный макет смотрелки 😃 )
тут d-ogogo.narod.ru/gm2/
(Карта только для лога-2)
Подскажите, пожалуйста, на какой процессор и видеокарту рассчитана программа? а то у меня такие тормоза, что после 5 попыток пришлось бросить всё, к черту.
Масштабирование не совсем понятно. Изображение появляется, но потом опят превращается в “молоко-облака”. Наверное увеличение-уменьшение лучше назначить на кнопки “+” и “-”. Сколько надо, столько раз и нажал ,а то с мишкой не совсем понятно, или я туплю.😒
Подскажите, пожалуйста, на какой процессор и видеокарту рассчитана программа?
Видеопамять от 128Мб, проц. не очень важен (у меня Р4 3Ггц, видеопамять 128Мб).
Должен быть установлен драйвер OpenGL, без него будут тормоза.
Проверить можно какой-нибудь игрушкой, напр. Квакой.
Мишкой очень просто, нажали на правую кнопку и двигаете мышку вниз-приближение, вверх-удаление. Главное кнопку не отпускать пока мышку не остановили. иначе смотрелка воспримет это как команду к динамической прокрутке и будет увеличивать или уменьшать до упора. Тоже самое и для других кнопок на мышке, левая-вращение, правая-перетаскивание.
У меня смотрелка работает на компе с проциком Атлон 1.24Ггц видео FX5600 128Мб без тормозов.
Дополнение к смотрелке логов, по треку летит Изик
d-ogogo.narod.ru/gm2/smtlv_prg1u1.rar
Надо распаковать после основных 5-ти файлов, туда-же.
Размер и скорость не в масштабе поля.
Полет зациклен - после окончания лога - возврат с начала.
Отсчеты 2500-4500 и 7000-8000 (лежит на земле) - не показываются.
Клавиша “f” - переключение “в окне” / “во весь экран”.
Обнаружилось, что:
время по ЖПСу gps_time немного не пропорционально номеру отсчета samplenumber,
курс gps_curheading и compass_curheading отличаются (с учетом -pi). 😵
Для анимации используется samplenumber - время, gps_curheading - курс,
pyro_curroll - крен, pyro_curpitch - тангаж.
Smalltim, не помещаюсь к Вам в личку, пишу сюда.
Напишите пожалуйста как с Вами связаться по поводу покупки OSD и где и когда можно пересечься.