ANavS® Binary Solution Output Format

The sensor fusion solution provides two different output-streams for the position, attitude, velocity and many more states of solution and quality of solution.
By default it’s possible to configure the hardware to write to a file and/or to broadcast the solution per TCP on a customizable port (standardt-port: 6001). To stream the solution per WLAN or Ethernet, you need additionally to the defined port-number the IP-adress of your MSRTK Module, which is by default 192.168.42.1 (in case you are connected with WLAN-AP “ANavS_MSRTK_AP”).

The ANavS® sensor fusion framework provides two different protocols for the solution output, the standardized NMEA-Format and the proprietary binary protocol. In the following, the ANavS® binary protocol is described.

ANavS® Binary Protocol

The Binary Protocol is defined as follows:

Structure: Synch-Char-1 Synch-Char-2 Class ID Length Payload Checksum A Checksum B
Bytes: 1 Byte 1 Byte 1 Byte 1 Byte 2 Byte Length-Byte 1 Byte 1 Byte

The endianness of Length and the following Payload is little endian. The payload is of Length. The checksum is calculated with the 8-Bit Fletcher algorithm over Class, ID, Length and Payload with modulo 256. The ANavS® binary protocol message can be identified by Sync Char 1 = 0xB5 (dec 181), Sync Char 2 = 0x62 (dec 98), Class = 0x02 (dec 2) and Id = 0xE0 (dec 224). In the following, the type double has 8 bytes. If a variable in the Payload is given in the NED frame, the variable has three components (hence 3 times the data type, e.g. 3*double), where the components are north, east and down. This also holds for the body frame, which is the fixed frame of the rover, and where the components are given in x, y and z.

The Payload is given as:

Size Scaling Name Unit Description
uint8 id Identifier of the system/the ANavS Position and Attitude Determination (PAD) solution.
uint16 resCode Result code bitfield, which keeps
the system status and information.
uint16 week Week number of the current epoch.
double tow s Time of Week of the current epoch.
uint16 weekInit Week number of the epoch when the
system was started.
double towInit s Time of Week of the epoch when the
system was started.
int16 Reserved
double lat deg Latitude.
double lon deg Longitude.
double height m Height
double ECEF-X m X-position in ECEF-coordinate frame
double ECEF-Y m Y-position in ECEF-coordinate frame
double ECEF-Z m Z-position in ECEF-coordinate frame
3*double b m Baseline in NED frame spanned by the position given by lat, lon and height, and by the position of the reference station.
3*double bStdDev m Standard deviation of the baseline.
3*double vel m/s Velocity in NED frame.
3*double velStdDev m/s Standard deviation of the velocity.
3*double acc m/s² Acceleration in body frame.
3*double accStdDev m/s² Standard deviation of the acceleration.
3*double att deg Attitude/Euler angles (heading, pitch, roll).
3*double attStdDev deg Standard deviation of the attitude.
double accuracy m Estimated accuracy of the baseline.
double Reserved.
5*double timingInfo s First double: Elapsed time GNSS;
Second double: Elapsed time IMU;
Third double: Elapsed time Baro;
Fourth double: Elapsed time Odometry
5*double Reserved
double gnssReception Scalar, which indicates the GNSS signal reception. The value is between 0 and 20, where 20 is the best, i.e. very good conditions.
uint8 numSats Number of satellites.
Loop uint8 gnssId Identifier of the GNSS (GPS = 1, SBAS = 2, GLONASS = 4, Galileo = 8).
uint8 svId Identifier of the satellite (“PRN”)
double elev deg Elevation angle of the satellite.
double azim deg Azimuth angle of the satellite.
uint8 numRcv Number of GNSS receivers.
Loop uint8 rcvId Identifier of the receiver (unqiue within this system).
char[11] serial Serial number of the receiver (unique).
bool isRefStation Is true, if this receiver is a reference
station (stationary).
uint16 week Week number of the current epoch for this receiver. If the following tow is NaN, the weeknumber is not valid!
double tow s Time of week of the current epoch for this receiver. Can be NaN, if there are no measurements at this epoch (e.g. commonly for reference station).
double lat deg Latitude of this receiver. Only given if the receiver is a reference station, otherwise it is NaN.
double lon deg Longitude of this receiver. Only given if the receiver is a reference station, otherwise it is NaN.
double height m Height of this receiver. Only given if the receiver is a reference station, otherwise it is NaN.
3*double bodyPos m Receiver position in x, y and z (body frame).
3*double bodyMisalign m Misalignment of the receiver in x, y and z (body frame).
uint8 Reserved.
5*double sensorBufFillLvl % Sensor buffer filling level:
First double: GNSS
Second: IMU
Third: BARO
Fourth: ODO
Fifth: Raw
uint8 numSatsMeas Number of satellites for which measurements are available for this receiver.
Loop uint8 gnssId Identifier of the GNSS.
uint8 svId Identifier of the satellite.
uint8 freq Frequency band (currently that is 1 L1)).
uint16 locktime ms Carrier phase locktime counter
(maximum 64500ms).
uint8 cno dBHz Carrier-to-noise density ratio (signal
strength) [dB-Hz].
uint8 0.01*2^n prStdDev m Standard deviation of the
pseudorange measurement.
uint8 0.004 cpStdDev cycles Standard deviation of the carrier phase measurement.
uint8 0.002*2^n doStdDev Hz Standard deviation of the Doppler frequency.
uint8 trkStat Status bitfield of the tracking (see graphic below).
uint8 numBl Number of baselines spanned by a
receiver pair.
Loop uint8 rcvId1 Identifier of the receiver the baseline is pointing to.
uint8 rcvId2 Identifier of the receiver the baseline is pointing from.
bool isFixed Is true, if the ambiguities of the phase
measurements are fixed for this baseline.
uint8 gnssIdJointRefSat GNSS identifier of the joint reference satellite for the single and double differenced
measurements.
uint8 svIdJointRefSat Identifier of the reference satellite.
uint8 svIdGloRefSat Identifier of the GLONASS reference satellite.
uint8 svIdUnlSat Identifier of the GLONASS ultra narrowlane
satellite.
3*double aprioriBl m A priori baseline.
3*double stdDevAprioriBl m Standard deviation of the a priori baseline.
double aprioriLen m A priori baseline length.
double stdDevAprioriLen m Standard deviation of the a priori baseline length.
uint8 numFilter Number of filters.
Loop uint8 nameLen Bytes Length of the filtername.
char[nameLen] name Filtername.
uint32 params Bitfield of parameters (states, residuals), which are transmitted by the filter.
bool isActive Is true, if the filter is active.
Conditioned
on Bit 0, i.e. if Bit 0 is not set, this shall not be considered (no pointer increment, just leave out!).
6*double absPos deg and m Absolute position in latitude, longitude (both in deg) and height (in m) (first 3 doubles) and its standard deviation (latter 3 doubles).
Bit 1 2*double clkErr s Receiver clock error (first double) and its standard deviation (latter double).
Bit 2 uint8 rcvId1 Identifier of the receiver the baseline is pointing to.
uint8 rcvId2 Identifier of the receiver the baseline is pointing from.
6*double baseline m Baseline in NED frame (first 3 doubles) and
its standard deviation (latter 3 doubles).
Bit 3 6*double vel m/s Velocity in NED frame (first 3 doubles) and its standard deviation (latter 3 doubles).
Bit 4 6*double acc m/s² Acceleration in body frame (first 3 doubles) and its standard deviation (latter 3 doubles).
Bit 5 6*double accBias m/s² Accelerometer bias in body frame (first 3 doubles) and its standard deviation (latter 3 doubles).
Bit 6 6*double eulerAng deg Euler angles in heading, pitch and roll (first 3 doubles) and its standard deviation (latter 3 doubles).
Bit 7 6*double angRate deg/s Angular rate in heading, pitch and roll (first 3 doubles) and its standard deviation (latter 3 doubles).
Bit 8 6*double gyroBias deg/s Gyroscope bias (first 3 doubles) and its standard deviation (latter 3 doubles).
Bit 9 2*double tropoZenDel m Tropospheric zenith delay (first double) and its standard deviation (latter double). Currently not in use (Bit 9 is always 0).
Bit 10 2*double Accuracy m Accuracy of the baseline (first double) and its standard deviation (latter double). Currently not in use (Bit 10 is always 0).
Bit 11-17 7*double Reserved
uint8 numPhase Number of phase measurements.
Loop uint8 gnssId Identifier of the GNSS.
uint8 svId Identifier of the satellite.
uint8 freq Frequency band (currently that is 1 (L1)).
Bit 18 2*double ambiguities cycles Double difference ambiguities and std. dev.
Bit 19 2*double phaseMp m Phase multipath and std. dev.
Bit 20
2*double phaseRes m Phase residuals and std. dev.
uint8 numCode Number of code measurements.
Loop uint8 gnssId Identifier of the GNSS.
uint8 svId Identifier of the satellite.
uint8 freq Frequency band (currently that is 1 (L1)).
Bit 21
2*double codeMp m First double is code multipath, second its standard deviation.
Bit 22
2*double codeRes m First double is code residual, second its standard deviation.
uint8 numDoppler Number of Doppler measurements.
Loop uint8 gnssId Identifier of the GNSS.
uint8 svId Identifier of the satellite.
uint8 freq Frequency band (currently that is 1 (L1)).
Bit 23 2*double doRes Hz First double is Doppler residual, second is its standard deviation.

The payload contains loops and conditions. The number of loop iterations and the conditions depends on other payload data. For example, the number of satellites determines, how often the following color-coded data is repeated. For numSats = 2 and p being a pointer to numSats, the following data is given as

Address Type Name
p+1 uint8 gnssId1
p+2 uint8 svId1
p+3 double elev1
p+11 double azim1
p+19 uint8 gnssId2
p+20 uint8 svId2
p+21 double elev2
p+29 double azim2
p+37 uint8 numRcv

For numSats = 0, no satellite position data is transmitted and the next variable would be numRcv. If a condition is fulfilled the following color-coded data is transmitted. For example, if isActive is true, then at least the variables numPhase, numCode and numDoppler are transmitted. If isActive is false, then the end of the UBX message is reached. The bitfield params is also a condition, whose bits determine, whether the following data is transmitted.
Example: Let p being a pointer to isActive with isActive = true, Bit 0 of params is false and Bit 1 is true. Then, p+1 points to the receiver clock error clkErr and not to the absolute position absPos since Bit 0 is false.

The resCode bitfield is defined as

Bit Definition
0 Is set for GNSS update-epochs processed in the PAD-Software
1 Is set for IMU update-epochs processed in the PAD-Software
2 Is set for Barometer update-epochs processed in the PAD-Software
3 Is set for Odometrie update-epochs processed in the PAD-Software
4 Is set for Camera update-epochs processed in the PAD-Software
5 Is set for Steering update-epochs processed in the PAD-Software
6 Is set if the IMU is initialized/calibrated
7 Is set if the Attitude-baseline is fixed
8 Is set if the RTK-baseline is fixed
9 to 10 State-definition for the Attitude Kalman-Filter:
00 -> No solution
01 -> Least-Squares solution
10 -> Float solution
11 -> Fixed solution
11 to 12 State-definition for the RTK-Position Kalman-Filter:
00 -> No solution
01 -> Least-Squares solution
10 -> Float solution
11 -> Fixed solution
13 Is set if the RTK-Position Kalman-Filter has only a float-solution
accuracy but enough satellites in view to try a RTK-refix (the vehicle
must be stationary for this try!)
14 Reserved
15 Reserved