Main Content

receiverposition

Estimate GNSS receiver position and velocity

Description

recPos = receiverposition(p,satPos) returns the receiver position estimated from the pseudoranges and satellite positions.

[recPos,recVel] = receiverposition(___,pdot,satVel) also returns the receiver velocity estimated from the pseudorange rates pdot and satellite velocities satVel.

example

recPos = receiverposition(gnssmeas) returns the receiver position estimated raw GNSS measurements.

[recPos,recVel] = receiverposition(___,gnssopts) specifies options such as atmospheric models.

example

[recPos,recVel,hdop,vdop] = receiverposition(___) also returns the horizontal dilution of precision hdop and vertical dilution of precision vdop associated with the position estimate.

[recPos,recVel,hdop,vdop,info] = receiverposition(___) returns information about the clock bias, clock drift, and time dilution of precision.

Examples

collapse all

Read observation and navigation data from the RINEX files.

[obsdata,obshdr] = rinexread("GODS00USA_R_20211750000_01H_30S_MO.rnx");
[navmsg,navhdr] = rinexread("GODS00USA_R_20211750000_01D_GN.rnx");

Get GNSS measurements from the observation and navigation data.

meas = gnssmeasurements(obsdata.GPS,navmsg.GPS);

Estimate the receiver position from the GNSS measurements and display the receiver position for the first time stamp of the RINEX file.

lla = receiverposition(meas);
lla(1,:)
ans = 1×3

   39.0205  -76.8273   36.6238

Use the receiverposition function to estimate a GNSS receiver position. Get the satellite positions and velocities using the gnssconstellation function. Generate pseudoranges from these positions using the pseudoranges function.

Specify a receiver position in geodetic coordinates (latitude, longitude, altitude) and a receiver velocity in the local navigation frame.

recPos = [42 -71 50];
recVel = [1 2 3];

Get the satellite positions for the current time.

t = datetime('now');
[gpsSatPos,gpsSatVel] = gnssconstellation(t);

Get the pseudoranges and pseudorange rates between the GNSS receiver and the satellites.

[p,pdot] = pseudoranges(recPos,gpsSatPos,recVel,gpsSatVel);

Use the pseudoranges to estimate the receiver position and velocity. The values close to your original receiver position and velocity used to generate the satellite position and pseudoranges.

[lla,gnssVel] = receiverposition(p,gpsSatPos,pdot,gpsSatVel)
lla = 1×3

   42.0000  -71.0000   49.5625

gnssVel = 1×3

    1.0000    2.0140    2.9972

Read the data from a RINEX navigation and observation messages. These RINEX files contain GNSS data for March 29, 2025.

navFileName = "GODE00USA_R_20250880000_01D_GN.rnx";
obsFileName = "GODE00USA_R_20250880800_01H_30S_MO.rnx";
[rnxnavdata,rnxnavhdr] = rinexread(navFileName);
[rnxobsdata,rnxobshdr] = rinexread(obsFileName);

Create ionosphere and troposphere delay models. Use the Klobuchar model for the ionosphere delay model with the GPS alpha and beta coefficients from the header file.

ionoParams = rnxnavhdr.IonosphericCorrections;
alpha = ionoParams(1).Parameters;
beta = ionoParams(2).Parameters;
ionoDelayModel = gnssIonosphere("klobuchar",alpha,beta);
tropoDelayModel = gnssTroposphere("saastamoinen");

Create the GNSS options for estimating the receiver position.

opts = gnssoptions(Ionosphere=ionoDelayModel,Troposphere=tropoDelayModel);

Get the GNSS measurements for the GPS satellites using the RINEX navigation and observation messages. Show the data for the first three time steps.

gpsData = gnssmeasurements(rnxobsdata.GPS,rnxnavdata.GPS);
gpsData(1:3,:)
ans=3×8 timetable
            Time            SatelliteID    Pseudorange                SatellitePosition                SatelliteClockBias    PseudorangeRate          SatelliteVelocity          SatelliteClockDrift    EphemerisAccuracy
    ____________________    ___________    ___________    _________________________________________    __________________    _______________    _____________________________    ___________________    _________________

    29-Mar-2025 08:00:00         1         2.4375e+07      -2.126e+07    -1.4117e+07     7.4018e+06        0.00019738              NaN          -471.47    -855.01      -2983        1.8076e-11                 2        
    29-Mar-2025 08:00:00         2          2.566e+07     -2.0524e+07    -1.6951e+07    -2.4589e+06       -0.00020789              NaN           429.94     23.954    -3140.9         9.436e-12                 2        
    29-Mar-2025 08:00:00         3         2.2235e+07     -1.2415e+07    -9.5047e+06      2.132e+07         0.0006808              NaN           578.88    -2675.8    -837.42        3.5243e-12                 2        

Calculate the receiver positions by using the GPS measurements and the options specified by the gnssoptions object. Show the receiver positions for the first three time steps.

[recPos,recVel,hdop,vdop,info] = receiverposition(gpsData,opts);
recPos(1:3,:)
ans = 3×3

   39.0217  -76.8268   13.7420
   39.0217  -76.8269   13.0003
   39.0217  -76.8268   12.2894

Input Arguments

collapse all

Pseudoranges between the satellites and receiver, specified as an N-element vector in meters. N is the number of satellites in the constellation.

Data Types: single | double

Satellite positions in the Earth-centered Earth-fixed (ECEF) coordinate system in meters, specified as an N-by-3 matrix of scalars. N is the number of satellites in the constellation.

Data Types: single | double

Pseudorange rates between the satellites and receiver, specified as an N-element vector in meters per second. N is the number of satellites in the constellation.

Data Types: single | double

Velocity readings of the GNSS receiver in the Earth-centered Earth-fixed (ECEF) coordinate system in meters per second, specified as a N-by-3 matrix of scalars. N is the number of satellites in the constellation.

Data Types: single | double

Raw GNSS measurements, specified as a timetable.

Use the gnssmeasurements function to get these measurements.

Options for calculating receiver position from GNSS measurements, specified as a gnssoptions object.

Output Arguments

collapse all

Receiver position in geodetic coordinates, returned as a three-element vector of the form [latitude longitude altitude]

Data Types: single | double

Receiver velocity in the local navigation frame using north-east-down (NED) coordinates, returned as a three-element vector of the form [vx vy vz].

Data Types: single | double

Horizontal dilution of precision, returned as a scalar.

Data Types: double

Vertical dilution of precision, returned as a scalar.

Data Types: double

Information about clock bias, clock drift, and time dilution of precision (TDOP), returned as a structure containing these fields:

  • ClockBias — Estimated bias error in receiver clock, in seconds.

  • ClockDrift — Estimated drift error in receiver clock, in seconds per second.

  • TDOP — Time dilution of precision.

Algorithms

collapse all

References

[1] Groves, Paul D. Principles of GNSS, Inertial, and Multisensor Integrated Navigation Systems. 2nd ed. GNSS Technology and Application Series. Boston: Artech House, 2013.

Extended Capabilities

expand all

C/C++ Code Generation
Generate C and C++ code using MATLAB® Coder™.

Version History

Introduced in R2021a

expand all