From 6a22735d78dc13200a2a716d9e048ead81c4be43 Mon Sep 17 00:00:00 2001 From: nuknal Date: Wed, 15 May 2024 16:32:18 +0800 Subject: [PATCH] aux platform --- cmd/extract.go | 30 ++++ cmd/parse.go | 26 +++ cmd/root.go | 28 +++ aos.go => extract/aos.go | 9 +- aux.go => extract/aux.go | 12 +- extract/aux_ebox.go | 8 + extract/aux_platform.go | 190 +++++++++++++++++++++ envi.go => extract/envi.go | 2 +- extract/errors.go | 7 + params.go => extract/params.go | 2 +- extract/process.go | 15 ++ raw.go => extract/raw.go | 2 +- spectral_img.go => extract/spectral_img.go | 2 +- trans_frame.go => extract/trans_frame.go | 6 +- main.go | 29 ++-- process.go | 15 -- 16 files changed, 335 insertions(+), 48 deletions(-) create mode 100644 cmd/extract.go create mode 100644 cmd/parse.go create mode 100644 cmd/root.go rename aos.go => extract/aos.go (88%) rename aux.go => extract/aux.go (96%) create mode 100644 extract/aux_ebox.go create mode 100644 extract/aux_platform.go rename envi.go => extract/envi.go (98%) create mode 100644 extract/errors.go rename params.go => extract/params.go (91%) create mode 100644 extract/process.go rename raw.go => extract/raw.go (98%) rename spectral_img.go => extract/spectral_img.go (95%) rename trans_frame.go => extract/trans_frame.go (95%) delete mode 100644 process.go diff --git a/cmd/extract.go b/cmd/extract.go new file mode 100644 index 0000000..2cc6633 --- /dev/null +++ b/cmd/extract.go @@ -0,0 +1,30 @@ +package cmd + +import ( + "github.com/spf13/cobra" + "starwiz.cn/sjy01/preprocessing/extract" +) + +var extractCmd = &cobra.Command{ + Use: "extract", + Short: "Extract data from raw data files", + Long: `Extract data from raw data files`, + Run: func(cmd *cobra.Command, args []string) { + params := extract.Params{ + InputData: "demo/4545.dat", + OutputPath: "demo/output", + TempPath: "demo/temp", + DataId: "004545", + } + p := extract.NewExtractor(¶ms) + p.ExtractAosData() + dats, _ := p.ExtractOriginalImageData() + for _, d := range dats { + p.SeprateAuxAndImgData(d) + } + }, +} + +func init() { + rootCmd.AddCommand(extractCmd) +} diff --git a/cmd/parse.go b/cmd/parse.go new file mode 100644 index 0000000..702a337 --- /dev/null +++ b/cmd/parse.go @@ -0,0 +1,26 @@ +package cmd + +import ( + "github.com/spf13/cobra" + "starwiz.cn/sjy01/preprocessing/extract" +) + +var parseCmd = &cobra.Command{ + Use: "parse", + Short: "Parse the data", + Long: `Parse the data`, + Run: func(cmd *cobra.Command, args []string) { + params := extract.Params{ + InputData: "demo/4545.dat", + OutputPath: "demo/output", + TempPath: "demo/temp", + DataId: "004545", + } + p := extract.NewExtractor(¶ms) + p.ParseAuxPlatform("demo/temp/004545_S44_AUX1.dat") + }, +} + +func init() { + rootCmd.AddCommand(parseCmd) +} diff --git a/cmd/root.go b/cmd/root.go new file mode 100644 index 0000000..490fad3 --- /dev/null +++ b/cmd/root.go @@ -0,0 +1,28 @@ +package cmd + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +var ( + paramsXML string +) + +var rootCmd = &cobra.Command{ + Use: "SJY01 Preprocessing", + Short: "Preprocessing tools for SJY01 original raw data", + Long: ``, + Run: func(cmd *cobra.Command, args []string) { + fmt.Println("preprocessing tools for SJY01 original raw data") + }, +} + +func init() { + rootCmd.PersistentFlags().StringVarP(¶msXML, "params", "p", "params.xml", "parameters file path") +} + +func Execute() error { + return rootCmd.Execute() +} diff --git a/aos.go b/extract/aos.go similarity index 88% rename from aos.go rename to extract/aos.go index 276b455..9eba64b 100644 --- a/aos.go +++ b/extract/aos.go @@ -1,4 +1,4 @@ -package main +package extract import ( "bufio" @@ -10,7 +10,8 @@ import ( ) const ( - AOSFrameLength = 1024 + AOSFrameLength = 1024 + AOSTempDataPrefix = "AOS_" ) var AOSSyncWord = []byte{0x1A, 0xCF, 0xFC, 0x1D} @@ -18,7 +19,7 @@ var AOSSyncWord = []byte{0x1A, 0xCF, 0xFC, 0x1D} type AOSFrame struct { } -func (p *Processor) ExtractAosData() error { +func (p *Extractor) ExtractAosData() error { // 打开传输帧文件 - 一次读入内存 rawData, err := os.ReadFile(p.params.InputData) if err != nil { @@ -27,7 +28,7 @@ func (p *Processor) ExtractAosData() error { } name := filepath.Base(p.params.InputData) - aosDataFile := filepath.Join(p.params.TempPath, "aos_data_"+name) + aosDataFile := filepath.Join(p.params.TempPath, AOSTempDataPrefix+name) foData, err := os.OpenFile(aosDataFile, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0777) if err != nil { diff --git a/aux.go b/extract/aux.go similarity index 96% rename from aux.go rename to extract/aux.go index 60f3094..0b0dc36 100644 --- a/aux.go +++ b/extract/aux.go @@ -1,4 +1,4 @@ -package main +package extract import ( "bufio" @@ -103,16 +103,8 @@ func (afh AuxFrameHead) CheckFrmHead() bool { return false } -// 中心机辅助数据 512 字节 -type AuxCenterMachine struct { -} - -// 焦面电箱辅助数据 128 字节 -type AuxFocalBox struct { -} - // 从传输帧文件中分离辅助数据,分别存储到辅助数据文件 _AUX.dat 和图像数据文件 _IMG_{波谱}.dat 中 -func (p *Processor) SeprateAuxAndImgData(sDataFile string) error { +func (p *Extractor) SeprateAuxAndImgData(sDataFile string) error { // 打开传输帧文件 - 一次读入内存 sData, err := os.ReadFile(sDataFile) if err != nil { diff --git a/extract/aux_ebox.go b/extract/aux_ebox.go new file mode 100644 index 0000000..a5ea9e4 --- /dev/null +++ b/extract/aux_ebox.go @@ -0,0 +1,8 @@ +package extract + +// 卫星时间起点 北京时间 2000-01-01 20:00:00 + +// 焦面电箱辅助数据 128 字节 (每 16 行原始图像数据为一组) +type AuxFocalBox struct { + +} diff --git a/extract/aux_platform.go b/extract/aux_platform.go new file mode 100644 index 0000000..d72d1b6 --- /dev/null +++ b/extract/aux_platform.go @@ -0,0 +1,190 @@ +package extract + +import ( + "encoding/binary" + "fmt" + "os" + + "github.com/sirupsen/logrus" +) + +const AuxPlatformFrmSize = 512 // 512 bytes + +// 中心机辅助数据 512 字节 (每 16 行原始图像数据为一组) +type AuxPlatform struct { + // 结构中标注的字节序号从 1 开始计数 + UTCTimeSec uint32 // [1-4] 卫星 UTC 时间戳(秒 + Waveway uint8 // [5] 波道 + Microsecond uint32 // [6-8]卫星秒小数(微秒) + QuatAttstarQ0 float64 // [9-12]定姿四元数(J2000) 的 Q0 值,量纲 1/0x40000000 + QuatAttstarQ1 float64 // [13-16]Q1 值 + QuatAttstarQ2 float64 // [17-20]Q2 值 + QuatAttstarQ3 float64 // [21-24]Q3 值 + QuatOrbitQ1 float64 // [25-28]本体相对轨道四元数矢部 的 Q1 值,量纲 1/0x40000000 + QuatOrbitQ2 float64 // [29-32]Q2 值 + QuatOrbitQ3 float64 // [33-36]Q3 值Q3 值 + QuatOrbJQ1 float64 // [37-40]轨道相对惯性系四元数矢部 的 Q1 值,量纲 1/0x40000000 + QuatOrbJQ2 float64 // [41-44]Q2 值 + QuatOrbJQ3 float64 // [45-48]Q3 值 + Eular1 float64 // [49-52]本体相对轨道姿态角,量纲:1/1000000 单位:rad + Eular2 float64 // [53-56] + Eular3 float64 // [57-60] + DotEular1 float64 // [61-62]本体相对轨道角速度,量纲:1/100000 单位:rad + DotEular2 float64 // [63-64] + DotEular3 float64 // [65-66] + ModTime uint32 // [67-70]模式运行时间 秒 + DTime int16 // [71-72]姿控调用周期,量纲:1/1000 单位:秒 + AutoState [3]uint8 // [73-75]姿轨控部件使用标志 + ProTrack [16]uint8 // [76-91]姿轨控算法执行标记 + QeQ1 float64 // [92-95]偏差四元数 double 量纲:1/0x40000000 /bit + QeQ2 float64 // [96-99] + QeQ3 float64 // [100-103] + We1 float64 // [104-105]偏差角速度 量纲:1/0x100000 单位:rad + We2 float64 // [106-107] + We3 float64 // [108-109] + WTFX float64 // [110-111]X飞轮估计摩擦力矩 量纲:1/0x400000 + WTFY float64 // [112-113] + WTFZ float64 // [114-115] + FbdriftX float64 // [116-117]三轴陀螺X轴角速度漂移估计 1/0x4000000 rad/s + FbdriftY float64 // [118-119] + FbdriftZ float64 // [120-121] + KalbX float64 // [122-123]三轴角速度卡尔曼漂移X 量纲:1/0x4000000 单位:rad/s + KalbY float64 // [124-125] + KalbZ float64 // [126-127] + HTDX float64 // [128-129]X轴估计环境干扰力矩 量纲:1/0x200000 + HTDY float64 // [130-131] + HTDZ float64 // [132-133] + CommandWheelX float64 // [134-135]X轴计算飞轮控制力矩 量纲:1/0x40000 + CommandWheelY float64 // [136-137] + CommandWheelZ float64 // [138-139] + QuatG1 float64 // [140-143]期望四元数矢部1 量纲:1/0x40000000 /bit + QuatG2 float64 // [144-147] + QuatG3 float64 // [148-151] + WG1 float64 // [152-153]期望角速度1 量纲:1/0x40000 + WG2 float64 // [154-155] + WG3 float64 // [156-157] + J2000PosX float64 // [158-161]计算当前J2000位置X 1/0x100 单位:m + J2000PosY float64 // [162-165] + J2000PosZ float64 // [166-169] + J2000VelX float64 // [170-173]计算当前J2000速度X 量纲:1/0x100 单位:m/s + J2000VelY float64 // [174-177] + J2000VelZ float64 // [178-181] + W84PosX float64 // [182-185]计算当前WGS 84位置X 1/0x100 单位:m + W84PosY float64 // [186-189] + W84PosZ float64 // [190-193] + W84VelX float64 // [194-197]计算当前WGS 84速度X 量纲:1/0x100 单位:m/s + W84VelY float64 // [198-201] + W84VelZ float64 // [202-205] + AngleDraft float64 // [206-209]偏流角 量纲:1/10000000 单位:rad + DataTransLong float64 // [210-211]数传点经度 量纲:1/1000 + DataTransLat float64 // [212-213]数传点纬度 量纲:1/1000 + DataTransH float64 // [214-215]数传点地程高 量纲:1 + StarPrio1 byte // [216] 星敏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 + WheelspeedcalY float64 // [223-226] + WheelspeedcalZ float64 // [227-230] + Reserved0 [2]byte // 预留字节 + Reserved1 [4]byte // 预留字节 + Reserved2 [2]byte // 预留字节 + Reserved3 [2]byte // 预留字节 + // 241 - 311 暂不解析 + WGS84PosX float64 // [312-315]计算当前WGS 84位置X 单位:0.01米 + WGS84PosY float64 // [316-319] + WGS84PosZ float64 // [320-323] + WGS84VelX float64 // [324-327]计算当前WGS 84速度X 单位:0.01米/秒 + WGS84VelY float64 // [328-331] + WGS84VelZ float64 // [332-335] + J2000Pos_X float64 // [336-339]计算当前J2000位置X 单位:0.01米 + J2000Pos_Y float64 // [340-343] + J2000Pos_Z float64 // [344-347] + J2000Vel_X float64 // [348-351]计算当前J2000速度X 单位:0.01米/秒 + J2000Vel_Y float64 // [352-355] + J2000Vel_Z float64 // [356-359] + // 字节[360-377] 三轴光纤陀螺参数 + SS1_UTCTime uint32 // [378-381] 星敏1 UTC时间 + SS1_UTCTimeFrac float32 // [382-384] 星敏1 UTC秒小数 单位为40.96 us,高字节在前 + SS1_Q1 float64 // [385-388] 星敏1四元数q1 当量:1/2147483647 (星敏坐标系相对于J2000惯性坐标系) + SS1_Q2 float64 // [389-392] 星敏1四元数q2 + SS1_Q3 float64 // [393-396] 星敏1四元数q3 + SS1_Q4 float64 // [397-400] 星敏1四元数q4 + SS1_ExposureTime uint8 // [401] 星敏1曝光时间 无符号数,单位ms + SS1_ImgFrmNo uint32 // [411-413] 星敏1图像帧号 + SS2_UTCTime uint32 // [424-427] 星敏2 UTC时间 + SS2_UTCTimeFrac float32 // [428-430] 星敏2 UTC秒小数 单位为40.96 us,高字节在前 + SS2_Q1 float64 // [431-434] 星敏2四元数q1 当量:1/2147483647 (星敏坐标系相对于J2000惯性坐标系) + SS2_Q2 float64 // [435-438] 星敏2四元数q2 + SS2_Q3 float64 // [439-442] 星敏2四元数q3 + SS2_Q4 float64 // [443-446] 星敏2四元数q4 + SS2_ExposureTime uint8 // [447] 星敏2曝光时间 无符号数,单位ms + SS2_ImgFrmNo uint32 // [457-459] 星敏2图像帧号 + CheckSum byte // [512] 校验和 +} + +func (ap *AuxPlatform) Parse(data []byte) error { + if len(data) < 512 { + return ErrAuxPlatformDataLen + } + + // 按需解析数据 + ap.UTCTimeSec = binary.BigEndian.Uint32(data[0:4]) + 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.DataTransLat = float64(int16(binary.BigEndian.Uint16(data[211:213]))) / 1000 + ap.DataTransH = float64(binary.BigEndian.Uint16(data[213:215])) + + ap.SS1_UTCTime = binary.BigEndian.Uint32(data[377:381]) + ap.SS1_UTCTimeFrac = float32(binary.BigEndian.Uint16(data[381:384])) * 40.96 + ap.SS1_ImgFrmNo = uint32(data[410])<<16 | uint32(data[411])<<8 | uint32(data[412]) + ap.SS2_UTCTime = binary.BigEndian.Uint32(data[423:427]) + ap.SS2_UTCTimeFrac = float32(binary.BigEndian.Uint16(data[427:430])) * 40.96 + ap.SS1_ImgFrmNo = uint32(data[456])<<16 | uint32(data[457])<<8 | uint32(data[458]) + + return nil +} + +func (ap AuxPlatform) Print() { + fmt.Println("--- aux frm ----") + fmt.Printf("UTCTimeSec: %d\n", ap.UTCTimeSec) + 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.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 辅助数据提取器 +// auxfile 辅助数据文件路径 +func (e *Extractor) ParseAuxPlatform(auxfile string) ([]*AuxPlatform, error) { + data, err := os.ReadFile(auxfile) + if err != nil { + logrus.Println("read aux data from", auxfile, "error:", err.Error()) + return nil, err + } + + var aps []*AuxPlatform + for i := 0; i < len(data); i += AuxPlatformFrmSize { + ap := AuxPlatform{} + if err := ap.Parse(data[i : i+AuxPlatformFrmSize]); err != nil { + return nil, err + } + + ap.Print() + aps = append(aps, &ap) + + if i+AuxPlatformFrmSize > len(data) { + logrus.Info("rest of aux data length is not enough", len(data)-i) + break + } + + } + return aps, nil +} diff --git a/envi.go b/extract/envi.go similarity index 98% rename from envi.go rename to extract/envi.go index ac64922..406b41f 100644 --- a/envi.go +++ b/extract/envi.go @@ -1,4 +1,4 @@ -package main +package extract import ( "bytes" diff --git a/extract/errors.go b/extract/errors.go new file mode 100644 index 0000000..642dc5c --- /dev/null +++ b/extract/errors.go @@ -0,0 +1,7 @@ +package extract + +import "errors" + +var ( + ErrAuxPlatformDataLen = errors.New("aux platform data length is not 512 bytes") +) diff --git a/params.go b/extract/params.go similarity index 91% rename from params.go rename to extract/params.go index ddf1768..6bfa041 100644 --- a/params.go +++ b/extract/params.go @@ -1,4 +1,4 @@ -package main +package extract type Params struct { InputData string diff --git a/extract/process.go b/extract/process.go new file mode 100644 index 0000000..03ef016 --- /dev/null +++ b/extract/process.go @@ -0,0 +1,15 @@ +package extract + +import ( + "os" +) + +type Extractor struct { + params *Params +} + +func NewExtractor(params *Params) *Extractor { + os.MkdirAll(params.OutputPath, 0755) + os.MkdirAll(params.TempPath, 0755) + return &Extractor{params: params} +} diff --git a/raw.go b/extract/raw.go similarity index 98% rename from raw.go rename to extract/raw.go index 929253d..958085d 100644 --- a/raw.go +++ b/extract/raw.go @@ -1,4 +1,4 @@ -package main +package extract // 图像数据帧头信息、辅助数据以及图像数据组成, // 帧头信息长度为24字节, diff --git a/spectral_img.go b/extract/spectral_img.go similarity index 95% rename from spectral_img.go rename to extract/spectral_img.go index 37db38b..3757f9f 100644 --- a/spectral_img.go +++ b/extract/spectral_img.go @@ -1,4 +1,4 @@ -package main +package extract type SpectralImage struct { Spectrum string // PAN(B0) B1 B2 B3 B4 diff --git a/trans_frame.go b/extract/trans_frame.go similarity index 95% rename from trans_frame.go rename to extract/trans_frame.go index bd25e8e..d742e84 100644 --- a/trans_frame.go +++ b/extract/trans_frame.go @@ -1,4 +1,4 @@ -package main +package extract import ( "bufio" @@ -46,10 +46,10 @@ func (t *TransFrame) Decode(frame []byte) { } // 提取图像传输帧中的原始图像数据 -func (p *Processor) ExtractOriginalImageData() ([]string, error) { +func (p *Extractor) ExtractOriginalImageData() ([]string, error) { var sData []string name := filepath.Base(p.params.InputData) - aosDataFile := filepath.Join(p.params.TempPath, "aos_data_"+name) + aosDataFile := filepath.Join(p.params.TempPath, AOSTempDataPrefix+name) aosData, err := os.ReadFile(aosDataFile) if err != nil { diff --git a/main.go b/main.go index 9b4b1ed..cc03af6 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,9 @@ import ( "fmt" "github.com/spf13/cobra" + "starwiz.cn/sjy01/preprocessing/cmd" + + "starwiz.cn/sjy01/preprocessing/extract" ) var ( @@ -11,23 +14,25 @@ var ( ) var rootCmd = &cobra.Command{ - Use: "SJY01Preprocessing", - Short: "Preprocessing tools for SJY01 dataset", - Long: `Preprocessing tools for SJY01 dataset`, + Use: "SJY01 Preprocessing", + Short: "Preprocessing tools for SJY01 original raw data", + Long: ``, Run: func(cmd *cobra.Command, args []string) { - fmt.Println("preprocessing tools for SJY01 dataset") - params := Params{ + fmt.Println("preprocessing tools for SJY01 original raw data") + params := extract.Params{ InputData: "demo/4545.dat", OutputPath: "demo/output", TempPath: "demo/temp", DataId: "004545", } - p := NewProcessor(¶ms) - p.ExtractAosData() - dats, _ := p.ExtractOriginalImageData() - for _, d := range dats { - p.SeprateAuxAndImgData(d) - } + p := extract.NewExtractor(¶ms) + // p.ExtractAosData() + // dats, _ := p.ExtractOriginalImageData() + // for _, d := range dats { + // p.SeprateAuxAndImgData(d) + // } + + p.ParseAuxPlatform("demo/temp/004545_S44_AUX1.dat") }, } @@ -37,5 +42,5 @@ func init() { } func main() { - rootCmd.Execute() + cmd.Execute() } diff --git a/process.go b/process.go deleted file mode 100644 index 16354f9..0000000 --- a/process.go +++ /dev/null @@ -1,15 +0,0 @@ -package main - -import ( - "os" -) - -type Processor struct { - params *Params -} - -func NewProcessor(params *Params) *Processor { - os.MkdirAll(params.OutputPath, 0755) - os.MkdirAll(params.TempPath, 0755) - return &Processor{params: params} -}