aux
This commit is contained in:
@@ -21,9 +21,9 @@ var parseCmd = &cobra.Command{
|
|||||||
Satellite: "SJY01",
|
Satellite: "SJY01",
|
||||||
}
|
}
|
||||||
p := extract.NewExtractor(¶ms)
|
p := extract.NewExtractor(¶ms)
|
||||||
p.ParseAuxPlatformWithHead("demo/ref/辅助数据.dat")
|
// p.ParseAuxPlatformWithHead("demo/ref/辅助数据.dat")
|
||||||
fmt.Println("Reference Time: 2000-01-01 12:00:00 UTC, seconds:", extract.Time2000UTCSec())
|
fmt.Println("Reference Time: 2000-01-01 12:00:00 UTC, seconds:", extract.Time2000UTCSec())
|
||||||
// p.SeprateAuxAndImgData("demo/temp/051513_S46.dat", 1)
|
p.ParseAuxPlatform("demo/output/SJY01_051622_S96_PLAT.AUX")
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -127,17 +127,15 @@ func (e *Extractor) SeprateAuxAndImgData(dataFile string, segmentIndex int) erro
|
|||||||
|
|
||||||
var afh AuxFrameHead
|
var afh AuxFrameHead
|
||||||
dataLen := len(data)
|
dataLen := len(data)
|
||||||
log.Info("original data length:", dataLen)
|
log.Info("length of original data: ", dataLen)
|
||||||
data = e.trimImgRawData(data)
|
data = e.trimImgRawData(data)
|
||||||
dataLen = len(data)
|
dataLen = len(data)
|
||||||
log.Info("trimmed data length:", dataLen)
|
log.Info("length of trimmed data: ", dataLen)
|
||||||
|
|
||||||
e.quanlityAnalysis(data)
|
e.quanlityAnalysis(data)
|
||||||
|
|
||||||
msdata := make([][]byte, 4)
|
msdata := make([][]byte, 4)
|
||||||
var firstLineFound bool
|
|
||||||
var totalLines int
|
|
||||||
var pancount int
|
|
||||||
for i := 0; i < dataLen; {
|
for i := 0; i < dataLen; {
|
||||||
if i+4 > dataLen {
|
if i+4 > dataLen {
|
||||||
logrus.Println("end of data, dataLen:", dataLen, "i:", i)
|
logrus.Println("end of data, dataLen:", dataLen, "i:", i)
|
||||||
@@ -149,7 +147,6 @@ func (e *Extractor) SeprateAuxAndImgData(dataFile string, segmentIndex int) erro
|
|||||||
log.Debug("find package head: 0xD15BD15B")
|
log.Debug("find package head: 0xD15BD15B")
|
||||||
} else {
|
} else {
|
||||||
i++
|
i++
|
||||||
// log.Println("not find package head: 0xD15BD15B, skip 1 byte")
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,7 +156,6 @@ func (e *Extractor) SeprateAuxAndImgData(dataFile string, segmentIndex int) erro
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
afh.Decode(data[i : i+24])
|
afh.Decode(data[i : i+24])
|
||||||
// pp.Println(afh)
|
|
||||||
|
|
||||||
if !afh.IsValidFrmHead {
|
if !afh.IsValidFrmHead {
|
||||||
log.Info("invalid frame head of original raw data")
|
log.Info("invalid frame head of original raw data")
|
||||||
@@ -179,21 +175,6 @@ func (e *Extractor) SeprateAuxAndImgData(dataFile string, segmentIndex int) erro
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
// 通过中心辅助时间判断是否第一行数据
|
|
||||||
if !firstLineFound {
|
|
||||||
utcTime := binary.BigEndian.Uint32(data[i+32 : i+36])
|
|
||||||
t := time.Unix(int64(afh.TimeSec+uint32(ReferenceTime2000)), int64(afh.TimeSecFrac)*1000)
|
|
||||||
tAux := time.Unix(int64(utcTime+uint32(ReferenceTime2000)), 0)
|
|
||||||
firstLineFound = tAux.Year() == t.Year() && tAux.Month() == t.Month() && tAux.Day() == t.Day() &&
|
|
||||||
tAux.Hour() == t.Hour() && tAux.Minute() == t.Minute()
|
|
||||||
if !firstLineFound {
|
|
||||||
log.Info("did not find first line of aux data, skip this frame: ", afh.SerialNo)
|
|
||||||
i += afh.RowLength
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
totalLines += 1
|
|
||||||
|
|
||||||
// 存储辅助数据到临时文件
|
// 存储辅助数据到临时文件
|
||||||
dataIndex := i + 24
|
dataIndex := i + 24
|
||||||
lw.ws[EB_AUX].w.Write(data[dataIndex : dataIndex+8]) // 8字节焦面电箱辅助数据
|
lw.ws[EB_AUX].w.Write(data[dataIndex : dataIndex+8]) // 8字节焦面电箱辅助数据
|
||||||
@@ -207,7 +188,6 @@ func (e *Extractor) SeprateAuxAndImgData(dataFile string, segmentIndex int) erro
|
|||||||
write16bPixelLittleEndian(lw.ws[PAN_RAW].w, data[dataIndex:dataIndex+19040])
|
write16bPixelLittleEndian(lw.ws[PAN_RAW].w, data[dataIndex:dataIndex+19040])
|
||||||
dataIndex += 19040
|
dataIndex += 19040
|
||||||
panEnviHdr.Lines += 1
|
panEnviHdr.Lines += 1
|
||||||
pancount += 19040
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if afh.B1 {
|
if afh.B1 {
|
||||||
@@ -252,7 +232,7 @@ func (e *Extractor) SeprateAuxAndImgData(dataFile string, segmentIndex int) erro
|
|||||||
|
|
||||||
mssEnviHdr.Lines = mssEnviHdr.Lines / 4 // 多光谱波段分别在 4 行中传输
|
mssEnviHdr.Lines = mssEnviHdr.Lines / 4 // 多光谱波段分别在 4 行中传输
|
||||||
mssEnviHdr.Samples = 2384
|
mssEnviHdr.Samples = 2384
|
||||||
mssEnviHdr.Bands = 1
|
mssEnviHdr.Bands = bands
|
||||||
lw.ws[MSS_HDR].w.Write([]byte(mssEnviHdr.String()))
|
lw.ws[MSS_HDR].w.Write([]byte(mssEnviHdr.String()))
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -271,7 +251,7 @@ func (e *Extractor) quanlityAnalysis(data []byte) {
|
|||||||
afh.Decode(data[i : i+24])
|
afh.Decode(data[i : i+24])
|
||||||
|
|
||||||
if !afh.IsValidFrmHead {
|
if !afh.IsValidFrmHead {
|
||||||
log.Error("invalid frame head of original raw data", i, len(data), afh.SerialNo, afh.FileNo)
|
log.Errorf("invalid frame head of original raw data i: %v, len: %v", i, len(data))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -338,9 +318,6 @@ func (e *Extractor) trimImgRawData(data []byte) []byte {
|
|||||||
nLen := (len(data) - i - 1)
|
nLen := (len(data) - i - 1)
|
||||||
nLen = nLen - nLen%(afh.RowLength*16)
|
nLen = nLen - nLen%(afh.RowLength*16)
|
||||||
end = i + nLen
|
end = i + nLen
|
||||||
fmt.Println("start:", start, "end:", end, "i:", i, "len(data):", len(data),
|
|
||||||
len(data)%(afh.RowLength*16), afh.RowLength,
|
|
||||||
)
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/k0kubun/pp/v3"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
@@ -35,7 +36,7 @@ type AuxPlatform struct {
|
|||||||
DotEular2 float64 // [63-64]
|
DotEular2 float64 // [63-64]
|
||||||
DotEular3 float64 // [65-66]
|
DotEular3 float64 // [65-66]
|
||||||
ModTime uint32 // [67-70]模式运行时间 秒
|
ModTime uint32 // [67-70]模式运行时间 秒
|
||||||
DTime int16 // [71-72]姿控调用周期,量纲:1/1000 单位:秒
|
DTime float64 // [71-72]姿控调用周期,量纲:1/1000 单位:秒
|
||||||
AutoState [3]uint8 // [73-75]姿轨控部件使用标志
|
AutoState [3]uint8 // [73-75]姿轨控部件使用标志
|
||||||
ProTrack [16]uint8 // [76-91]姿轨控算法执行标记
|
ProTrack [16]uint8 // [76-91]姿轨控算法执行标记
|
||||||
QeQ1 float64 // [92-95]偏差四元数 double 量纲:1/0x40000000 /bit
|
QeQ1 float64 // [92-95]偏差四元数 double 量纲:1/0x40000000 /bit
|
||||||
@@ -81,9 +82,7 @@ type AuxPlatform struct {
|
|||||||
DataTransLong float64 // [210-211]数传点经度 量纲:1/1000
|
DataTransLong float64 // [210-211]数传点经度 量纲:1/1000
|
||||||
DataTransLat float64 // [212-213]数传点纬度 量纲:1/1000
|
DataTransLat float64 // [212-213]数传点纬度 量纲:1/1000
|
||||||
DataTransH float64 // [214-215]数传点地程高 量纲:1
|
DataTransH float64 // [214-215]数传点地程高 量纲:1
|
||||||
StarPrio1 byte // [216] 星敏1定姿方式标志1 0x00:星敏1定姿;0xA0:星敏1滤波;0x01星敏2定姿;0xA1:星敏2滤波;0xff:未使用星敏定姿
|
StarPrio [3]byte // [216-218] 星敏1定姿方式标志1 0x00:星敏1定姿;0xA0:星敏1滤波;0x01星敏2定姿;0xA1:星敏2滤波;0xff:未使用星敏定姿
|
||||||
StarPrio2 byte // [217]
|
|
||||||
StarPrio3 byte // [218]
|
|
||||||
WheelspeedcalX float64 // [219-222]X飞轮期望转速 量纲:1/10000 单位:rpm
|
WheelspeedcalX float64 // [219-222]X飞轮期望转速 量纲:1/10000 单位:rpm
|
||||||
WheelspeedcalY float64 // [223-226]
|
WheelspeedcalY float64 // [223-226]
|
||||||
WheelspeedcalZ float64 // [227-230]
|
WheelspeedcalZ float64 // [227-230]
|
||||||
@@ -105,7 +104,12 @@ type AuxPlatform struct {
|
|||||||
J2000Vel_X float64 // [348-351]计算当前J2000速度X 单位:0.01米/秒
|
J2000Vel_X float64 // [348-351]计算当前J2000速度X 单位:0.01米/秒
|
||||||
J2000Vel_Y float64 // [352-355]
|
J2000Vel_Y float64 // [352-355]
|
||||||
J2000Vel_Z float64 // [356-359]
|
J2000Vel_Z float64 // [356-359]
|
||||||
// 字节[360-377] 三轴光纤陀螺参数
|
FOGyroXAV float64 // [360-362]三轴光纤陀螺X轴角速度 陀螺速度共3字节单位°/s量纲:1/72359
|
||||||
|
FOGyroYAV float64 // [363-365]
|
||||||
|
FOGyroZAV float64 // [366-368]
|
||||||
|
FOGyroXAV1 float64 // [369-371]
|
||||||
|
FOGyroYAV1 float64 // [372-374]
|
||||||
|
FOGyroZAV1 float64 // [375-377]
|
||||||
SS1_UTCTime uint32 // [378-381] 星敏1 UTC时间
|
SS1_UTCTime uint32 // [378-381] 星敏1 UTC时间
|
||||||
SS1_UTCTimeFrac float32 // [382-384] 星敏1 UTC秒小数 单位为40.96 us,高字节在前
|
SS1_UTCTimeFrac float32 // [382-384] 星敏1 UTC秒小数 单位为40.96 us,高字节在前
|
||||||
SS1_Q1 float64 // [385-388] 星敏1四元数q1 当量:1/2147483647 (星敏坐标系相对于J2000惯性坐标系)
|
SS1_Q1 float64 // [385-388] 星敏1四元数q1 当量:1/2147483647 (星敏坐标系相对于J2000惯性坐标系)
|
||||||
@@ -113,7 +117,20 @@ type AuxPlatform struct {
|
|||||||
SS1_Q3 float64 // [393-396] 星敏1四元数q3
|
SS1_Q3 float64 // [393-396] 星敏1四元数q3
|
||||||
SS1_Q4 float64 // [397-400] 星敏1四元数q4
|
SS1_Q4 float64 // [397-400] 星敏1四元数q4
|
||||||
SS1_ExposureTime uint8 // [401] 星敏1曝光时间 无符号数,单位ms
|
SS1_ExposureTime uint8 // [401] 星敏1曝光时间 无符号数,单位ms
|
||||||
|
SS1_Threshold uint8 // [402] 星敏1阈值 无符号数
|
||||||
|
SS1_BackgroudV uint8 // [403] 星敏1背景值 无符号数
|
||||||
|
SS1_Flags byte // [404] 星敏1标志位 0x01:曝光时间有效;0x02:阈值有效;0x04:背景值有效
|
||||||
|
SS1_WorkMode uint8 // [405.(7~6)] 星敏1工作模式: 0正常工作模式;1保留;2固定阈值模式;3测试模式(保留)
|
||||||
|
SS1_ExtractStars uint8 // [405.(5~0)]
|
||||||
|
SS1_NavStars uint8 // [406.(7~5)] 星敏1导航星数
|
||||||
|
SS1_Gain uint8 // [406.(4~0)] 星敏1增益
|
||||||
|
SS1_RegonizedStars uint8 // [407.(7~2)] 星敏1识别星数
|
||||||
|
SS1_ExtenalImage bool // [407.(1)] 星敏1外部图像标志位 0x01:外部图像;0x00:关闭
|
||||||
|
SS1_AttitudeActive bool // [407.(0)] 星敏1姿态有效标志位 0x01:激活;0x00:关闭
|
||||||
SS1_ImgFrmNo uint32 // [411-413] 星敏1图像帧号
|
SS1_ImgFrmNo uint32 // [411-413] 星敏1图像帧号
|
||||||
|
SS1_XAV float64 // [417-418] 星敏1X方向角速度 单位:2-11 °/s
|
||||||
|
SS1_YAV float64 // [419-420]
|
||||||
|
SS1_ZAV float64 // [421-422]
|
||||||
SS2_UTCTime uint32 // [424-427] 星敏2 UTC时间
|
SS2_UTCTime uint32 // [424-427] 星敏2 UTC时间
|
||||||
SS2_UTCTimeFrac float32 // [428-430] 星敏2 UTC秒小数 单位为40.96 us,高字节在前
|
SS2_UTCTimeFrac float32 // [428-430] 星敏2 UTC秒小数 单位为40.96 us,高字节在前
|
||||||
SS2_Q1 float64 // [431-434] 星敏2四元数q1 当量:1/2147483647 (星敏坐标系相对于J2000惯性坐标系)
|
SS2_Q1 float64 // [431-434] 星敏2四元数q1 当量:1/2147483647 (星敏坐标系相对于J2000惯性坐标系)
|
||||||
@@ -121,7 +138,34 @@ type AuxPlatform struct {
|
|||||||
SS2_Q3 float64 // [439-442] 星敏2四元数q3
|
SS2_Q3 float64 // [439-442] 星敏2四元数q3
|
||||||
SS2_Q4 float64 // [443-446] 星敏2四元数q4
|
SS2_Q4 float64 // [443-446] 星敏2四元数q4
|
||||||
SS2_ExposureTime uint8 // [447] 星敏2曝光时间 无符号数,单位ms
|
SS2_ExposureTime uint8 // [447] 星敏2曝光时间 无符号数,单位ms
|
||||||
|
SS2_Threshold uint8 // [448] 星敏2阈值 无符号数
|
||||||
|
SS2_BackgroudV uint8 // [449] 星敏2背景值 无符号数
|
||||||
|
SS2_Flags byte // [450] 星敏2标志位 0x01:曝光时间有效;0x02:阈值有效;0x04:背景值有效
|
||||||
|
SS2_WorkMode uint8 // [451.(7~6)] 星敏2工作模式: 0正常工作模式;1保留;2固定阈值模式;3测试模式(保留)
|
||||||
|
SS2_ExtractStars uint8 // [451.(5~0)]
|
||||||
|
SS2_NavStars uint8 // [452.(7~5)] 星敏2导航星数
|
||||||
|
SS2_Gain uint8 // [452.(4~0)] 星敏2增益
|
||||||
|
SS2_RegonizedStars uint8 // [453.(7~2)] 星敏2识别星数
|
||||||
|
SS2_ExtenalImage bool // [453.(1)] 星敏2外部图像标志位 0x01:外部图像;0x00:关闭
|
||||||
|
SS2_AttitudeActive bool // [453.(0)] 星敏2姿态有效标志位 0x01:激活;0x00:关闭
|
||||||
SS2_ImgFrmNo uint32 // [457-459] 星敏2图像帧号
|
SS2_ImgFrmNo uint32 // [457-459] 星敏2图像帧号
|
||||||
|
FlyWheel1_Vel float64 // [464-466] 飞轮1速度 单位:0.1rpm
|
||||||
|
FlyWheel1_Amps float64 // [467] 飞轮1电流 单位:0.009A
|
||||||
|
FlyWheel2_Vel float64 // [468-470] 飞轮2速度 单位:0.1rpm
|
||||||
|
FlyWheel2_Amps float64 // [471] 飞轮2电流 单位:0.009A
|
||||||
|
FlyWheel3_Vel float64 // [472-474] 飞轮3速度 单位:0.1rpm
|
||||||
|
FlyWheel3_Amps float64 // [475] 飞轮3电流 单位:0.009A
|
||||||
|
FlyWheel4_Vel float64 // [476-478] 飞轮4速度 单位:0.1rpm
|
||||||
|
FlyWheel4_Amps float64 // [479] 飞轮4电流 单位:0.009A
|
||||||
|
MemsGyroXAV float64 // [480-483] MEMS陀螺X轴角速度 0.000001°/s
|
||||||
|
MemsGyroYAV float64 // [484-487] MEMS陀螺Y轴角速度 0.000001°/s
|
||||||
|
MemsGyroZAV float64 // [488-491] MEMS陀螺Z轴角速度 0.000001°/s
|
||||||
|
MagnetictrengthX float64 // [492-495] 磁场强度X 量纲19200,单位uT
|
||||||
|
MagnetictrengthY float64 // [496-499] 磁场强度Y 量纲19200,单位uT
|
||||||
|
MagnetictrengthZ float64 // [500-503] 磁场强度Z 量纲19200,单位uT
|
||||||
|
ASSTimeInt uint32 // [504-507] 输入姿轨控数据UTC时间秒
|
||||||
|
ASSTimeDec uint32 // [508-510] 输入姿轨控数据UTC时间秒小数 单位为μs
|
||||||
|
Reserved4 byte // [511] 保留字节
|
||||||
CheckSum byte // [512] 校验和
|
CheckSum byte // [512] 校验和
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,38 +176,164 @@ func (ap *AuxPlatform) Parse(data []byte) error {
|
|||||||
|
|
||||||
// 按需解析数据
|
// 按需解析数据
|
||||||
ap.UTCTimeSec = binary.BigEndian.Uint32(data[0:4])
|
ap.UTCTimeSec = binary.BigEndian.Uint32(data[0:4])
|
||||||
|
ap.Waveway = data[4]
|
||||||
ap.Microsecond = uint32(data[5])<<16 | uint32(data[6])<<8 | uint32(data[7])
|
ap.Microsecond = uint32(data[5])<<16 | uint32(data[6])<<8 | uint32(data[7])
|
||||||
ap.DataTransLong = float64(int16(binary.BigEndian.Uint16(data[209:211]))) / 1000
|
ap.QuatAttstarQ0 = float64(bigEndianToInt32(data[8:12])) / 0x40000000
|
||||||
ap.DataTransLat = float64(int16(binary.BigEndian.Uint16(data[211:213]))) / 1000
|
ap.QuatAttstarQ1 = float64(bigEndianToInt32(data[12:16])) / 0x40000000
|
||||||
ap.DataTransH = float64(binary.BigEndian.Uint16(data[213:215]))
|
ap.QuatAttstarQ2 = float64(bigEndianToInt32(data[16:20])) / 0x40000000
|
||||||
|
ap.QuatAttstarQ3 = float64(bigEndianToInt32(data[20:24])) / 0x40000000
|
||||||
|
ap.QuatOrbitQ1 = float64(bigEndianToInt32(data[24:28])) / 0x40000000
|
||||||
|
ap.QuatOrbitQ2 = float64(bigEndianToInt32(data[28:32])) / 0x40000000
|
||||||
|
ap.QuatOrbitQ3 = float64(bigEndianToInt32(data[32:36])) / 0x40000000
|
||||||
|
ap.QuatOrbJQ1 = float64(bigEndianToInt32(data[36:40])) / 0x40000000
|
||||||
|
ap.QuatOrbJQ2 = float64(bigEndianToInt32(data[40:44])) / 0x40000000
|
||||||
|
ap.QuatOrbJQ3 = float64(bigEndianToInt32(data[44:48])) / 0x40000000
|
||||||
|
ap.Eular1 = float64(bigEndianToInt32(data[48:52])) / 1000000
|
||||||
|
ap.Eular2 = float64(bigEndianToInt32(data[52:56])) / 1000000
|
||||||
|
ap.Eular3 = float64(bigEndianToInt32(data[56:60])) / 1000000
|
||||||
|
ap.DotEular1 = float64(bigEndianToInt16(data[60:62])) / 100000
|
||||||
|
ap.DotEular2 = float64(bigEndianToInt16(data[62:64])) / 100000
|
||||||
|
ap.DotEular3 = float64(bigEndianToInt16(data[64:66])) / 100000
|
||||||
|
ap.ModTime = binary.BigEndian.Uint32(data[66:70])
|
||||||
|
ap.DTime = float64(bigEndianToInt16(data[70:72])) / 1000
|
||||||
|
ap.AutoState[0] = uint8(data[72])
|
||||||
|
ap.AutoState[1] = uint8(data[73])
|
||||||
|
ap.AutoState[2] = uint8(data[74])
|
||||||
|
for i := 0; i < 16; i++ {
|
||||||
|
ap.ProTrack[i] = uint8(data[75+i])
|
||||||
|
}
|
||||||
|
ap.QeQ1 = float64(bigEndianToInt32(data[91:95])) / 0x40000000
|
||||||
|
ap.QeQ2 = float64(bigEndianToInt32(data[95:99])) / 0x40000000
|
||||||
|
ap.QeQ3 = float64(bigEndianToInt32(data[99:103])) / 0x40000000
|
||||||
|
ap.We1 = float64(bigEndianToInt16(data[103:105])) / 0x100000
|
||||||
|
ap.We2 = float64(bigEndianToInt16(data[105:107])) / 0x100000
|
||||||
|
ap.We3 = float64(bigEndianToInt16(data[107:109])) / 0x100000
|
||||||
|
ap.WTFX = float64(bigEndianToInt16(data[109:111])) / 0x400000
|
||||||
|
ap.WTFY = float64(bigEndianToInt16(data[111:113])) / 0x400000
|
||||||
|
ap.WTFZ = float64(bigEndianToInt16(data[113:115])) / 0x400000
|
||||||
|
ap.FbdriftX = float64(bigEndianToInt16(data[115:117])) / 0x4000000
|
||||||
|
ap.FbdriftY = float64(bigEndianToInt16(data[117:119])) / 0x4000000
|
||||||
|
ap.FbdriftZ = float64(bigEndianToInt16(data[119:121])) / 0x4000000
|
||||||
|
ap.KalbY = float64(bigEndianToInt16(data[121:123])) / 0x4000000
|
||||||
|
ap.KalbZ = float64(bigEndianToInt16(data[123:125])) / 0x4000000
|
||||||
|
ap.KalbX = float64(bigEndianToInt16(data[125:127])) / 0x4000000
|
||||||
|
ap.HTDX = float64(bigEndianToInt16(data[127:129])) / 0x200000
|
||||||
|
ap.HTDY = float64(bigEndianToInt16(data[129:131])) / 0x200000
|
||||||
|
ap.HTDZ = float64(bigEndianToInt16(data[131:133])) / 0x200000
|
||||||
|
ap.CommandWheelX = float64(bigEndianToInt16(data[133:135])) / 0x40000
|
||||||
|
ap.CommandWheelY = float64(bigEndianToInt16(data[135:137])) / 0x40000
|
||||||
|
ap.CommandWheelZ = float64(bigEndianToInt16(data[137:139])) / 0x40000
|
||||||
|
ap.QuatG1 = float64(bigEndianToInt32(data[139:143])) / 0x40000000
|
||||||
|
ap.QuatG2 = float64(bigEndianToInt32(data[143:147])) / 0x40000000
|
||||||
|
ap.QuatG3 = float64(bigEndianToInt32(data[147:151])) / 0x40000000
|
||||||
|
ap.WG1 = float64(bigEndianToInt16(data[151:153])) / 0x40000
|
||||||
|
ap.WG2 = float64(bigEndianToInt16(data[153:155])) / 0x40000
|
||||||
|
ap.WG3 = float64(bigEndianToInt16(data[155:157])) / 0x40000
|
||||||
|
ap.J2000PosX = float64(bigEndianToInt32(data[157:161])) / 0x100
|
||||||
|
ap.J2000PosY = float64(bigEndianToInt32(data[161:165])) / 0x100
|
||||||
|
ap.J2000PosZ = float64(bigEndianToInt32(data[165:169])) / 0x100
|
||||||
|
ap.J2000VelX = float64(bigEndianToInt32(data[169:173])) / 0x100
|
||||||
|
ap.J2000VelY = float64(bigEndianToInt32(data[173:177])) / 0x100
|
||||||
|
ap.J2000VelZ = float64(bigEndianToInt32(data[177:181])) / 0x100
|
||||||
|
ap.W84PosX = float64(bigEndianToInt32(data[181:185])) / 0x100
|
||||||
|
ap.W84PosY = float64(bigEndianToInt32(data[185:189])) / 0x100
|
||||||
|
ap.W84PosZ = float64(bigEndianToInt32(data[189:193])) / 0x100
|
||||||
|
ap.W84VelX = float64(bigEndianToInt32(data[193:197])) / 0x100
|
||||||
|
ap.W84VelY = float64(bigEndianToInt32(data[197:201])) / 0x100
|
||||||
|
ap.W84VelZ = float64(bigEndianToInt32(data[201:205])) / 0x100
|
||||||
|
ap.AngleDraft = float64(bigEndianToInt32(data[205:209])) / 10000000
|
||||||
|
ap.DataTransLong = float64(bigEndianToInt16(data[209:211])) / 1000
|
||||||
|
ap.DataTransLat = float64(bigEndianToInt16(data[211:213])) / 1000
|
||||||
|
ap.DataTransH = float64(bigEndianToInt16(data[213:215]))
|
||||||
|
copy(ap.StarPrio[:], data[215:218])
|
||||||
|
ap.WheelspeedcalX = float64(bigEndianToInt32(data[218:222])) / 10000
|
||||||
|
ap.WheelspeedcalY = float64(bigEndianToInt32(data[222:226])) / 10000
|
||||||
|
ap.WheelspeedcalZ = float64(bigEndianToInt32(data[226:230])) / 10000
|
||||||
|
if ap.Waveway == 0x0 {
|
||||||
|
// 241.0 - 311.0 波道1参数
|
||||||
|
} else {
|
||||||
|
// 241.1 - 311.1 波道2参数
|
||||||
|
}
|
||||||
|
ap.WGS84PosX = float64(bigEndianToInt32(data[311:315])) / 100
|
||||||
|
ap.WGS84PosY = float64(bigEndianToInt32(data[315:319])) / 100
|
||||||
|
ap.WGS84PosZ = float64(bigEndianToInt32(data[319:323])) / 100
|
||||||
|
ap.WGS84VelX = float64(bigEndianToInt32(data[323:327])) / 100
|
||||||
|
ap.WGS84VelY = float64(bigEndianToInt32(data[327:331])) / 100
|
||||||
|
ap.WGS84VelZ = float64(bigEndianToInt32(data[331:335])) / 100
|
||||||
|
ap.J2000Pos_X = float64(bigEndianToInt32(data[335:339])) / 100
|
||||||
|
ap.J2000Pos_Y = float64(bigEndianToInt32(data[339:343])) / 100
|
||||||
|
ap.J2000Pos_Z = float64(bigEndianToInt32(data[343:347])) / 100
|
||||||
|
ap.J2000Vel_X = float64(bigEndianToInt32(data[347:351])) / 100
|
||||||
|
ap.J2000Vel_Y = float64(bigEndianToInt32(data[351:355])) / 100
|
||||||
|
ap.J2000Vel_Z = float64(bigEndianToInt32(data[355:359])) / 100
|
||||||
|
ap.FOGyroXAV = float64(bigEndianToInt24(data[359:362])) / 72359
|
||||||
|
ap.FOGyroYAV = float64(bigEndianToInt24(data[362:365])) / 72359
|
||||||
|
ap.FOGyroZAV = float64(bigEndianToInt24(data[365:368])) / 72359
|
||||||
|
ap.FOGyroXAV1 = float64(bigEndianToInt24(data[368:371])) / 72359
|
||||||
|
ap.FOGyroYAV1 = float64(bigEndianToInt24(data[371:374])) / 72359
|
||||||
|
ap.FOGyroZAV1 = float64(bigEndianToInt24(data[374:377])) / 72359
|
||||||
ap.SS1_UTCTime = binary.BigEndian.Uint32(data[377:381])
|
ap.SS1_UTCTime = binary.BigEndian.Uint32(data[377:381])
|
||||||
ap.SS1_UTCTimeFrac = float32(uint32(data[381])<<16|uint32(data[382])<<8|uint32(data[383])) * 40.96
|
ap.SS1_UTCTimeFrac = float32(uint32(data[381])<<16|uint32(data[382])<<8|uint32(data[383])) * 40.96
|
||||||
|
ap.SS1_Q1 = float64(bigEndianToInt32(data[384:388])) / 2147483647
|
||||||
|
ap.SS1_Q2 = float64(bigEndianToInt32(data[388:392])) / 2147483647
|
||||||
|
ap.SS1_Q3 = float64(bigEndianToInt32(data[392:396])) / 2147483647
|
||||||
|
ap.SS1_Q4 = float64(bigEndianToInt32(data[396:400])) / 2147483647
|
||||||
|
ap.SS1_ExposureTime = uint8(data[400])
|
||||||
|
ap.SS1_Threshold = uint8(data[401])
|
||||||
|
ap.SS1_BackgroudV = uint8(data[402])
|
||||||
|
ap.SS1_Flags = data[403]
|
||||||
|
ap.SS1_WorkMode = uint8(data[404] >> 6)
|
||||||
|
ap.SS1_ExtractStars = uint8(data[404] & 0x3F)
|
||||||
|
ap.SS1_NavStars = uint8(data[405] >> 5)
|
||||||
|
ap.SS1_Gain = uint8(data[405] & 0x1F)
|
||||||
|
ap.SS1_RegonizedStars = uint8(data[406] >> 2)
|
||||||
|
ap.SS1_ExtenalImage = data[406]&0x02 == 0x02
|
||||||
|
ap.SS1_AttitudeActive = data[406]&0x01 == 0x01
|
||||||
ap.SS1_ImgFrmNo = uint32(data[410])<<16 | uint32(data[411])<<8 | uint32(data[412])
|
ap.SS1_ImgFrmNo = uint32(data[410])<<16 | uint32(data[411])<<8 | uint32(data[412])
|
||||||
|
ap.SS1_XAV = float64(bigEndianToInt16(data[416:418])) * 2e-11
|
||||||
|
ap.SS1_YAV = float64(bigEndianToInt16(data[418:420])) * 2e-11
|
||||||
|
ap.SS1_ZAV = float64(bigEndianToInt16(data[420:422])) * 2e-11
|
||||||
ap.SS2_UTCTime = binary.BigEndian.Uint32(data[423:427])
|
ap.SS2_UTCTime = binary.BigEndian.Uint32(data[423:427])
|
||||||
ap.SS2_UTCTimeFrac = float32(uint32(data[427])<<16|uint32(data[428])<<8|uint32(data[429])) * 40.96
|
ap.SS2_UTCTimeFrac = float32(uint32(data[427])<<16|uint32(data[428])<<8|uint32(data[429])) * 40.96
|
||||||
ap.SS1_ImgFrmNo = uint32(data[456])<<16 | uint32(data[457])<<8 | uint32(data[458])
|
ap.SS2_Q1 = float64(bigEndianToInt32(data[430:434])) / 2147483647
|
||||||
|
ap.SS2_Q2 = float64(bigEndianToInt32(data[434:438])) / 2147483647
|
||||||
|
ap.SS2_Q3 = float64(bigEndianToInt32(data[438:442])) / 2147483647
|
||||||
|
ap.SS2_Q4 = float64(bigEndianToInt32(data[442:446])) / 2147483647
|
||||||
|
ap.SS2_ExposureTime = uint8(data[446])
|
||||||
|
ap.SS2_Threshold = uint8(data[447])
|
||||||
|
ap.SS2_BackgroudV = uint8(data[448])
|
||||||
|
ap.SS2_Flags = data[449]
|
||||||
|
ap.SS2_WorkMode = uint8(data[450] >> 6)
|
||||||
|
ap.SS2_ExtractStars = uint8(data[450] & 0x3F)
|
||||||
|
ap.SS2_NavStars = uint8(data[451] >> 5)
|
||||||
|
ap.SS2_Gain = uint8(data[451] & 0x1F)
|
||||||
|
ap.SS2_RegonizedStars = uint8(data[452] >> 2)
|
||||||
|
ap.SS2_ExtenalImage = data[452]&0x02 == 0x02
|
||||||
|
ap.SS2_AttitudeActive = data[452]&0x01 == 0x01
|
||||||
|
ap.SS2_ImgFrmNo = uint32(data[456])<<16 | uint32(data[457])<<8 | uint32(data[458])
|
||||||
|
ap.FlyWheel1_Vel = float64(bigEndianToInt16(data[463:466])) * 0.1
|
||||||
|
ap.FlyWheel1_Amps = float64(uint8(data[466])) * 0.009
|
||||||
|
ap.FlyWheel2_Vel = float64(bigEndianToInt16(data[467:470])) * 0.1
|
||||||
|
ap.FlyWheel2_Amps = float64(uint8(data[470])) * 0.009
|
||||||
|
ap.FlyWheel3_Vel = float64(bigEndianToInt16(data[471:474])) * 0.1
|
||||||
|
ap.FlyWheel3_Amps = float64(uint8(data[474])) * 0.009
|
||||||
|
ap.FlyWheel4_Vel = float64(bigEndianToInt16(data[475:478])) * 0.1
|
||||||
|
ap.FlyWheel4_Amps = float64(uint8(data[478])) * 0.009
|
||||||
|
ap.MemsGyroXAV = float64(bigEndianToInt32(data[479:483])) * 0.000001
|
||||||
|
ap.MemsGyroYAV = float64(bigEndianToInt32(data[483:487])) * 0.000001
|
||||||
|
ap.MemsGyroZAV = float64(bigEndianToInt32(data[487:491])) * 0.000001
|
||||||
|
ap.MagnetictrengthX = float64(bigEndianToInt16(data[491:495])) * 19200
|
||||||
|
ap.MagnetictrengthY = float64(bigEndianToInt16(data[495:499])) * 19200
|
||||||
|
ap.MagnetictrengthZ = float64(bigEndianToInt16(data[499:503])) * 19200
|
||||||
|
ap.ASSTimeInt = binary.BigEndian.Uint32(data[503:507])
|
||||||
|
ap.ASSTimeDec = uint32(data[507])<<16 | uint32(data[508])<<8 | uint32(data[509])
|
||||||
|
ap.CheckSum = data[511]
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ap AuxPlatform) Print() {
|
func (ap AuxPlatform) Print() {
|
||||||
fmt.Println("--- aux frm ----")
|
pp.Println(ap)
|
||||||
fmt.Printf("UTCTimeSec: %d\n", ap.UTCTimeSec)
|
|
||||||
fmt.Println(time.Unix(int64(ap.UTCTimeSec), 0).String())
|
|
||||||
fmt.Printf("Microsecond: %d\n", ap.Microsecond)
|
|
||||||
fmt.Printf("DataTransLong: %f\n", ap.DataTransLong)
|
|
||||||
fmt.Printf("DataTransLat: %f\n", ap.DataTransLat)
|
|
||||||
fmt.Printf("DataTransH: %f\n", ap.DataTransH)
|
|
||||||
fmt.Println("--- ss1 ---")
|
|
||||||
fmt.Printf("SS1_UTCTime: %d\n", ap.SS1_UTCTime)
|
|
||||||
fmt.Println(time.Unix(int64(ap.SS1_UTCTime+uint32(ReferenceTime2000)), 0).String())
|
|
||||||
fmt.Printf("SS1_UTCTimeFrac: %f\n", ap.SS1_UTCTimeFrac)
|
|
||||||
fmt.Printf("SS1_ImgFrmNo: %d\n", ap.SS1_ImgFrmNo)
|
|
||||||
fmt.Println("--- ss2 ---")
|
|
||||||
fmt.Printf("SS2_UTCTime: %d\n", ap.SS2_UTCTime)
|
|
||||||
fmt.Printf("SS2_UTCTimeFrac: %f\n", ap.SS2_UTCTimeFrac)
|
|
||||||
fmt.Printf("SS2_ImgFrmNo: %d\n", ap.SS2_ImgFrmNo)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extractor 辅助数据提取器
|
// Extractor 辅助数据提取器
|
||||||
@@ -183,6 +353,9 @@ func (e *Extractor) ParseAuxPlatform(auxfile string) ([]*AuxPlatform, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
aps = append(aps, &ap)
|
aps = append(aps, &ap)
|
||||||
|
ap.Print()
|
||||||
|
|
||||||
|
break
|
||||||
|
|
||||||
if i+AuxPlatformFrmSize > len(data) {
|
if i+AuxPlatformFrmSize > len(data) {
|
||||||
logrus.Info("rest of aux data length is not enough", len(data)-i)
|
logrus.Info("rest of aux data length is not enough", len(data)-i)
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ func (p *Extractor) ExtractOriginalImageData(aosDataFile string) ([]string, erro
|
|||||||
i++
|
i++
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println("nullFrmCnt:", nullFrmCnt)
|
log.Println("null transfer frame cnt:", nullFrmCnt)
|
||||||
|
|
||||||
for k, v := range snRange {
|
for k, v := range snRange {
|
||||||
vv := slice.Unique(v)
|
vv := slice.Unique(v)
|
||||||
|
|||||||
@@ -12,10 +12,10 @@ import (
|
|||||||
const (
|
const (
|
||||||
EB_AUX = "EB.AUX"
|
EB_AUX = "EB.AUX"
|
||||||
PLAT_AUX = "PLAT.AUX"
|
PLAT_AUX = "PLAT.AUX"
|
||||||
PAN_RAW = "PAN_RAW"
|
PAN_RAW = "PAN.RAW"
|
||||||
MSS_RAW = "MSS_RAW"
|
MSS_RAW = "MSS.RAW"
|
||||||
PAN_HDR = "PAN_HDR"
|
PAN_HDR = "PAN.HDR"
|
||||||
MSS_HDR = "MSS_HDR"
|
MSS_HDR = "MSS.HDR"
|
||||||
MSS_ALL_IN_ONE = "MSS_ALL_IN_ONE"
|
MSS_ALL_IN_ONE = "MSS_ALL_IN_ONE"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
2
go.mod
2
go.mod
@@ -8,11 +8,13 @@ require (
|
|||||||
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect
|
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect
|
||||||
golang.org/x/crypto v0.23.0 // indirect
|
golang.org/x/crypto v0.23.0 // indirect
|
||||||
golang.org/x/term v0.20.0 // indirect
|
golang.org/x/term v0.20.0 // indirect
|
||||||
|
golang.org/x/text v0.15.0 // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/duke-git/lancet/v2 v2.3.0 // indirect
|
github.com/duke-git/lancet/v2 v2.3.0 // indirect
|
||||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||||
|
github.com/k0kubun/pp/v3 v3.2.0
|
||||||
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible // indirect
|
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible // indirect
|
||||||
github.com/lestrrat-go/strftime v1.0.6 // indirect
|
github.com/lestrrat-go/strftime v1.0.6 // indirect
|
||||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||||
|
|||||||
4
go.sum
4
go.sum
@@ -7,6 +7,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
|
|||||||
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
||||||
github.com/k0kubun/pp v3.0.1+incompatible h1:3tqvf7QgUnZ5tXO6pNAZlrvHgl6DvifjDrd9g2S9Z40=
|
github.com/k0kubun/pp v3.0.1+incompatible h1:3tqvf7QgUnZ5tXO6pNAZlrvHgl6DvifjDrd9g2S9Z40=
|
||||||
github.com/k0kubun/pp v3.0.1+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg=
|
github.com/k0kubun/pp v3.0.1+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg=
|
||||||
|
github.com/k0kubun/pp/v3 v3.2.0 h1:h33hNTZ9nVFNP3u2Fsgz8JXiF5JINoZfFq4SvKJwNcs=
|
||||||
|
github.com/k0kubun/pp/v3 v3.2.0/go.mod h1:ODtJQbQcIRfAD3N+theGCV1m/CBxweERz2dapdz1EwA=
|
||||||
github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is=
|
github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is=
|
||||||
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkLibYKgg+SwmyFU9dF2hn6MdTj4=
|
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkLibYKgg+SwmyFU9dF2hn6MdTj4=
|
||||||
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible/go.mod h1:ZQnN8lSECaebrkQytbHj4xNgtg8CR7RYXnPok8e0EHA=
|
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible/go.mod h1:ZQnN8lSECaebrkQytbHj4xNgtg8CR7RYXnPok8e0EHA=
|
||||||
@@ -51,6 +53,8 @@ golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
|
|||||||
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw=
|
golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw=
|
||||||
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
|
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
|
||||||
|
golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
|
||||||
|
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
|||||||
Reference in New Issue
Block a user