RTKlib/постпроцессинг

Тема вроде бы на 99% русскоезычными символами написана.
При определенных условиях можно используя определенные бытовые приемники
определить координаты антенны приемника с сантиметровой точностью
в геоцентрических координатах. При каких условиях, какими приемниками,
обработкой какими программными пакетами и в каких координатных системах и
обсуждалось здесь на 73 страницах.

Пятерка современных топ-производителей GPS приемников выглядит так: qualcomm, broadcom, u-blox, mediatek и stmicro.
Первые два можно сразу забыть. u-blox описан в теме подробнее чем где-либо то ни было.
Из stmicro можно при определенных усилиях выжать эфемериды и псевдодальности
(но не фазовые измерения afaik). Про mediatek даже и этого сказать нельзя,
хотя если сильно поднапрячься, думаю эфемериды можно выковырять.
Так что остаются на выбор: бывший гигант sirf (PITA если это не sirf4, и не совсем старые sirf2 и sirf1)
и u-blox.

Я просил описание принципа, а не 90% воды размазанной по более чем полусотне страниц.

Сам нагуглил: http://habrahabr.ru/post/244475/
Может кому ещё поможет.

Оно так, но это как работа пилота со стороны - тумблер на взлёт, штурвал на себя и всё летишь на автопилоте. А то что там потолок весь в кнопках, так это так для красоты.

По большей части да - “потолок” используется в основном в нештатных ситуациях.

Наконец удалось успешно перепрошить sirf3 (arduino GPS shield с модулем globalsat EB-365) на новую
прошивку с включенной фазой. Теперь можно будет сравнить пары sirf2, sirf3, sirf4 и neo-m8t
подключенные через сплиттер.
А вот HTC Artemis хотя и принимает команду MID148, дальше ни на что не реагирует,
и это плохой знак…
Остается последняя надежда на HTC Athena.

COM8@115200 вкомпилирован в текст программы, и его там легко пропатчить, но есть и другие проблемы:
на WM5/6 надо предварительно 1) отключать GPS Intermediate Driver https://msdn.microsoft.com/de-de/library/bb202088.aspx / https://msdn.microsoft.com/de-de/library/bb202097.aspx
и 2) знать на каком COM находится “настоящий” порт.
Тут мелкомягкие так намудрили, что сами лучшего совета чем


Well, if your device has a built-in GPS, then it is on a fixed port, 
and you need to figure out what that port number is.  
There are any number of ways to do this; I usually just do 
a web search on live.com for the model name, "port", and "GPS".

предложить не могут: http://blogs.msdn.com/b/windowsmobile/archive/2006/06/07/620387.aspx
На HTC Artemis это вроде как COM4, но пока у меня ничего не работает.
На HTC Athena порт COM5, там я более оптимистичен.

HTC был настоящим производителем и iPAQ и Loox и еще много чего.

У меня на одном из смартфонов не работала программа сбора бинарных данных, ни напрямую, ни через GPS Intermediate Driver, не видела приёмник, словно нет его. Но заработала через GPS Gate !
Может в некоторых устройствах Win Mobile намудрили GPS с RTS/CTS (например приёмник включается по этому сигналу).

На HTC Athena исключено, так как для GPS используются только RX и TX,
а для BT и RTS/CTS
http://web.archive.org/web/20101218004701/http://htc-linux.org/wiki/index.php?title=AthenaGPIO
Я поменял COM8 на COM5 в htcgpsupdate.exe и она перестала работать.
Цифровая подпись. Грохнул и ее, но все равно “error (3)”:
http://forum.xda-developers.com/showthread.php?t=336328&page=41

Edit
gps_firmware_check_tool.exe (который отлично сработал на Mio168)
прошивает на скорости 38400 $PSRF100,0,38400,8,1,0*3C
но в нем забит порт COM2.
К тому же встает вопрос о совместимости dlgsp2(SST_AMD_Fujitsu_115200).bin с sirf3 и sirf4
(аналогичный код вкомпилирован в sirfflashcl.exe, и не поставляется отдельно,
поэтому его еще надо идентифицировать и экстрагировать: detect.bin, generic.bin, generica.bin и macronix.bin).

Корень зла заключается в программе QuickGPS, и ее взаимодействием с GPSID,
которое не дает использовать “железный” порт.
Как ее убрать простыми способами (не полной перепрошивкой
без QuickGPS.cab) я пока не понял.

Разборка HTC Artemis на выходных показала несколько интересных результатов:
плата работает в режиме трекера и без блока LCD. При желании можно отпаять
антенный разъем MS-147 и припаять что-то другое, размеры там не SMD.
Прошивки бывают 2 версий: 3.2.4 как в вики и 3.2.1 как здесь ранее в теме.
Обе (де-факто) залочены на 57600 (при этом виртуальный порт GPSID настаивает на 9600).
Это вообще совместимо с перепрошивкой,
там вроде как на первом этапе необходимо 38400 ?
Где вообще можно в прошивке поправить начальную скорость (и протокол) ?
Я уже видел sirf3 прошивки с 9600, 38400 и 57600.
Также меня смущает отсутствие исходников для sirfmemdump.bin
(не совпадает с generic.bin), но при размере программы в 3K это не очень
критично.

Нашел их, но после замены arm-rtems на современный toolchain имею такую ошибку


$ PATH=/opt/gcc-arm-none-eabi-5_2-2015q4/bin:$PATH make
cd arm && make
-------- begin  --------
arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 5.2.1 20151202 (release) [ARM/embedded-5-branch revision 231848]
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Compiling C: src/sirfmemdump.c
arm-none-eabi-gcc -c -mthumb -mcpu=arm7tdmi -mthumb-interwork -I. -gdwarf-2   -Os -ffunction-sections -fdata-sections -W -Wall -Wcast-align -Wimplicit -Wpointer-arith -Wswitch -Wredundant-decls -Wreturn-type -Wshadow -Wunused -Wa,-adhlns=src/sirfmemdump.lst -I./include -Wcast-qual -MD -MP -MF .dep/sirfmemdump.o.d -Wnested-externs -std=gnu99 -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations src/sirfmemdump.c -o src/sirfmemdump.o
/tmp/cc4BLFEB.s: Assembler messages:
/tmp/cc4BLFEB.s:769: Error: lo register required -- `ldmia ip!,{R0-R3}'
Makefile:327: recipe for target 'src/sirfmemdump.o' failed

Edit
Хмм, поменялись какие-то правила для inline asm :wink:


                  asm volatile(
                        "LDMIA %[src]!, {R0-R3} \n\t"
                        "MOV LR, PC \n\t"
                        "BX %[f_p] \n\t"
                        "STMIA %[dst]!, {R0-R3} \n\t"
                        :
                        : [f_p]"r"(f_p), [src]"r"(&src.u8), [dst]"r"(&dst[0])
                        : "memory", "r0", "r1", "r2", "r3", "lr"
                        );

.s


        .syntax divided
@ 183 "src/sirfmemdump.c" 1
        LDMIA ip!, {R0-R3}
        MOV LR, PC
        BX r5
        STMIA r6!, {R0-R3}

Edit2
Rn must be in the range r0-r7 http://infocenter.arm.com/help/topic/com.arm.doc.dui0068b/BABEFCIB.html
ip=r12 http://infocenter.arm.com/help/topic/com.arm.doc.dui0040d/ch06s02s01.html

Edit3
“r” нельзя применять в thumb моде http://www.ethernut.de/en/documents/arm-inline-asm.html
“l”

С небольшими модификациями удалось собрать версии sirfdump и sirfmemdump для
wince с помощью компилятора mingw32ce http://cegcc.sourceforge.net
Наблюдаются (непонятные мне) некоторые глюки с SHMENU, но все остальное работает отлично.
rtklib для wince я уже как-то собирал, т.е. можно и мини-логгер sirf&ublox сделать,
в том числе для совсем старомодных девайсов типа Mio168 или Acer n35.
rtknavi для wince я бы предпочел написать на qt, а не native.

Каких только интересных китайских устройств не бывает.
В трекере Coban TK-103B
(Coban CB900, CPU MTK MT6260DA https://github.com/sutajiokousagi/fernvale-nuttx/tree/master/nuttx/arch/arm/src/mt6260
, mainboard Coban 103-141014)
используется не только несертифицированый (и несертифицируемый в ITU Region 1)
ПДУ на частоте 315 MHz (хотя все сертификаты якобы имеются),
но и GPS приемник Coban NS-1315 (по пинам аналог Royaltek REB-1315 с sirf3)
с китайским клоном sirf3 HX8222/HX8211


$PHXMTXT,Version: HXGSW2_008BNX_A1_S5_2.6.2R.012213_N4800_HX8211O*7C
$PHXMTXT,TOW:  409870*0D
$PHXMTXT,WK:   1877*76
$PHXMTXT,POS: 6378137 0 0*30
$PHXMTXT,CLK:  96308*33
$PHXMTXT,CHNL: 12*69

Нечто похожее используется в dashcam 0805 mini


$PHXMTXT,g_ChipVersion = 3005*15
$PHXMTXT,Version: HXGSW2_ROM_2.8.2R.021914_N9600_HX8211C*5B
$PHXMTXT,TOW: 175433*08
$PHXMTXT,WK: 1864*74
$PHXMTXT,POS: 6378137 0 0*30
$PHXMTXT,CLK: 96250*3F
$PHXMTXT,CHNL: 12*69

Насколько это хороший клон, и есть ли там raw data et al. пока непонятно,
так как внешнее питание управляется чипом MTK и он включает GPS только периодически.


Parameter Description Performance
 Chip HX8222 / HX8211 HX GPS chipset
The baud rate is programmed before the factory fixed baud rate 4800/9600 
 Conventional frequency GPS L1 (1575.42MHz) C / A Code signal
Software adjustable output frequency 1Hz (default) / 10Hz
  Channel 24
Dynamic conditions highly <18km
  Precision level <10m
Velocity <515m / s
  Height <10m
Acceleration ≤3g
  Speed 0.2m / s
Full speed TTL serial interface port (2.8V)
  Time 0.1s
Other 2UARTS (VK1613HX)
TTFF Hot start 1s
Protocol NMEA0183 / SiRF Binary
  Warm start 36s
Supply voltage 2.75V-3.6V
  Cold start 6s
WGS-84 coordinate system default

Командой (документированной, если очень внимательно гуглить) $PHXM100,0,115200,8,1,0*1E
приемник переводится в некий пакетный режим HX_Binary, но с sirf binary он не имеет ничего общего.
Единственное, что можно еще попробовать, это в режиме BOOTSEL=1 с
помощью sirfmemdump сделать дамп адресного пространства (например как у sirf
ROM@0x20000000 и FLASH@0x40000000). CPU core у китайцев как и у sirf ARM7TDMI
http://www.design-reuse.com/news/16524/xi-huaxun-licenses-arm7tdmi-processor.html
Пример успешного дампа первых 4K+1b ROM на sirf3 свежескомпилированным sirfmemdump:


$ ./sirfmemdump -p /dev/ttyUSB39 -i -v 6 dump 0x20000000 0x20001000 > 0x20000000_0x20001000
./sirfmemdump: port set up...
./sirfmemdump: passed sanity checks...
./sirfmemdump: loader read in...
./sirfmemdump: blocking signals...
./sirfmemdump: Sending loader...
gpsflash: transferring binary......done (0.00 sec).
./sirfmemdump: Unblocking signals...
./sirfmemdump: Finished.
./sirfmemdump: I see 0: 2b
./sirfmemdump: I see 1: 2b
./sirfmemdump: I see 2: 2b
./sirfmemdump: Loader successfully launched
./sirfmemdump: MEM_READ...
./sirfmemdump: 0x20000000...
./sirfmemdump: 0x200001f4...
./sirfmemdump: 0x200003e8...
./sirfmemdump: 0x200005dc...
./sirfmemdump: 0x200007d0...
./sirfmemdump: 0x200009c4...
./sirfmemdump: 0x20000bb8...
./sirfmemdump: 0x20000dac...
./sirfmemdump: 0x20000fa0...
./sirfmemdump: DONE

Edit
Еще у трекера Coban есть разъем, к которому можно подключиться кабелем
Nikon EG-CP16 : вроде как на AUDIO_R(RED) будет GPS_TX,
AUDIO_L(WHITE) USB_D-, и VIDEO(YELLOW) USB_D+.
Тут возможно есть шанс сделать дамп прошивки MTK MT6260DA с ее
дальнейшей модификацией, но к GPS это отношения не имеет, его в худшем случае
надо заменять на REB-1315. Тут видимо проще взять более адекватный трекер,
например уже есть китайские девайсы с ublox-m8: http://www.queclink.com/GV65 ,
правда с неизвестным микроконтроллером. Хорошо если STM32.

В вики добавили несколько другие калибровочные данные для глонасса в ublox-m8.
Не исключено, что они хранятся в OTP (самое разумное место для них, но места там
мало и это может объяснить почему используются только “целые” метры).
Так что любители глонасс, good luck разбираться с этой нанотехнологией.
Впрочем, автор rtklib писал, что собирается для вас написать калибровочную программу
для версии 2.4.3.
Я написал мини-логгер для wince с приемниками u-blox. В помещении работает,
надо проверить его на свежем воздухе.

На устройстве с ublox7@9600 все заработало, а вот с ublox5 какие-то странности.
При (родной стандартной) скорости 4800 он работает, но потом не справляется
с объемом данных TRK-TRKD5, а если скорость повысить, то TRK-TRKD5 пропадает…
Вообще работа с baud rates в wince это просто PITA, особенно с GPSMID
от производителя.

Edit
rtklib на эхолоте Lowrance Elite http://www.lowrance.com/en-US/Products/Elite , вот это будет
действительно достойный хак. Но для этого опять же нужна qt версия rtknavi,
с железом и линуксом я наконец разобрался :sunglasses:

А на wince он пишет логи на флешку?
И смотрю про qt тут уже мантры пишешь :slight_smile: Попробую на праздниках воссоздать интерфейс. А вот с подключением к rtklib возможно возникнут трудности.

Да. Легкая модификация “NMEA logging” вот отсюда http://mycartrek600.blogspot.com .
Собирается простой командой
arm-mingw32ce-gcc logit.c -o logit.exe
без всяких .vcproj и прочей жути :wink:
Я добавил только “b” к fopen (иначе получались очень неприятные вещи)


    if ((LOG_stream=fopen(LOG_fname, "ab+")) == NULL)

и инициализацию ublox сырых данных в NMEA_init (также можно будет проделать и с sirf)



    SetupComm(NMEA_handle, 0x1000, 0x1000); /* in , out */

#if 0
  unsigned char w2[]={0xB5,0x62,0x06,0x00,0x14,0x00,0x01,0x00,0x00,0x00,0xD0,0x08,0x00,0x00,0x00,0xE1,0x00,0x00,0x07,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0xDE,0xC9};

  sendUBX(w2,sizeof(w2));

  GetCommState (NMEA_handle, &portState);
   
  // Change the DCB structure settings.
  portState.BaudRate = 57600;              // Current baud
  portState.fBinary = TRUE;               // Binary mode; no EOF check

  SetCommState (NMEA_handle, &portState);
    PurgeComm(NMEA_handle, PURGE_RXCLEAR); /* Baud rate wouldn't change without this ! (?) */
#endif

  // TRK-TRKD5
  unsigned char w3[]={0xb5,0x62,0x06,0x01,0x08,0x00,0x03,0x0a,0x00,0x01,0x00,0x00,0x00,0x00,0x1d,0x06};
  sendUBX(w3,sizeof(w3));

  Sleep(2000); // ms NAV-TIMEGPS
  unsigned char w1[]={0xb5,0x62,0x06,0x01,0x08,0x00,0x01,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x31,0x90};
  sendUBX(w1,sizeof(w1));

  Sleep(2000); // ms TRK-SFRBX
  unsigned char w2[]={0xb5,0x62,0x06,0x01,0x08,0x00,0x03,0x0f,0x00,0x01,0x00,0x00,0x00,0x00,0x22,0x29};
  sendUBX(w2,sizeof(w2));

  Sleep(2000); // ms TRK-SFRB
  unsigned char w4[]={0xb5,0x62,0x06,0x01,0x08,0x00,0x03,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x15,0xce};
  sendUBX(w4,sizeof(w4));

sendUBX это просто WriteFile (NMEA_handle,…), подойдет и для sirf.

+5. Смотрю я на цифирки ‘Viewed’ и думаю: хоть бы кто-нибудь помог :sunglasses:

Думаю это будет самая простая часть.
rtkplot было бы вообще сказкой, но там нетривиальные виджеты.
Я тут натолкнулся с ним на интересную вещ:
teqc отказался работать с RINEX OBS больше 2 ГБ :slight_smile:

Важно не нарваться на китайский клон Nikon EG-CP14: у него нет AUDIO_R красного
разъема, т.е. выхода сигнала GPS :wink: А UC-E6 вообще никуда не годится, у него пинов совсем мало,
и пины не те, и не там.

В России продается под названим “NAVIXY A7”.