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)

