Subject: RTK GPS
From: Paul
Date: 5/5/2000, 2:23 PM

Russell Kent wrote:

Rob (and others),
Real-time kinematic refers to a type of *differential* GPS surveying.  Differential GPS (DGPS) has sub-centimeter precision capability when measuring the difference between two (or more) GPS receivers' positions.  So you take one receiver, nail it to a tree, and call it the "reference" station.  A transmitter attached to the reference GPS
sends out correction information continuously.  A second GPS tracks the *same* satellites as the reference GPS.  This second GPS is the "mobile" or "rover" GPS.  The rover GPS receives the reference GPS unit's transmissions, and measures very precisely the difference between its location and the nail in the tree (the reference GPS).

It makes no sense to have both the reference and rover GPS units on the helicopter unless you're trying to measure the deflection of the boom (reference on the keel, rover on the end of the boom) or other such lunacy.  Hmm, I can see a need for this on B52 wingtips... :-)

I don't think this is done with the lat long data from the GPS. I think
this is done by measuring  the GPS RF signal phase difference from two or 
more different antennas on the same vehicle. How this could improve lat/long
position accuracy (if it can) is not clear to me. 

It can measure the roll and pitch and the bending of the wings if antennas 
are mounted on the wing tips and the fuselage. I know the GPS receiver 
knows the azimuth and elevation of the satellites it is receiving data 
from so in theory it can calculate the angle to those satellites.
Perhaps that somehow helps in position calculations. See the attached files
below. PL


So a RTK GPS on a helicopter must be using a DGPS station on the ground to get high-precision positioning relative to that DGPS station.  The DGPS station's transmissions include not only the correction to the GPS signal (per satellite), but also the station's precise, accurate location.

Look at it another way:
If it were possible to get precise, accurate positioning information from the civilian signals ("C/A" signal) in a self-contained unit (i.e. not DGPS), the military would 
not go to so much trouble and expense to have the military GPS signals ("P" signal) ?

Russell Kent

The attached data are the visible  sat positions as received. The NEMA 0183 
data is in the form of; Sentence designator,  sat number, azimuth and elevation
and finally a check sum. The B sentence is the first group and the C sentences is 
the second group of sats.

The DOS  QB program reads this information and displays it on a 640 by 480
VGA screen. Fun to watch as the sats come up over the horizon and set
again below the horizon. I will see if I can come up with a screen
capture.

Paul Lamar
 
 
The Aircraft Rotary Engine Newsletter.              Powered by Linux.

http://home.earthlink.net/~rotaryeng/            http://www.linux.org

SAT4.DAT
$PLWRB,M,06,24,62,035,20,47,315,12,42,209,16,38,135,09,22,207,13,15,058*10
$PLWRC,M,01,03,12,268,,,,,,,,,,,,,,,*2A
$PLWRB,M,06,24,61,035,20,48,314,12,41,209,16,39,134,09,21,207,13,14,059*1D
$PLWRC,M,01,03,13,269,,,,,,,,,,,,,,,*2A
$PLWRB,M,06,24,60,035,20,49,314,12,40,208,16,40,133,09,20,206,13,14,060*1E
$PLWRC,M,01,03,13,270,,,,,,,,,,,,,,,*22
$PLWRB,M,06,24,59,035,20,50,313,16,40,132,12,39,208,09,20,206,03,14,271*17
$PLWRC,M,01,13,13,061,,,,,,,,,,,,,,,*21
$PLWRB,M,06,24,58,035,20,51,313,16,41,132,12,38,207,09,19,205,03,14,272*12
$PLWRC,M,02,13,13,061,17,05,228,,,,,,,,,,,,*19
$PLWRB,M,06,24,57,036,20,52,312,16,42,131,12,37,207,09,18,205,03,14,273*13
$PLWRC,M,02,13,12,062,17,06,229,,,,,,,,,,,,*19
$PLWRB,M,06,24,56,036,20,53,312,16,42,130,12,36,207,09,17,204,03,15,273*1C
$PLWRC,M,03,13,12,063,17,07,229,25,05,319,,,,,,,,,*21
$PLWRB,M,06,24,56,036,20,53,311,16,43,129,12,35,206,09,17,204,03,15,274*13
$PLWRC,M,03,13,11,064,17,07,229,25,06,318,,,,,,,,,*27
$PLWRB,M,06,24,55,036,20,54,311,16,44,128,12,34,206,09,16,203,03,16,275*14
$PLWRC,M,03,13,11,065,17,08,230,25,06,318,,,,,,,,,*21
$PLWRB,M,06,20,55,310,24,54,036,16,44,127,12,33,205,03,16,276,09,15,203*1E
$PLWRC,M,03,13,10,065,17,09,230,25,06,317,,,,,,,,,*2E
$PLWRB,M,06,20,56,309,24,53,037,16,45,126,12,32,205,03,17,277,09,14,202*12
$PLWRC,M,03,13,10,066,17,10,231,25,06,316,,,,,,,,,*25
$PLWRB,M,06,20,57,308,24,52,037,16,46,124,12,31,205,03,17,278,09,14,202*1E
$PLWRC,M,03,17,10,231,13,09,067,25,07,315,,,,,,,,,*2E
$PLWRB,M,06,20,58,307,24,51,037,16,46,123,12,30,204,03,17,279,09,13,201*1F
$PLWRC,M,03,17,11,232,13,09,068,25,07,315,,,,,,,,,*23
$PLWRB,M,06,20,58,306,24,50,037,16,47,122,12,29,204,03,18,280,09,12,201*1F
$PLWRC,M,03,17,12,232,13,08,069,25,07,314,,,,,,,,,*21
$PLWRB,M,06,20,59,305,24,49,038,16,47,121,12,29,204,03,18,281,17,12,233*16
$PLWRC,M,03,09,12,200,13,08,069,25,07,313,,,,,,,,,*28
$PLWRB,M,06,20,60,304,24,49,038,16,48,120,12,28,203,03,19,282,17,13,234*11
$PLWRC,M,03,09,11,200,25,08,312,13,07,070,,,,,,,,,*22
$PLWRB,M,06,20,61,303,16,49,119,24,48,038,12,27,203,03,19,283,17,14,234*14
$PLWRC,M,03,09,10,199,25,08,312,13,07,071,,,,,,,,,*21
$PLWRB,M,06,20,61,302,16,49,117,24,47,039,12,26,203,03,20,283,17,14,235*1F
$PLWRC,M,03,09,10,199,25,08,311,13,06,072,,,,,,,,,*20
$PLWRB,M,06,20,62,300,16,50,116,24,46,039,12,25,202,03,20,284,17,15,235*12
$PLWRC,M,03,09,09,198,25,08,310,13,06,073,,,,,,,,,*29
$PLWRB,M,06,20,63,299,16,50,115,24,45,039,12,24,202,03,20,285,17,16,236*12
$PLWRC,M,03,25,08,309,09,08,198,13,05,073,,,,,,,,,*23
$PLWRB,M,06,20,63,297,16,51,113,24,44,040,12,23,202,03,21,286,17,16,236*11
$PLWRC,M,02,25,09,309,09,08,197,,,,,,,,,,,,*1F

SAT-DIS4.BAS
'Takes in RS232 NEMA 0183 formated data from most GPS's and displays sat pos.
'
'
CLS
LOCATE 12, 1: INPUT "                   Do want a playback y/n "; yn$

yn$ = RTRIM$(LTRIM$(UCASE$(yn$)))

IF yn$ = "Y" GOTO playback

OPEN "sat.dat" FOR APPEND AS #4
OPEN "COM1:4800,N,8,2,ASC,LF,OP0,RS,RB32000,TB1,CD0,DS0,CS0" FOR RANDOM AS #1
ON TIMER(120) GOSUB doit2
TIMER ON

CLS
SCREEN 12

CIRCLE (230, 230), 230
CIRCLE (230, 230), 2

LOCATE 4, 62
PRINT "Waiting for data.";
LOCATE 6, 62
PRINT " Please wait for"
LOCATE 8, 62
PRINT " 2 minutes."

LOCATE 30, 1: PRINT " Press Esc to Quit.        SOUTH          Lamar Instruments (310) 374 1673";


start2:
TIMER STOP
LOCATE 2, 65: PRINT TIME$;
TIMER ON
IF INKEY$ = CHR$(27) THEN GOTO enditall    'esc key
GOTO start2

playback:

CLS
SCREEN 12

CIRCLE (230, 230), 230
CIRCLE (230, 230), 2
LOCATE 30, 1: PRINT " Press Esc to Quit         SOUTH          Lamar Instruments (310) 374 1673";

OPEN "sat.dat" FOR INPUT AS #3 LEN = 18000
DO WHILE NOT EOF(3)
LINE INPUT #3, temp$
IF MID$(temp$, 1, 6) = "$PLWRB" THEN GOSUB dob:
IF MID$(temp$, 1, 6) = "$PLWRC" THEN GOSUB doc:
IF INKEY$ = CHR$(27) THEN GOTO enditall    'esc key

LOOP
CLOSE #3

enditall:
LOCATE 2, 50
INPUT " Press any key to end "; z$
CLS 0
LOCATE 5, 1: PRINT "                 SAT-DISPL.EXE Copyright 1993 Paul Lamar"
             PRINT
             PRINT "                     Lamar Instruments"
             PRINT "                     1715 Dixon St."
             PRINT "                     Redondo Beach CA"
             PRINT "                     90278  (310) 374 1673"
LOCATE 18, 1: PRINT "                      HAVE A NICE DAY"
LOCATE 30, 1: PRINT " Press Esc to Quit.";
FOR z = 1 TO 50000
IF INKEY$ = CHR$(27) THEN GOTO enditall2    'esc key
NEXT
enditall2:
CLS 0
CLOSE
END


doit2:

TIMER STOP
x = x + 1
ON ERROR GOTO errorhand1
temp$ = INPUT$(LOC(1), #1)       'LOC(1) gives the number of char in the buff

OPEN "temp2.bas" FOR OUTPUT AS #2 LEN = 18000
PRINT #2, temp$
CLOSE 2
OPEN "temp2.bas" FOR INPUT AS #3 LEN = 18000
DO WHILE NOT EOF(3)
LINE INPUT #3, temp$
IF MID$(temp$, 1, 6) = "$PLWRB" THEN GOSUB dob:
IF MID$(temp$, 1, 6) = "$PLWRC" THEN GOSUB doc:
LOOP
CLOSE #3
TIMER ON
RETURN

errorhand1:
RESUME NEXT



dob:
IF yn$ = "Y" THEN GOTO skipdob1
PRINT #4, temp$;
PRINT #4, ",";
PRINT #4, TIME$;
PRINT #4, ",";
PRINT #4, DATE$

skipdob1:


'         1         2         3         4         5         6         7
'123456789012345678901234567890123456789012345678901234567890123456789012
'$PLWRB,M,06,24,77,174,12,71,275,09,51,240,13,39,029,20,15,312,07,14,067*1C

Prn01 = VAL(MID$(temp$, 13, 2))
elev1 = VAL(MID$(temp$, 16, 2))
azim1 = VAL(MID$(temp$, 19, 3))
Prnx = Prn01
azmith = elev1
angle = azim1
GOSUB plotit1
Linex = 4
GOSUB printit

Prn02 = VAL(MID$(temp$, 23, 2))
elev2 = VAL(MID$(temp$, 26, 2))
azim2 = VAL(MID$(temp$, 29, 3))
Prnx = Prn02
azmith = elev2
angle = azim2
GOSUB plotit2
Linex = 6
GOSUB printit

Prn03 = VAL(MID$(temp$, 33, 2))
elev3 = VAL(MID$(temp$, 36, 2))
azim3 = VAL(MID$(temp$, 39, 3))
Prnx = Prn03
azmith = elev3
angle = azim3
GOSUB plotit3
Linex = 8
GOSUB printit

'         1         2         3         4         5         6         7
'123456789012345678901234567890123456789012345678901234567890123456789012
'$PLWRB,M,06,24,77,174,12,71,275,09,51,240,13,39,029,20,15,312,07,14,067*1C

Prn04 = VAL(MID$(temp$, 43, 2))
elev4 = VAL(MID$(temp$, 46, 2))
azim4 = VAL(MID$(temp$, 49, 3))

Prnx = Prn04
azmith = elev4
angle = azim4
GOSUB plotit4
Linex = 10
GOSUB printit:

Prn05 = VAL(MID$(temp$, 53, 2))
elev5 = VAL(MID$(temp$, 56, 2))
azim5 = VAL(MID$(temp$, 59, 3))

Prnx = Prn05
azmith = elev5
angle = azim5
GOSUB plotit5
Linex = 12
GOSUB printit:

Prn06 = VAL(MID$(temp$, 63, 2))
elev6 = VAL(MID$(temp$, 66, 2))
azim6 = VAL(MID$(temp$, 69, 3))

Prnx = Prn06
azmith = elev6
angle = azim6
GOSUB plotit6
Linex = 14
GOSUB printit:

enddob:
RETURN



doc:
IF yn$ = "Y" THEN GOTO skipdoc1
PRINT #4, temp$;
PRINT #4, ",";
PRINT #4, TIME$;
PRINT #4, ",";
PRINT #4, DATE$
skipdoc1:

'         1         2         3         4         5         6         7
'123456789012345678901234567890123456789012345678901234567890123456789012
'$PLWRB,M,06,24,77,174,12,71,275,09,51,240,13,39,029,20,15,312,07,14,067*1C

numsat = VAL(MID$(temp$, 10, 2))

Prn07 = VAL(MID$(temp$, 13, 2))
elev7 = VAL(MID$(temp$, 16, 2))
azim7 = VAL(MID$(temp$, 19, 3))
Prnx = Prn07
azmith = elev7
angle = azim7
GOSUB plotit7
Linex = 16
GOSUB printit:

IF numsat < 2 THEN GOTO enddoc

Prn08 = VAL(MID$(temp$, 23, 2))
elev8 = VAL(MID$(temp$, 26, 2))
azim8 = VAL(MID$(temp$, 29, 3))
Prnx = Prn08
azmith = elev8
angle = azim8
GOSUB plotit8
Linex = 18
GOSUB printit:

IF numsat < 3 THEN GOTO enddoc

Prn09 = VAL(MID$(temp$, 33, 2))
elev9 = VAL(MID$(temp$, 36, 2))
azim9 = VAL(MID$(temp$, 39, 3))
Prnx = Prn09
azmith = elev9
angle = azim9
GOSUB plotit9
Linex = 20
GOSUB printit:

IF numsat < 4 THEN GOTO enddoc

'         1         2         3         4         5         6         7
'123456789012345678901234567890123456789012345678901234567890123456789012
'$PLWRB,M,06,24,77,174,12,71,275,09,51,240,13,39,029,20,15,312,07,14,067*1C

Prn010 = VAL(MID$(temp$, 43, 2))
elev10 = VAL(MID$(temp$, 46, 2))
azim10 = VAL(MID$(temp$, 49, 3))
Prnx = Prn010
azmith = elev10
angle = azim10
GOSUB plotit10
Linex = 22
GOSUB printit:

IF numsat < 5 THEN GOTO enddoc

Prn011 = VAL(MID$(temp$, 53, 2))
elev11 = VAL(MID$(temp$, 56, 2))
azim11 = VAL(MID$(temp$, 59, 3))
Prnx = Prn011
azmith = elev11
angle = azim11
GOSUB plotit11
Linex = 24
GOSUB printit:

IF numsat < 6 THEN GOTO enddoc

PRN012 = VAL(MID$(temp$, 63, 2))
elev12 = VAL(MID$(temp$, 66, 2))
azim12 = VAL(MID$(temp$, 69, 3))
Prnx = Prno12
azmith = elev12
angle = azim12
GOSUB plotit12
Linex = 26
GOSUB printit:

enddoc:
RETURN


printit:
LOCATE Linex, 62
PRINT "S"; Prnx;
LOCATE Linex, 67
PRINT " E"; azmith;
LOCATE Linex, 72
PRINT " A"; angle
RETURN

plotit1:
IF angle <= 90 THEN angle2 = 270 + angle   'Finally! this is because
IF angle > 90 THEN angle2 = angle - 90     'the stupid basic starts due east.

CIRCLE (x11, y11), 5, 0       'r = 5 color = off
CIRCLE (x11, y11), 1
angr = angle2 / 57.295
hyp = 230 - (azmith * (230 / 90))
y11 = CINT(ABS(230 + (SIN(angr) * hyp)))   'ABS was big break through and ess.
x11 = CINT(ABS(230 + (COS(angr) * hyp)))

CIRCLE (x11, y11), 1
CIRCLE (x11, y11), 5

RETURN


plotit2:
IF angle <= 90 THEN angle2 = 270 + angle   'Finally! this is because
IF angle > 90 THEN angle2 = angle - 90     'the stupid basic starts due east.

CIRCLE (x12, y12), 5, 0       'r = 5 color = off
CIRCLE (x12, y12), 1

angr = angle2 / 57.295
hyp = 230 - (azmith * (230 / 90))
y12 = CINT(ABS(230 + (SIN(angr) * hyp)))   'ABS was big break through and ess.
x12 = CINT(ABS(230 + (COS(angr) * hyp)))

CIRCLE (x12, y12), 1
CIRCLE (x12, y12), 5

RETURN

plotit3:

IF angle <= 90 THEN angle2 = 270 + angle   'Finally! this is because
IF angle > 90 THEN angle2 = angle - 90     'the stupid basic starts due east.
CIRCLE (x13, y13), 5, 0       'r = 5 color = off
CIRCLE (x13, y13), 1

angr = angle2 / 57.295
hyp = 230 - (azmith * (230 / 90))
y13 = CINT(ABS(230 + (SIN(angr) * hyp)))   'ABS was big break through and ess.
x13 = CINT(ABS(230 + (COS(angr) * hyp)))

CIRCLE (x13, y13), 1
CIRCLE (x13, y13), 5

RETURN

plotit4:

IF angle <= 90 THEN angle2 = 270 + angle   'Finally! this is because
IF angle > 90 THEN angle2 = angle - 90     'the stupid basic starts due east.

CIRCLE (x14, y14), 5, 0       'r = 5 color = off
CIRCLE (x14, y14), 1

angr = angle2 / 57.295
hyp = 230 - (azmith * (230 / 90))
y14 = CINT(ABS(230 + (SIN(angr) * hyp)))   'ABS was big break through and ess.
x14 = CINT(ABS(230 + (COS(angr) * hyp)))

CIRCLE (x14, y14), 1
CIRCLE (x14, y14), 5

RETURN

plotit5:

IF angle <= 90 THEN angle2 = 270 + angle   'Finally! this is because
IF angle > 90 THEN angle2 = angle - 90     'the stupid basic starts due east.
CIRCLE (x15, y15), 5, 0       'r = 5 color = off
CIRCLE (x15, y15), 1

angr = angle2 / 57.295
hyp = 230 - (azmith * (230 / 90))
y15 = CINT(ABS(230 + (SIN(angr) * hyp)))   'ABS was big break through and ess.
x15 = CINT(ABS(230 + (COS(angr) * hyp)))

CIRCLE (x15, y15), 1
CIRCLE (x15, y15), 5

RETURN

plotit6:

IF angle <= 90 THEN angle2 = 270 + angle   'Finally! this is because
IF angle > 90 THEN angle2 = angle - 90     'the stupid basic starts due east.
CIRCLE (x16, y16), 5, 0       'r = 5 color = off

CIRCLE (x16, y16), 1
angr = angle2 / 57.295
hyp = 230 - (azmith * (230 / 90))
y16 = CINT(ABS(230 + (SIN(angr) * hyp)))   'ABS was big break through and ess.
x16 = CINT(ABS(230 + (COS(angr) * hyp)))

CIRCLE (x16, y16), 1
CIRCLE (x16, y16), 5

RETURN

plotit7:
IF angle <= 90 THEN angle2 = 270 + angle   'Finally! this is because
IF angle > 90 THEN angle2 = angle - 90     'the stupid basic starts due east.
CIRCLE (x211, y211), 5, 0       'r = 5 color = off
CIRCLE (x211, y211), 1
angr = angle2 / 57.295
hyp = 230 - (azmith * (230 / 90))
y211 = CINT(ABS(230 + (SIN(angr) * hyp)))   'ABS was big break through and ess.
x211 = CINT(ABS(230 + (COS(angr) * hyp)))
CIRCLE (x211, y211), 1
CIRCLE (x211, y211), 5
RETURN


plotit8:
IF angle <= 90 THEN angle2 = 270 + angle   'Finally! this is because
IF angle > 90 THEN angle2 = angle - 90     'the stupid basic starts due east.
CIRCLE (x212, y212), 5, 0       'r = 5 color = off
CIRCLE (x212, y212), 1
angr = angle2 / 57.295
hyp = 230 - (azmith * (230 / 90))
y212 = CINT(ABS(230 + (SIN(angr) * hyp)))   'ABS was big break through and ess.
x212 = CINT(ABS(230 + (COS(angr) * hyp)))
CIRCLE (x212, y212), 1
CIRCLE (x212, y212), 5
RETURN

plotit9:
IF angle <= 90 THEN angle2 = 270 + angle   'Finally! this is because
IF angle > 90 THEN angle2 = angle - 90     'the stupid basic starts due east.
CIRCLE (x213, y213), 5, 0       'r = 5 color = off
CIRCLE (x213, y213), 1
angr = angle2 / 57.295
hyp = 230 - (azmith * (230 / 90))
y213 = CINT(ABS(230 + (SIN(angr) * hyp)))   'ABS was big break through and ess.
x213 = CINT(ABS(230 + (COS(angr) * hyp)))
CIRCLE (x13, y13), 1
CIRCLE (x13, y13), 5
RETURN

plotit10:
IF angle <= 90 THEN angle2 = 270 + angle   'Finally! this is because
IF angle > 90 THEN angle2 = angle - 90     'the stupid basic starts due east.
CIRCLE (x214, y214), 5, 0       'r = 5 color = off
CIRCLE (x214, y214), 1
angr = angle2 / 57.295
hyp = 230 - (azmith * (230 / 90))
y214 = CINT(ABS(230 + (SIN(angr) * hyp)))   'ABS was big break through and ess.
x214 = CINT(ABS(230 + (COS(angr) * hyp)))
CIRCLE (x214, y214), 1
CIRCLE (x214, y214), 5
RETURN

plotit11:
IF angle <= 90 THEN angle2 = 270 + angle   'Finally! this is because
IF angle > 90 THEN angle2 = angle - 90     'the stupid basic starts due east.
CIRCLE (x215, y215), 5, 0       'r = 5 color = off
CIRCLE (x215, y215), 1
angr = angle2 / 57.295
hyp = 230 - (azmith * (230 / 90))
y215 = CINT(ABS(230 + (SIN(angr) * hyp)))   'ABS was big break through and ess.
x215 = CINT(ABS(230 + (COS(angr) * hyp)))
CIRCLE (x215, y215), 1
CIRCLE (x215, y215), 5
RETURN

plotit12:
IF angle <= 90 THEN angle2 = 270 + angle   'Finally! this is because
IF angle > 90 THEN angle2 = angle - 90     'the stupid basic starts due east.
CIRCLE (x216, y216), 5, 0       'r = 5 color = off
CIRCLE (x216, y216), 1
angr = angle2 / 57.295
hyp = 230 - (azmith * (230 / 90))
y216 = CINT(ABS(230 + (SIN(angr) * hyp)))   'ABS was big break through and ess.
x216 = CINT(ABS(230 + (COS(angr) * hyp)))
CIRCLE (x216, y216), 1
CIRCLE (x216, y216), 5
RETURN