Телеметрия (часть 1)
Какую документацию вы хотите? Читайте в теме, все необходимые файлы для постройки выложены.
По подключению GPS компаса…
А компас еще тока подключают, как я понял …
Хотел как всегда уточнить, планируется ли новая платка или будет очередной проводок к меге?
По подключению GPS компаса…
Там не компас. GPS приёмник вычисляет курс математически, по точкам. При нулевой скорости его так мотать будет, что ой 😃 Считается, что все параметры, завязаные на скорости, начинают быть релевантными начиная с 5-10 км/ч. По этому я бы привязал показания GPS к датчику скорости (по давлению) и на малых скоростях просто не показывать часть оных.
Люди, поделитесь рабочей программой EAGLE. Накачал кучу, ни одна путем не пашет! 😠
напиши под какую ось, разработки smalltim под форточки точно открывает это ftp://ftp.cadsoft.de/eagle/program/4.16r2/eagle-win-eng-4.16r2.zip
напиши под какую ось, разработки smalltim под форточки точно открывает это ftp://ftp.cadsoft.de/eagle/program/4.16r2/eagle-win-eng-4.16r2.zip
Винда XPsp2. Скачал. Не запускается. Ни в лицензионном режиме, ни в свободном. Закидывает красными рамками.
Тут где то писалось что он в определенную папку должен быть установлен, не помню какую вот только…
но мне точно помогало.
>Хотел как всегда уточнить, планируется ли новая платка или будет очередной проводок к меге?
Будет работать с проводком к меге. Но проводков уже слишком много, да и помехи надо окончательно убить. Поэтому после вылизывания прошивки будет новая платка.
>Тут где то писалось что он в определенную папку должен быть установлен, не помню какую вот только…
но мне точно помогало.
Да в любую папку, только без русских букв и не длинную. Ну, например, c:\avia или d:\vasya\pupkin
>все параметры, завязаные на скорости, начинают быть релевантными начиная с 5-10 км/ч.
Да, при очень маленькой скорости относительно земли я собираюсь гасить стрелку. То же самое с указателем на базу: если самик ближе, скажем, 10 метров, то указатель гасится.
… блин, всё никак не могу придумать, как половчее циферки из ASCII в 32-битные целые переводить, да чтоб код был покомпактнее, да чтоб не завязываться на фиксированное количество знакомест, а то разные GPS приемники разное количество точек после запятой выдают. Кстати, посчитал, 4 разрядов после запятой достаточно, 5-й, выдаваемый напромер u-bloxами отброшу. Одна десятитысячная доля минуты в широте дает 18 см по земле, куда еще точнее, когда сам GPS приемник точность плюс-минус 2-3 метра выдает ? 😃
Dikoy:
Смотрю на Ваши данные. Блин, если GPS приемник вздумает произвольно из 2D в 3D и обратно переключаться в полете, в зависимости от расположения спутников, то показания широны-долготы будут скакать, и судя по Вашим данным, сильно, на 500 метров туда-сюда. Надо будет запоминать базовые координаты в режиме 2D и в 3D, и в зависимости от текущего режима приемника, сравнивать текущие координаты с 2D или c 3D координатами.
Поругайте, вот какая схема нарисовалось в плане подсчета расстояния до базы.
В текущем варианте максимальное расстояние - около 47 км, разрешение - около 0.7 м
По привычке всё пишу на английском. но там и так всё понятно.
;
; Range calculation algorithm sketch
; Набросок алгоритма подсчета расстояния до базы
;
; Lat: ddmm.MMMMN (N - optional digit, mblox uses it, globalsat does not)
; Lon: dddmm.MMMMN (N - optional digit, mblox uses it, globalsat does not)
;
; Integer Lat = (dd*60 + mm)*256*10 + MMMM*(2560/10000); iLat=dd;
; Integer Lon = (ddd*60 + mm)*256*10 + MMMM*(2560/10000)
;
; Results are 2560ths of minutes, Least Significant Bit is 1/2560th of minute = 111.1 km /(60*2560) = 0.72335 m
;
; dLat = startLat - currentLat; perfectly fits to 4 bytes,
; dLon = startLon - currentLon; also perfectly fits to 4 bytes.
; If I throw out high two bytes and keep only 2 low bytes of dLat(dLon),
; I'll get max dLat(dLon)=65536/2560=25.6 minutes which is (25.6/60)*111.1 = 47 km. More than enough
;
; cos(Lat)=COS_TABLE(integer Lat degrees value = iLat); COS_TABLE = 90 WORD values, range=0..65535
;
;
;
;
; okay, now:
;
; dY=dLat*111.1111 km/deg = dLat* 1.8518km/minute = dLat*0.72335 m = (dLat * 47405) >> 16 (meters)
; ^ ^
; 16bits 16 bits (0.72335*65536)
;
; dX=cos(Lat)*dLon*111.1111 km/deg = cos(Lat)* dLon*0.72335 m = ((COS_TAB(iLat)*dLon >> 16) * 47405) >> 16 (meters)
;
;
;
; Range = SQRT(dX*dX+dY*dY) (meters);
;
Вуаля. Будут потери точности из-за целочисленной математики, табличного косинуса и сферической модели земли, но это какие-то доли процента, даже лень считать.
Можно ли у Вас еще уточнить, с каким модулем работаете, и где приобретался, если не секрет …
Можно ли у Вас еще уточнить, с каким модулем работаете, и где приобретался, если не секрет …
GlobalSat EM-408 OEM (Sirf III) TTL, интернет-магазин sportall.ru
… блин, всё никак не могу придумать, как половчее циферки из ASCII в 32-битные целые переводить, да чтоб код был покомпактнее, да чтоб не завязываться на фиксированное количество знакомест, а то разные GPS приемники разное количество точек после запятой выдают. Кстати, посчитал, 4 разрядов после запятой достаточно, 5-й, выдаваемый напромер u-bloxами отброшу. Одна десятитысячная доля минуты в широте дает 18 см по земле, куда еще точнее, когда сам GPS приемник точность плюс-минус 2-3 метра выдает ? 😃
У меня такая функция:
float mas_to_float(char *str, unsigned char len) {
float scale, result;
char *start;
result=0.0;
start = str;
str += len;
while (*str!=‘.’)
{
result=(result+(*str-‘0’))/10.0;
–str;
};
scale=1.0;
while (–str>=start)
{
result=result+scale*(*str-‘0’);
scale=scale*10.0;
};
if (*start==‘-’) result=-result;
return result;
}
Она короче Сишной atof и быстрее.
А быстро переводить не получится… Даже если десятичное умножение заменить сдвигами.
А подскажите, с этими очками данная телеметрия работать будет?
Насчёт пятого разряда, это вы зря 😉
Dikoy:
Смотрю на Ваши данные. Блин, если GPS приемник вздумает произвольно из 2D в 3D и обратно переключаться в полете, в зависимости от расположения спутников, то показания широны-долготы будут скакать, и судя по Вашим данным, сильно, на 500 метров туда-сюда. Надо будет запоминать базовые координаты в режиме 2D и в 3D, и в зависимости от текущего режима приемника, сравнивать текущие координаты с 2D или c 3D координатами.
Не поможет 😦 В 2D режиме сама точность хуже, сохранение ничего не даст.
Эти данные я снимал из окна. В полёте спутники теряются очень редко (если модуль и антенна правильные). Так что я бы забил и в 2D режиме просто не использовал данные, сохраняя предыдущий вектор.
Боюсь, математика, которая нужна для фильтрации таких событий, в мегу8 не влезет… Во первых, по времени, во вторых - по объёму. Мне пришлось писать свою математику и ставить фильтры, в итоге всё занимеает около 60 кБ… Но работает шустро зато.
Вуаля. Будут потери точности из-за целочисленной математики, табличного косинуса и сферической модели земли, но это какие-то доли процента, даже лень считать.
Табличный косинус - стандартное решение 😉 Все так делают, при определённой доле извращенства погрешность можно свести почти к нулю.
А насчёт целочисленной математики - вы же работаете от стартовой точки. Почему бы не взять её за ноль и не работать на добавках 😉 Даже умноженые на 10000 величины широт/долгот не выйдут за 16 бит, а регистры у АВР 16-битные 😉 Так получится сильно скорее.
Вот тут полезный материал: nauka.nsk.ru/e-books/Bond/naviga6/niva6_01.htm
Мда… Приехал…
Вижу…Никаких мыслей…
Надо беседовать с вертолетчиками…
А, сорри. Фактически вы так и делаете - просто отбрасываете целые. В принципе, так тоже можно. Только надо при старте зафиксировать координаты и раскурить на тему вероятности пересечения самолётом граничного разряда. Чтобы небыло ситуации, когда координата перевалит за 999 и станет 0 (условно) 😃
Я от этого отказался, т.к. датности более 100 км…
ПС. Я выкладывал тут результаты испытаний, там есть трек GPS, снятый с торпедо. Можно качнуть карту Тулы и посмотреть, как меняется ориентация и данные в разных режимах.
В самом конце - стоянка минут 10 во дворе супермаркета. Хорошо видно, как колбасит компас.
У меня такая функция:
float mas_to_float(char *str, unsigned char len) {
float scale, result;
char *start;
result=0.0;
start = str;
str += len;while (*str!=‘.’)
{
result=(result+(*str-‘0’))/10.0;
–str;
};scale=1.0;
while (–str>=start)
{
result=result+scale*(*str-‘0’);
scale=scale*10.0;
};if (*start==‘-’) result=-result;
return result;
}Она короче Сишной atof и быстрее.
А быстро переводить не получится… Даже если десятичное умножение заменить сдвигами.
А Вы видели, какой АСМ код из этого выдает компилятор?
На чистом АСМе, без операций с плавающей точкой (зачем вообще здесь она?) то же самое будет в разы компактнее и быстрее. В разы - это не в 2-3 раза, а, боюсь, в 20-30 раз.
>А, сорри. Фактически вы так и делаете - просто отбрасываете целые.
Нет. Обрезаю разницу из двух 4-байтных чисел до двух байт.
>В принципе, так тоже можно. Только надо при старте зафиксировать координаты и раскурить на тему вероятности пересечения самолётом граничного разряда.
Не надо. На удалениях до 47 км разница влазит в 2 байта.
>2D
То есть, 2D-режим - скорее, исключение, чем правило, и надо всегда пользоваться 3D режимом? Какова вероятность перескока из 3D в 2D в полете, при неудачном расположении спутников?
А Вы видели, какой АСМ код из этого выдает компилятор?
А эт зависит от компилятора 😃
На чистом АСМе, без операций с плавающей точкой (зачем вообще здесь она?) то же самое будет в разы компактнее и быстрее. В разы - это не в 2-3 раза, а, боюсь, в 20-30 раз.
Будет, согласен. Не в разы, но будет. Если делать по вашему методу, то работает другая функция:
long int mas_to_long_int(unsigned char *buf, unsigned char len) {
long int result=0;
unsigned char tempX;
while((*buf)++ != ‘.’) len–;
while(len–)
{
tempX = *buf++;
result = (result*10 + (tempX - 0x30));
}
return result;
}
Или её варианты под задачу. IAR собирает в 12 строчек, за счёт десятичной коррекции. Вот только эта функция - реюзибл 😉 Её вынул, вставил в любой текст и всё работает. А портирование асмовского кода? А если захотите сменить контроллер? 😉
Пока код маленький, пока над ним работаете только вы, всё хорошо. А вот когда он разростётся, да пройдёт пару лет?.. 😃
У меня queue система. Блочная. Есть Stream, на который я могу посадить любой программный модуль и под него выделится необходимый ресурс. Фактически, это псевдо-ОС система. Не так оптимальна, как чистый асм, но зато над ней работают десяток человек и никто не испытывает дискомфорта 😉 И модули работают в реалтайме.
>В принципе, так тоже можно. Только надо при старте зафиксировать координаты и раскурить на тему вероятности пересечения самолётом граничного разряда.
Не надо. На удалениях до 47 км разница влазит в 2 байта.
Не забывайте про дрейф координаты 😉
>2D
То есть, 2D-режим - скорее, исключение, чем правило, и надо всегда пользоваться 3D режимом? Какова вероятность перескока из 3D в 2D в полете, при неудачном расположении спутников?
Тут однозначно не скажешь. ОЧЕНЬ многое зависит от антенны и приёмника. Летал (в составе автопилота) я только с блоксами, с плоской антенной меньше 8 не видит. Со спиралью - 8-10. 2D режим появляется только на земле и на малых скоростях у земли, если под антенной маленький полигон. Если приёмник как у Вас, без полигона, над водой часты глюки (замечены у тримбла и лассена), блоха координаты не теряет, но они начинают ощутимо гулять.
В общем, надо выйти в чисто поле, поднимите приёмник на палке метра на четыре (или с крыши дома) и всё сразу станет понятно. Но в полёте, если часто не крутиться, а летать с кренами не более 15 градусов (стандартный разворот) переходов 2-3D ни у одного приёмника замечено небыло.
>дрейф координаты
Что это такое?
А это как раз когда приёмник приглючит. От помехи или переотражения - не суть. Иногда такое бывает, когда батарейка бекапная садится. И всё - скачёк на пару сотен КМ обеспечен. Вот скрин такого глюка.