In today’s digitized landscape, understanding how to parse data efficiently is crucial for many applications. Among the myriad data formats, the OPVT and OPVT2AHR stand out as unique entities, often necessitating specialized treatment for accurate interpretation. This article sheds light on these particular formats, providing an illustrative example of how to handle and decode the intricate structures embedded within them. Whether you’re a seasoned data analyst or a curious beginner, this introduction aims to pave the way for a deeper exploration into the nuances of OPVT and OPVT2AHR data parsing.

All commands and messages start with the header AA 55. Therefore, the customer can distinguish between them by looking for this header. Below is a screenshot of the data received from the device after the INS OPVT command was sent:

1 – Response to the INS OPVT Command
2 – The end of the Initial Alignment Block – see Table 6.86 of the INS ICD
3 – The end of the first INS OPVT Packet – see Section 6.2.1 of the INS ICD
4 – The end of the second INS OPVT Packet
5 – The end of the third INS OPVT Packet
Example of Parsing of the third INS OPVT Packet
Message:
AA 55 01 52 62 00
9F 8C 12 00 1D 00 03 00 00 00 FF FF F8 FF 06 00
CC 07 EB F4 CD FA BA EF 00 00 78 09 02 01 BC AB
55 17 44 40 BC D1 2B 3A 00 00 FF FF FF FF 00 00
00 00 00 00 00 00 BC AB 55 17 44 40 BC D1 2B 3A
00 00 02 00 00 00 5E 73 00 00 00 00 A7 48 B1 18
01 0C 20 00 00 4A C3 12 3A 00 00 00 52 1D
AA 55 – Header
01 – Message type(uint8)
52 – Message identifier (uint8) (code of the INS OPVT output format)
62 00 – Message length(uint16). 62 00 Hex little endian -> 00 62 – Hex little endian converted to Hex big endian -> 98 – Hex big endian converted to decimal -> total 98 bytes in the packet (does not include AA 55)
9F 8C – Heading (uint16). 9F 8C – Hex little endian -> 8C 9F – Hex little endian converted to Hex big endian -> 35999 – Hex big endian converted to decimal -> 35999/100 apply scale factor (see table 6.5) -> 359.99 deg
This approach of parsing data applies to the rest of the message.
12 00 – Pitch(int16). 12 00 -> 00 12 -> 18/100=0.18 deg
1D 00 – Roll(int16). 1D 00 -> 00 1D ->29/100=0.29deg
GyroX/Y/Z parameters apply scale factor KG, and for AccX/Y/Z parameters apply scale factor KA. Send the following command to read KG and KA scale factors from the INS:
AA 55 00 00 08 00 B1 7A 33 01
Answer to the command and parsing:
AA 55 01 B1 0D 00 7A 06 32 00 05 D0 07 4D 02
AA 55 – Header ()
01 – Message type(uint8)
B1 – Message identifier (uint8)
0D – Message length(uint8)
7A – Parameter code (uint8)
06 – IMU Gyro range(uint8). 450 deg/sec (See table 6.97 of the INS ICD)
32 00 – Scale factor for gyro data (uint8) . 32 00-> 00 32 -> 50
05 – IMU accelerometer range (uint8). 15 g (See table 6.97 of the INS ICD)
D0 07 – Scale factor for accelerometer data(uint16). D0 07->07 D0-> 2000
4D 02 – Checksum(uint16) – the sum of all bytes except AA 55.
03 00 – GyroX(int16). 03 00 -> 00 03 -> 3/50= 0.06 deg/s
00 00 – GyroY(int16). 00 00 -> 00 00 -> 0 deg/s
FF FF – GyroZ(int16). FF FF -> FF FF -> -1/50= -0.02 deg/s
F8 FF – AccX(int16). FF F8 -> FF F8 -> -8/2000=-0.004 g
06 00 – AccY(int16). 06 00 -> 00 06 -> 6/2000= 0.003 g
CC 07 – AccZ(int16). CC 07 -> 07 CC ->1996/2000 = 0.998 g
EB F4 – MagX(int16). EB F4-> F4 EB -> -2837*10= -28370 nT
CD FA – MagY(int16). CD FA -> FA CD-> -1331*10= -13310 nT
BA EF – MagZ(int16). BA EF -> EF BA -> -4166*10= -41660 nT
00 00 – USW(uint16). See section 6.10 of the INS ICD for details. Note the non-zero value of the USW indicates the warning or the issue with the device.
78 09 – Vinp(uint16). 78 09 -> 09 78-> 2424/100 =24.24 VDC
02 01 – Temper(int16). 02 01 -> 01 02 -> 259/10= 25.8 °C
BC AB 55 17 – Latitude(int32). BC AB 55 17 -> 17 55 AB BC -> 391494827/1.0e7= 39.1494827 deg
44 40 BC D1 – Longitude(int32). 44 40 BC D1 -> D1 BC 40 44 -> -776191932/1.0e7=-77.6191932 deg
2B 3A 00 00 – Altitude(int32). 2B 3A 00 00 -> 00 00 3A 2B -> 14891/100= 148.91 m
FF FF FF FF – East Speed(int32). FF FF FF FF->FF FF FF FF-> -1/100 = -0.01 m/s
00 00 00 00 – North Speed(int32). 00 00 00 00 -> 0m/s
00 00 00 00 – Vertical Speed(int32). 00 00 00 00 -> 0m/s
BC AB 55 17 – Latitude GNSS(int32). -> 17 55 AB BC-> 391494827/1.0e7= 39.1494827 deg
44 40 BC D1 – Longitude GNSS(int32). -> D1 BC 40 44 -> -776191932/1.0e7=-77.6191932 deg
2B 3A 00 00 – Altitude GNSS (int32). -> 00 00 3A 2B -> 14891/100= 148.91 m
02 00 00 00 – Horizontal speed GNSS(int32). 02 00 00 00-> 00 00 00 02 -> 2/100= 0.02 m/s
5E 73 – Track over ground GNSS(uint16). 5E 73 -> 73 5E-> 29534/100= 295.34 deg
00 00 00 00 – Vertical speed GNSS(int32). 00 00 00 00 -> 0m/s
A7 48 B1 18 – ms_gps(uint32). A7 48 B1 18 -> 18 B1 48 A7-> 414271655 ms
01 – GNSS_info1(uint8). 01 -> 1
0C – GNSS_info2(uint8). oC -> 12
20 – #solnSVs(uint8). 20 -> 32
00 – Latency ms_pos(uint8). 0 -> 0 ms
00 – Latency ms_vel()(uint8). 0 -> 0 ms
4A C3 – P_bar(uint16). 4A C3 -> C3 4A -> 49994*2= 99988 Pa
12 3A 00 00 – H_bar(int32). 12 3A 00 00 -> 00 00 3A 12 -> 14866/100= 148.66 m
00 – New GPS(uint8). 0 -> 0
52 1D – Checksum(uint16) – the sum of all bytes except AA 55.
Below is a screenshot of the data received from the device after the INS OPVT2AHR command was sent:

1 – Response to the INS OPVT2AHR Command
2 – The end of the Initial Alignment Block – see Table 6.86 of the INS ICD
3 – The end of the first INS OPVT2AHR Packet – see Section 6.2.5 of the INS ICD
4 – The end of the second INS OPVT2AHR Packet
5 – The end of the third INS OPVT2AHR Packet
Example of Parsing of the second INS OPVT Packet
Message:
AA 55 01 58 87 00 00 00 11 00 1F 00 E0 1A 00 00
11 01 00 00 12 FE FF FF 4D ED FF FF 41 0D 00 00
63 3B 0F 00 D8 F6 EB F8 CF EE 00 00 78 09 0E 01
4F 2B 77 1D 09 00 00 00 99 21 89 ED ED FF FF FF
C4 4A 02 00 00 00 00 00 FF FF FF FF 00 00 00 00
4F 2B 77 1D 09 00 00 00 99 21 89 ED ED FF FF FF
C4 4A 02 00 01 00 00 00 7D 49 00 00 00 00 E4 EF
BE 17 01 0C 1E 00 00 64 00 00 00 00 B0 FF B0 FF
FF C3 A5 3A 00 00 00 D6 2D
AA 55 – Header
01 – message type(uint8)
58 – message identifier(uint8) (code of the INS OPVT2AHR output format)
87 00 – message length(uint16). 87 00 – Hex little endian -> 00 87 – Hex little endian converted to Hex big endian -> 135 – Hex big endian converted to decimal -> total 135 bytes in the packet (does not include AA 55)
00 00 – Heading(uint16). 0 deg
11 00 – Pitch(int16). 11 00 – Hex little endian -> 00 11 – Hex little endian converted to Hex big endian ->17 – Hex big endian converted to decimal -> 17/100 – apply scale factor (see table 6.13)=0.17 deg
This approach of parsing data applies to the rest of the message.
1F 00 – Roll(int16). 1F 00 -> 00 1F-> 31/100=0.31 deg
E0 1A 00 00 – GyroX(int32).E0 1A 00 00 -> 00 00 1A E0 -> 6880/1.0e5= 0.0688 dps
11 01 00 00 – GyroY(int32). 11 01 00 00 -> 00 00 01 11 -> 273/1.0e5= 0.00273 dps
12 FE FF FF – GyroZ(int32). 12 FE FF FF -> FF FF FE 12 -> -494/1.0e5= -0.00494 dps
4D ED FF FF – Acc X(int32). 4D ED FF FF -> FF FF ED 4D -> -4787/1.0e6=-0.004787 g
41 0D 00 00 – Acc Y(int32). 41 0D 00 00 -> 00 00 0D 41-> 3393/1.0e6=0.003393 g
63 3B 0F 00 – Acc Z(int32). 63 3B 0F 00 -> 00 0F 3B 63-> 998227/1.0e6= 0.998227 g
D8 F6 – MagX(int16). D8 F6 -> F6 D8 -> -2344*10=-23440 nT
EB F8 – MagY(int16). EB F8 -> F8 EB -> -1813*10=-18130 nT
CF EE – MagZ(int16). CF EE -> EE CF -> -4401*10=-44010 nT
00 00 – USW(uint16). See section 6.10 of the INS ICD for detailes. Note the non-zero value of the USW indicates the warning or the issue with the device.
78 09 – Vinp(). 78 09 -> 09 78 -> 2424/100 =24.24 VDC
0E 01 – Temper(). 0E 01 -> 01 0E -> 270/10 = 27 °C
4F 2B 77 1D 09 00 00 00 – Latitude(int64). 4F 2B 77 1D 09 00 00 00 -> 00 00 00 09 1D 77 2B 4F =39149054799/1.0e9= 39.149054799deg
99 21 89 ED ED FF FF FF – Longitude(int64). 99 21 89 ED ED FF FF FF -> FF FF FF ED ED 89 21 99 = -77619191399/1.0e9= -77.619191399 deg
C4 4A 02 00 – Altitude(int32). C4 4A 02 00 -> 00 02 4A C4 – 150212/1000= 150.212 m
00 00 00 00 – East speed(int32). 0 m/s
FF FF FF FF – North speed(int32). FF FF FF FF -> FF FF FF FF -> -1/100 = -0.01 m/s
00 00 00 00 – Vertical speed(int32). 0 m/s
4F 2B 77 1D 09 00 00 00 – LatitudeGNSS(int64). 4F 2B 77 1D 09 00 00 00 -> 00 00 00 09 1D 77 2B 4F =39149054799/1.0e9= 39.149054799 deg
99 21 89 ED ED FF FF FF – LongitudeGNSS(int64). 99 21 89 ED ED FF FF FF -> FF FF FF ED ED 89 21 99 = -77619191399/1.0e9= -77.619191399 deg
C4 4A 02 00 – AltitudeGNSS(int32).C4 4A 02 00 -> 00 02 4A C4 – 150212/1000= 15.0212 m
01 00 00 00 – Horizontal speed GNSS(int32). 01 00 00 00 -> 00 00 00 01 -> 1/100= 0.01 m/s
7D 49 – Track over ground GNSS(uint32). 7D 49 -> 49 7D -> 18813/100= 188.13 deg
00 00 00 00 – Vertical speed GNSS(int32). 0 m/s
E4 EF BE 17 – ms_gps(uint32). E4 EF BE 17 -> 17 BE EF E4 -> 398389220 ms
01 – GNSS_info1(uint8). 01 -> 1
0C – GNSS_info2(uint8). 0C -> 12
1E – soInSVs(uint8). 1E -> 30
00 00 – V_latency(uint16). 0 s
64 – Angles position type(uint8). 64 -> 100
00 00 – Heading GNSS(uint16). 0 deg
00 00 – Latency ms_head(int16). 0 ms
B0 FF – Latency ms_pos(int16). B0 FF -> FF B0 -> -80 ms
B0 FF – Latency ms_vel(int16). B0 FF -> FF B0 -> -80 ms
FF C3 – P_bar(uint16). FF C3 -> C3 FF -> 50175*2= 100350 Pa
A5 3A 00 00 – H_bar(int32). A5 3A 00 00 -> 00 00 3A A5 -> 15013/100=150.13 m
00 – New GPS(uint8). 0
D6 2D – Checksum(uint16)