А чем Вы конвертируете бинарный файл в RINEX? Может быть надо отрезать в начале файла нечто типа GSD4e_4.0.4-P1_RPATCH.07-GS0 - GNSS-Monitor пишет это как заголовок, чтобы можно было посмотреть: с какого устройства получен этот бинарный файл. Выкладываю обновление GNSS-Monitor4: протестировал на разных устройствах (под Win32) и немного изменил строки в файле координат. Внутри архива пары файлов для 5 разных приемников/навигаторов. Теперь это: Код: TOW 55328.00000000 AntennaHight 0.225 B 55.65314295 L 37.56797584 H 225.200 X 2858962.105 Y 2199152.645 Z 5242948.795 PntNum 2000 EpocCount 30 StartTOW 55298.00000000 StopTOW 55328.00000000 X 2858956.919 Y 2199146.016 Z 5242751.131 dX 2.863 dY 3.590 dZ 1.445 Code STN На скриншоте одновременная работа с Garmin GPS-Map-60cx и c GlobalSat BU-353-S4
Наверное нужны некоторые пояснения к последней версии GNSS-Monitor4. Я не нашел для Garmin-устройств сообщения аналогичного MID-07 GlobalSat, из которого получаются поправки для приведения "сырых" измерений к началу секунды/эпохи. Более того, в приемнике GlobalSat BT-308 (chipset SS-2) у меня получается некая хрень, приведения работают только с BU-353-S4. Поэтому я исключил запись на-лету RINEX-файла и прочие вещи. Более того, мне думается, что надо работать со своей БАЗОЙ, на которой стоит такой же приемник, что и РОВЕР. Вот только БАЗУ надо ставить на точку с заранее определенными координатами, желательно в системе WGS-84 (но можно и в других - пересчет возможен). Тогда нет зависимости от платных сервисов. Нет зависимости и от далеко небесплатных программ постобработки. Программа пишет 1-й файл бинарного потока с приемника/навигатора для возможной последующей конвертации его в RINEX-файл и т.д. Программа пишет 2-й файл из вычисляемых приемником/навигатором координат для последующей независимой от брендовых программ обработки трека и/или точек топографической съемки в программах типа xxxx-CAD (в данном случае это можно делать в бесплатном LiteCAD'е Олега Колбаскина). В файле координат присутствуют ВСЕ эпохи сеанса работы, а кроме того точки, снимаемые как топографические имеют высоту антенны и код с аттрибутом. Координаты таких точек программа сама усредняет и показывает разброс координат в этом усреднении. Пользователь сам определяет сколько секунд/минут ему стоять на каждой такой точке. Это автономная работа приемника. Если на БАЗЕ велась параллельная запись, то можно приладить упрощенную постобработку: в координаты полученные на РОВЕРЕ вводить поправки получаемые на БАЗЕ - на обоих премниках пишутся временные метки TimeOfWeek. По моему это достойно проверки. Но у меня нет ни БАЗЫ ни возможности выйти в поле - я на пенсии, а моим бывшим коллегам не до этого. А с балкона дома измерения годятся только для отладки программы.
Давно слежу за Вашей темой, но все больше язык скатывается на птичий.. (увы.. это для меня). У меня в наличии Гармин 78s, доступ к базовым станциям, одночастотные приемники, обработка в статике. Что нужно сделать что-бы включить Гармин 78s в работу по Вашей программе?
Бинарный файл GNSSMonitor 3 конвертируется sirfdump Алексея Илларионова. А GNSSMonitor 4-3 и UPDATE не конвертируется. После нажатия клавиши START в GNSSMonitor 4-3 и UPDATE появляется заставка: reset SirfStar MiDs (hex): IC 1E unset, 04 29 reset
Это я погорячился с отключением ненужных для навигации MID-1C и MID-1E Конечно MID-1C (MID28) отключать нельзя - он используется для создания RINEX-файла. MID-1E - это координаты спутников, он действительно не нужен. Исправлю и выложу.
-это неизбежные издержки при обсуждении узкоспециальных вопросов в любой области. Для начала надо понять, что может выдавать Гармин 78s по бинарному протоколу (все обсуждения здесь идут по обработке именно бинарных, не NMEA, данных. Для этого в меню Вашего навигатора надо найти: Меню-->Настройки-->Интерфейс и переключиться со строки NMEA... на строку GARMIN... Названия могут несколько отличаться (в разных моделях Гармин) но суть такова. После этого можно соединить навигатор с компьютером (настольным, ноутбуком, нетбуком) Garmin-овским СПЕЦИАЛЬНЫМ КАБЕЛЕМ (сзади навигатора есть под резиновой заглушкой разъем с 4-мя штырьками), я совсем не уверен, что соединение кабелем по USB-mini разъему позволит обмениваться данными, этот разъем для других задач. Из тех моделей, что я держал в руках, вывод бинарных данных (протокол Garmin) возможен ТОЛЬКО на 4-х штырьковый порт. Гармин не только узкоглазый, но и хитрож...й Вероятно Вы заплатили за него 15-17тыс.руб. Попробуйте раззориться еще на 1тыс.руб. - купив такой кабель. Запустить программу GNSSMonitor. В ней выбрать тип приемника Garmin GPS-Map-60... , скорость порта (обмен данными) 9600 и стартовать запись данных. После остановки программы, в папке программы должны появиться новые файлы. Самые важные из них: xxxxxxxxxx_Binary.txt и xxxxxxxxxx_Parsing.txt (xxxxxxxxxx - это дата и время записи). В файле xxxxxxxxxx_Parsing.txt можнобудет увидеть строки вида: Record 33: ... ... ... Record 72: ... ... ... После этого можно делать выводы о том, как"прислонить" Ваш навигатор к работе с программой GNSSMonitor. Можете запаковать полученные фалы в архив и переслать мне, я посмотрю и отвечу.
Исправление. Предъявляю скриншот бинарного файла. Посмотреть вложение 16061 Посмотреть вложение 16061 Посмотреть вложение 16061
Cklimkin записал файл GNSS-Monitor4-update2 c 353S4. Посмотрел в WinHex. Не нашел последовательности A0 A2 00 38 1C в своем файле. В приложенном файле к программе она есть.
Прощения просим ("мы сами люди не местные...") ! Предыдущий вариант GNSS-Monitor4 отключил это сообщение. А после этого никто приемнику не сказал, что его надо снова выдавать, вот и нет его. Я попозже более строго это поправлю. Еще не все новые идеи устаканились. А пока воспользуйтесь программой SirfDemo-->Action-->Set Message Rate-->0x1C NL Meas Data и Message update rate поставьте 1 Тогда MID-28 (0x1C) снова будет выдаваться.
Странно, обратиля к дилеру по поводу кабелька к последовательному порту Гармина 78s -ответил, что и на сайте Гармина нет данного девайса. Лююди, где продается данный девайс???
Джонхаб Зачем вам это нужно, если у вас есть доступ к нормальным профессиональным приемникам. К тому же всё-равно этому Гармину нужен ноутбук для сбора данных, невозможно прицепить внешнюю антенну. За цену этого кабеля вы можете купить обычный GlobalSat BU-353S4 или платку на µBlox 4, результат будет только лучше. Garmin имел смысл когда других чипов не было.
Поиск например по словам: кабель Гармин http://www.doroga.ru/gps/gps_garmindop.php http://www.postman.ru/~makarov/pclink/garmincables.htm и так далее. Вот еще вариант (дешевле не найти - 150 руб - "собери сам" называется) http://www.cybershop24.ru/round_garmin_connector.html
Он с этим навигатором мается уже больше года. Деньги "уплочены" и немалые, а отдачи нет. Можно соединить девайс не с ноутбуком, а с наладонником (кабели есть, я покупал для связи с HP iPAQ 4700 где-то за 500 руб.) А вот внешнюю антенну подключить можно - есть сзади разъем. Да, это так.
Исправил так: при запуске включаются сообщения MID-04 MID-41 MID-28 (т.е. были они ранее включены или отключены, по-любому будут). Внутри архива пример для BU-353S4
О введении поправок ухода часов приемника. Еще раз проштудировал протокол СирфСтар: Спойлер (Наведите указатель мыши на Спойлер, чтобы раскрыть содержимое) Раскрыть Спойлер Свернуть Спойлер Navigation Library Measurement Data – Message ID 28 --------------------------------------------------- The reported Time of Measurement, Pseudorange and Carrier Phase are all uncorrected values. Message ID 7 contains the clock bias that must be considered. Adjust the GPS Software time by subtracting clock bias, MID28.TOW - MID07.ClBias adjust pseudorange by subtracting clock bias times the speed of light, MID28.PR - MID07.ClBias * LIGHTSPEED and adjust carrier phase by subtracting clock bias times speed of light/GPS L1 frequency. MID28.C1 - MID07.ClBias * LIGHTSPEED / 1575420000 To adjust the reported carrier frequency do the following: Corrected Carrier Frequency (m/s) = Reported Carrier Frequency (m/s) – Clock Drift (Hz)*C / 1575420000 Hz. For a nominal clock drift value of 96.25 kHz (equal to a GPS Clock frequency of 24.5535 MHz), the correction value is 18315.766 m/s. Note – GPS Software Time – Clock Bias = Time of Receipt = GPS Time. GPS Software Time – Pseudorange (sec) = Time of Transmission = GPS Time. Adjust SV position in Message ID 30 by (GPS Time MID 30 – Time of Transmission) * Vsat. GPS Software Time(2) sec 8 Dbl 41 74 0B 0B 48 35 3F 7D 2.4921113696e+005 Pseudorange(3) m 8 Dbl 7D 3F 35 4A 0B 0B 74 41 2.1016756638e+007 Carrier Frequency m/s 4 Sgl 89 E9 82 46 1.6756767578e+004 Carrier Phase4 m 8 Dbl A4 70 3D 4A 0B 0B 74 41 2.1016756640e+007 Time in Track ms 2U 75 30 10600 Приемники GlobalSat выдают в секундном пакете сначала MID28, а MID07 в конце. Из MID07 получаю (для следующей эпохи, т.к. приемник выдает MID07 в конце секундного пакета) Код: RcvClBias = (double)(MID07.ClBias) * 0.000000001; // sec blnClBias = 1; // флаг наличия RcvClBias В следующей эпохе, при обработке текущего MID28 отправляю уже исправленные TOW, PR, Phase, Dopler на создание строки для предыдущей эпохи в RINEX-OBS файле Код: RcvTOW = MID1C.TOW; // время приемника SirfStarOBS(); // ф-ция создания записи эпохи в RINEX OBS-файл Теперь обрабатываю Message_0x1C (MID28) текущей эпохи, ввожу поправки из MID07 и сохраняю до следующей эпохи Код: // temp Local variables to Array OBS[MID1C.SVID].xxxxx MID1C.Timetag = Timetag * 0.0000000625; // now in seconds -really!!! MID1C.ID = SVID; // Satellite-ID MID1C.TOW = GPSSWTime - RcvClBias; // GPS SoftWare Time (Sec) MID1C.prange = PR - LIGHTSPEED * RcvClBias; // Pseudo Range corrected (m) MID1C.C1 = C1 - RcvClBias * LIGHTSPEED / 1575420000; // Carrier-Frequency (m/Sec) MID1C.CPhase = CPhase - LIGHTSPEED * RcvClBias; // Carrier-Phase (m) MID1C.Dopler = dopler - MID07.ClDrift; // Carrier-Frequency (m/Sec) --> Dopler frequency (Hz) MID1C.TimeTrack = TimeTrack; // Time in Track (mSec) MID1C.db = CN1; // уровень сигнала от текущего спутника по 1-му каналу приемника И вот что я получаю: Код: GlobalSat BT-308 (SirfStar-II) файл парсинга сообщений ------------------------------------------------------ Record 07(07) Time & Clock: 1729 - WN (full) 244516.54 - RcvTOW 6 - SVs in view 91912 - RcvClBias 0.007935 - ClDrift 244516.545 - EstGPSTime Record 1C(28) RAW data: 0.00856 - Timetag (Sec) 24 - SVID 244516.545125 - GPSSWTime (Sec) Corrected!!! 20481041.404107 - PR (m) Corrected!!! 17501.152344 - Carrier-Frequency Corrected!!! 93119.356886 - Carrier-Phase (m) Corrected!!! 58.171875 - Dopler frequency (Hz) Corrected!!! 30000 - Time in Track 43 - CN1 Signal-Noize (dB) GlobalSat BT-308 (SirfStar-II) RINEX-OBS файл --------------------------------------------- 13 02 26 19 55 16.5451247 0 6G24G17G12G9G15G1 20481033.219 93109.594 57.414 9 21471613.972 -1912596.087 1692.797 2 21842381.060 -44600.799 -2605.406 9 21860336.191 -2123510.154 3462.969 1 24631087.357 47698.351 3513.383 9 25165379.013 -2116198.637 2786.969 0 GlobalSat BU-353S4 (SirfStar-IV) файл парсинга сообщений -------------------------------------------------------- Record 07(07) Time & Clock: 1729 174897.00 11 0.000094 18851320 - ClDrift 174896.999 Record 1C(28) RAW data: 91.05539 29 174897.018851 - GPSSWTime (Sec) Corrected!!! 25747989.783262 17969.552734 25747925.467855 -94279.437500 30000 28 GlobalSat BU-353S4 (SirfStar-IV) RINEX-OBS файл ----------------------------------------------- 13 02 26 00 34 58.0189110 0 12G29G25G5G30G21G31G2G10G12G16G13G23 25747989.783 25747925.468 -94279.438 0 27670224.143 27670192.176 3084.250 0 27779912.887 27779877.875 -610.430 0 27972468.635 27972469.016 -2755.219 9 28756221.905 28756181.755 -2864.000 0 28685072.232 28685079.463 2025.922 9 29254517.664 29254487.409 2025.922 0 29666442.966 -28263.832 2025.922 0 30398769.921 -28263.832 2025.922 0 30553182.838 30553180.364 -3613.367 6 30397221.924 30397189.766 378.961 0 31146419.089 -28263.832 1667.461 0 Почему скоррректированное время приемника не приводится к целой секунде? Ведь при таких "хвостах" .5451247 .0189110 в секундных метках о связи БАЗА-РОВЕР и о поправках говорить не приходится! Может быть я что-то не так посчитал? Прошу посмотреть и поправить меня!
Да вроде все правильно сделано... По крайней мере в части А вы данные из mid7 правильно же читаете? Если правильно, тогда остается только пожать плечами.
С эпохами я только в тексте сообщения напутал (от огорчения). Проблема в том, что "хвосты" у времени приемника остаются. Код: Это запись парсинга MID-07 (ClockDrift в герцах, ClockBias в секундах) ------------------------------------------------------------- ret=fprintf(FileHandle2, "Record 07(07) Clock Status:\n"); ret=fprintf(FileHandle2, "%d\n", MID07.WN); ret=fprintf(FileHandle2, "%.2f\n", MID07.TOW * 0.01); ret=fprintf(FileHandle2, "%d\n", MID07.SVs); ret=fprintf(FileHandle2, "%ld\n", MID07.ClDrift); ret=fprintf(FileHandle2, "%ld\n", MID07.ClBias); ret=fprintf(FileHandle2, "%.3f\n", MID07.EstGPSTime * 0.001); RcvClDrift = (double)MID07.ClDrift; // Hz RcvClBias = (double)(MID07.ClBias) * 0.000000001; // sec blnClBias = 1; // флаг наличия RcvClBias Это запись парсинга MID-28 (все данные без коррекций) ----------------------------------------------------- ret=fprintf(FileHandle2, "Record 1C(28) RAW data:\n"); // записать текущие время, координаты и скорости в файл парсинга ret=fprintf(FileHandle2, "%d\n", Timetag); // mSec ret=fprintf(FileHandle2, "%d\n", SVID); ret=fprintf(FileHandle2, "%f\n", GPSSWTime); ret=fprintf(FileHandle2, "%f\n", PR); ret=fprintf(FileHandle2, "%f\n", C1); ret=fprintf(FileHandle2, "%f\n", CPhase); ret=fprintf(FileHandle2, "%f\n", Dopler); ret=fprintf(FileHandle2, "%d\n", TimeTrack); ret=fprintf(FileHandle2, "%d\n", CN1); // уровень сигнала по 1-му каналу Исправляю время приемника на ClockBias и пишу строку в RINEX-OBS-файл --------------------------------------------------------------------- RcvTOW = GPSSWTime - RcvClBias; // идет в ф-цию SirfStarOBS() SirfStarOBS(); // ф-ция создания записи эпохи в RINEX OBS-файл Заполняю массив MID-28 - из него SirfStarOBS() берет .prange .CPhase .Dopler ---------------------------------------------------------------------------- OBS[MID1C.SVID].Timetag = Timetag * 0.0000000625; // in seconds - really!!! OBS[MID1C.SVID].ID = SVID; // SatelliteID OBS[MID1C.SVID].TOW = GPSSWTime - RcvClBias; // GPS SoftWare Time (mSec) OBS[MID1C.SVID].prange = PR - LIGHTSPEED * RcvClBias; // Pseudo Range corrected (m) OBS[MID1C.SVID].C1 = C1 - RcvClBias * LIGHTSPEED / 1575420000; // Carrier-Frequency (m/Sec) OBS[MID1C.SVID].CPhase = CPhase - LIGHTSPEED * RcvClBias; // Carrier-Phase (m) OBS[MID1C.SVID].Dopler = dopler - RcvClDrift; // Carrier-Frequency (m/Sec) --> Dopler frequency (Hz) OBS[MID1C.SVID].TimeTrack = TimeTrack; // Time in Track (mSec) OBS[MID1C.SVID].db = CN1; // уровень сигнала от текущего спутника по 1-му каналу приемника И вот что получается в файлах RINEX и Parsing: Спойлер (Наведите указатель мыши на Спойлер, чтобы раскрыть содержимое) Раскрыть Спойлер Свернуть Спойлер GlobalSat BT-308-2 ------------------ RINEX-OBS.txt ------------- 13 02 28 11 40 45.5949577 0 7G2G13G7G31G29G4G10 23488619.683 -385592.492 -1570.383 9 20280345.263 3635.137 -1083.992 9 23622276.928 -251942.037 -3597.141 1 24844243.373 -528929.206 -3597.141 0 25138838.515 -534141.973 -3597.141 0 22397795.429 22550.823 1346.672 9 22356581.714 -18680.046 -2863.148 9 Parsing.txt ----------- Record 07(07) Clock Status: 705 387645.59 4 91128 1735969 387645.594 Record 1C(28) RAW data: 31000 13 387645.596636 20783222.450521 17134.845703 506510.795266 0.000000 24576 47 Record 1C(28) RAW data: 31000 7 387645.596636 24124687.707482 16656.779297 250459.936471 0.000000 -3072 0 Record 1C(28) RAW data: 31000 31 387645.596636 25348016.881944 18026.986328 -25212.028407 0.000000 -3072 0 Record 1C(28) RAW data: 31000 29 387645.596636 25641706.402282 17133.496094 -31267.665349 0.000000 -9216 33 Record 1C(28) RAW data: 31000 4 387645.596636 22901131.819792 17597.390625 525889.026598 0.000000 -11264 45 Record 1C(28) RAW data: 31000 10 387645.596636 22859119.460822 16796.263672 483857.029280 0.000000 28672 43 Record 1C(28) RAW data: 31000 2 387645.596636 23991119.535400 17042.390625 116883.682171 0.000000 8192 0 GlobalSat BU-353S4 (SirfStar-IV) -------------------------------- RINEX-OBS.txt ------------- 13 02 28 12 31 3.0000598 0 12G30G13G23G10G7G16G2G4G8G20G29G5 22926872.990 -448605.522 345.828 0 20085862.126 -466541.804 -94292.000 0 21007686.430 21007756.073 -94292.000 0 21123538.303 -466541.804 -94292.000 0 21780651.315 21780488.053 -2717.750 0 22113101.789 22112953.749 -2717.750 0 23127923.278 23127769.911 348.242 0 23648441.593 23648296.598 348.242 0 24502585.924 24502439.787 -3581.008 0 24581030.833 -466541.804 -3581.008 0 25041396.436 25041225.182 768.727 0 25244076.541 -466541.804 768.727 0 Parsing.txt ----------- Record 07(07) Clock Status: 705 390663.00 10 94295 1675960 390662.999 Record 1C(28) RAW data: 712930335 13 390663.001676 20570441.803822 18023.365234 0.000000 0.000000 12288 25 Record 1C(28) RAW data: 712930335 23 390663.001676 21492538.557861 18301.113281 21492600.018965 0.000000 12288 27 Record 1C(28) RAW data: 712930335 10 390663.001676 21607757.880711 17694.201172 21607598.233743 0.000000 12288 26 Record 1C(28) RAW data: 712930335 7 390663.001676 22264629.426370 17426.238281 22264457.030325 0.000000 12288 27 Record 1C(28) RAW data: 712930335 16 390663.001676 22597565.472174 17926.060547 22597422.570171 0.000000 12288 27 Record 1C(28) RAW data: 712930335 2 390663.001676 23612476.255575 18009.521484 23612322.317242 0.000000 12288 34 Record 1C(28) RAW data: 712930335 4 390663.001676 24133482.541928 18488.785156 24133328.413559 0.000000 12288 27 Record 1C(28) RAW data: 712930335 8 390663.001676 24986391.890420 17261.775391 24986244.421315 0.000000 12288 34 Record 1C(28) RAW data: 712930335 20 390663.001676 25066267.537807 18685.332031 0.000000 0.000000 12288 22 Record 1C(28) RAW data: 712930335 29 390663.001676 25526034.405954 18089.294922 25525857.443517 0.000000 12288 28 Record 1C(28) RAW data: 712930335 5 390663.001676 25727879.401003 17258.132813 0.000000 0.000000 12288 22 Record 1C(28) RAW data: 712930335 30 390663.001676 23412162.517724 18336.294922 0.000000 0.000000 12288 22