Recently I have added a telemetry parser to the S-NET decoder in gr-satellites. Recall that I have talked about S-NET and its decoder in a previous post. To implement this telemetry parser I have used the information in Mike Rupprecht DK3WN's web, some additional information shared by the S-NET team, as well as some recordings done by Mike. Many thanks to Mike and the S-NET team for all their help. Here I describe a few details about the telemetry.
The structure of the telemetry frames can be seen in the following image, taken from Mike's web.
The telemetry frame is sent as the PDU in an LTU frame. The frame starts with an 18 bit syncword and a CRC-14. These don't make much sense when the telemetry frame is sent inside a single LTU frame, since the start of the frame is already clear and the PDU of an LTU frame is protected by a CRC-13. My guess is that the syncword and CRC-14 are there in case the telemetry frame is fragmented and sent inside several LTU frames (or perhaps when it is sent over another different link layer). Or maybe for aggregation, where several telemetry frames are sent inside the same LTU frame PDU. So far, I haven't seen any of these things being used.
The Frame Content ID fields identify the type of frame. The S-NET team has only shared the details for EPS telemetry frames (FCID Major 9, FCID Sub 0) and ADCS telemetry frames (FCID Major 0, FCID Sub 0).
After this, there are 6 bits of flags. The multiframe flag hints at the possibility of performing fragmentation or aggregation. The optional timestamp is given as a little-endian 32bit integer, in units of 0.5s since 2000-01-01 00:00:00UTC (a rather weird timestamp format). The "Is Time Tagged" flag indicates whether the optional timestamp is included (not all packets use it). I don't know the purpose of the "Time Tagged Setting" flag.
The data length field contains the length in bytes of the user data. Again, this field doesn't make a lot of sense when the telemetry frame is sent inside a single LTU frame, as there is already a length field in the LTU header.
The S-NET team has shared the format for the ADCS and EPS beacons. This can be seen in the S-NET telemetry pyconstruct definitions.
An ADCS frame looks like this. It is interesting that the current position of the satellite is included with the ADCS telemetry. The name of the fields includes SGP4, so this probably indicates that the position is calculated using TLEs rather than being obtained with GPS as other small satellites do.
Container: header = Container: CRC = 14448 FCIDMajor = 0 FCIDSub = 0 Urgent = False FutureUse = False CheckCRC = True Multiframe = False TimeTaggedSetting = True TimeTagged = True DataLength = 57 TimeTag = 2018-03-06 22:34:22 telemetry = Container: iModeChkListThisStepActive = 1 iAttDetFinalState = 3 iSensorArrayAvailStatusGA = 15 iSensorArrayAvailStatusMFSA = 3 iSensorArrayAvailStatusSUSEA = 0 iActArrayAvailStatusRWA = 0 iActArrayAvailStatusMATA = 0 AttDetMfsDistCorrMode = 4 AttDetSuseDistCorrMode = 4 flags = Container: AttDetTrackIGRFDeltaB = False AttDetSuseAlbedoTracking = False SUSE1AlbedoFlag = True SUSE2AlbedoFlag = True SUSE3AlbedoFlag = False SUSE4AlbedoFlag = False SUSE5AlbedoFlag = False SUSE6AlbedoFlag = False AttDetAutoVirtualizeMFSA = True AttDetAutoVirtualizeSUSEA = False AttDetNarrowVectors = False AttDetMismatchingVectors = False omegaXOptimal_SAT = -0.161538461538 omegaYOptimal_SAT = -0.211538461538 omegaZOptimal_SAT = 0.265384615385 magXOptimal_SAT = -16570.0 magYOptimal_SAT = -20980.0 magZOptimal_SAT = 20230.0 sunXOptimal_SAT = -0.30425 sunYOptimal_SAT = -0.40390625 sunZOptimal_SAT = 0.86271875 dCtrlTorqueRWAx_SAT_lr = 0.0 dCtrlTorqueRWAy_SAT_lr = 0.0 dCtrlTorqueRWAz_SAT_lr = 0.0 dCtrlMagMomentMATAx_SAT_lr = 0.244094488189 dCtrlMagMomentMATAy_SAT_lr = 0.133858267717 dCtrlMagMomentMATAz_SAT_lr = 1.97637795276 iReadTorqueRWx_MFR = 0.0 iReadTorqueRWy_MFR = 0.0 iReadTorqueRWz_MFR = 0.0 iReadRotSpeedRWx_MFR = 0 iReadRotSpeedRWy_MFR = 0 iReadRotSpeedRWz_MFR = 0 SGP4LatXPEF = 42.4338028169 SGP4LongYPEF = 19.4802259887 SGP4AltPEF = 568.0 AttitudeErrorAngle = 0.0 TargetData_Distance = 64000 TargetData_ControlIsActive = 0
I haven't seen an EPS frame yet, which I still need to test my EPS frame parser. Most of the frames transmitted by S-NET are not ADCS or EPS frames. For instance, the FCID Major 48, FCID Sub 1 message type is seen a lot. Unfortunately, we don't have the information for the format of these messages. You can see the full decode of one of the recordings in this gist.