Files
sjy01-preprocessing/extract/aux_platform.go
nuknal db650cdaa9 xlsx
2024-05-21 17:41:00 +08:00

808 lines
30 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package extract
import (
"encoding/binary"
"fmt"
"os"
"time"
"github.com/k0kubun/pp/v3"
"github.com/xuri/excelize/v2"
log "github.com/sirupsen/logrus"
"starwiz.cn/sjy01/preprocessing/calculator"
)
const AuxPlatformFrmSize = 512 // 512 bytes
// 中心机辅助数据 512 字节 (每 16 行原始图像数据为一组)
type AuxPlatform struct {
// 结构中标注的字节序号从 1 开始计数
UTCTimeSec uint32 // [1-4] 卫星 UTC 时间戳(秒)
Waveway uint8 // [5] 波道 0x00波道1241.0~311.00x01波道2241.1~311.1
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]本体相对轨道姿态角,[Z]Yaw 测摆角量纲1/1000000 单位rad
Eular2 float64 // [53-56] Pitch [Y]
Eular3 float64 // [57-60] Roll [X]
DotEular1 float64 // [61-62]本体相对轨道角速度量纲1/100000 单位rad
DotEular2 float64 // [63-64]
DotEular3 float64 // [65-66]
ModTime uint32 // [67-70]模式运行时间 秒
DTime float64 // [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
StarPrio [3]byte // [216-218] 星敏1定姿方式标志1 0x00星敏1定姿0xA0:星敏1滤波;0x01星敏2定姿0xA1:星敏2滤波;0xff:未使用星敏定姿
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.0 - 311.0 波道1参数
// 241.1 - 311.1 波道2参数
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]
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_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_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_XAV float64 // [417-418] 星敏1X方向角速度 单位2e-11 °/s
SS1_YAV float64 // [419-420]
SS1_ZAV float64 // [421-422]
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_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图像帧号
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] 校验和
}
func (ap *AuxPlatform) Decode(data []byte) error {
if len(data) < 512 {
return ErrAuxPlatformDataLen
}
// 按需解析数据
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.QuatAttstarQ0 = float64(bigEndianToInt32(data[8:12])) / 0x40000000
ap.QuatAttstarQ1 = float64(bigEndianToInt32(data[12:16])) / 0x40000000
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_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_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_UTCTimeFrac = float32(uint32(data[427])<<16|uint32(data[428])<<8|uint32(data[429])) * 40.96
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(bigEndianToInt32(data[491:495])) / 19200
ap.MagnetictrengthY = float64(bigEndianToInt32(data[495:499])) / 19200
ap.MagnetictrengthZ = float64(bigEndianToInt32(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
}
func (ap AuxPlatform) Print() {
pp.Println(ap)
}
func (ap AuxPlatform) SaveXlsx(f *excelize.File, col, row int) (int, error) {
var values = []interface{}{
ap.UTCTimeSec,
ap.Waveway,
ap.Microsecond,
ap.QuatAttstarQ0,
ap.QuatAttstarQ1,
ap.QuatAttstarQ2,
ap.QuatAttstarQ3,
ap.QuatOrbitQ1,
ap.QuatOrbitQ2,
ap.QuatOrbitQ3,
ap.QuatOrbJQ1,
ap.QuatOrbJQ2,
ap.QuatOrbJQ3,
ap.Eular1,
ap.Eular2,
ap.Eular3,
ap.DotEular1,
ap.DotEular2,
ap.DotEular3,
ap.ModTime,
ap.DTime,
ap.AutoState,
ap.ProTrack,
ap.QeQ1,
ap.QeQ2,
ap.QeQ3,
ap.We1,
ap.We2,
ap.We3,
ap.WTFX,
ap.WTFY,
ap.WTFZ,
ap.FbdriftX,
ap.FbdriftY,
ap.FbdriftZ,
ap.KalbX,
ap.KalbY,
ap.KalbZ,
ap.HTDX,
ap.HTDY,
ap.HTDZ,
ap.CommandWheelX,
ap.CommandWheelY,
ap.CommandWheelZ,
ap.QuatG1,
ap.QuatG2,
ap.QuatG3,
ap.WG1,
ap.WG2,
ap.WG3,
ap.J2000PosX,
ap.J2000PosY,
ap.J2000PosZ,
ap.J2000VelX,
ap.J2000VelY,
ap.J2000VelZ,
ap.W84PosX,
ap.W84PosY,
ap.W84PosZ,
ap.W84VelX,
ap.W84VelY,
ap.W84VelZ,
ap.AngleDraft,
ap.DataTransLong,
ap.DataTransLat,
ap.DataTransH,
ap.StarPrio[0],
ap.StarPrio[1],
ap.StarPrio[2],
ap.WheelspeedcalX,
ap.WheelspeedcalY,
ap.WheelspeedcalZ,
"",
"",
"",
"",
"锂电池温度",
"相机主镜温度",
"相机次镜温度",
"推进模块温度",
"负X侧相机桁架杆温度",
"正X正Y侧相机桁架杆温度",
"正X负Y侧相机桁架杆温度",
"正X侧相机支撑背板温度",
"负X侧相机支撑背板温度",
"星敏支架温度",
"成像电箱温度",
"正Y帆板温度",
"电源下位机温度",
"配电热控驱动温度",
"电源控制器温度",
"数字太阳敏矢量数据有效位",
"数字太阳敏矢量数据X",
"数字太阳敏矢量数据Y",
"数字太阳敏位置X1",
"数字太阳敏位置X2",
"数字太阳敏位置Y1",
"数字太阳敏位置Y2",
"太阳敏温度",
"数字太阳敏当前正在使用的阈值(源码)",
"数字太阳敏当前正在使用的增益",
"保留",
"保留",
"保留",
"错误码计数",
"单粒子错误计数",
"配电错误码1",
"配电错误码2",
"配电错误码3",
"配电错误码4",
"配电错误码5",
"GPS天内秒",
"GPSUTC时间累计秒",
"太阳阵电流",
"母线电流",
"负载电流",
"蓄电池电压",
"电源母线电压",
"CPU5.2V电压遥测值",
"5.2V配电电压遥测值",
"保留",
"蓄电池组当前电量",
"模式运行时间秒",
"卫星现运行模式",
"组合业务标识",
"当前业务状态",
"中心机指令接收总计数",
"中心机错误指令计数",
"执行指令所在分系统",
"执行指令的指令代码",
"执行延时指令总计数",
"当前延时指令计数",
"执行延时指令所在分系统",
"执行延时指令的指令代码",
"当前延时业务计数",
"成功执行业务计数",
"异常中止业务计数",
"指令执行状态",
"业务异常中止状态",
"测控数传一体机通信状态",
"保留",
"北斗短报文通信状态",
"GPS接收机通信状态",
"数字太阳敏通信状态",
"星敏1通信状态",
"星敏2通信状态",
"光纤陀螺通信状态",
"MEMS陀螺通信状态",
"飞轮1通信状态",
"飞轮2通信状态",
"飞轮3通信状态",
"飞轮4通信状态",
"智能载荷通信状态",
"保留",
"保留",
"电磁阀开关状态",
"业务保存状态",
"卫星类型标识",
"卫星序号标识",
"保留",
"保留",
"保留",
"保留",
"锂电池加热器通断状态",
"相机主镜加热器通断状态",
"相机次镜加热器通断状态",
"推进模块加热器通断状态",
"相机负X侧桁架杆加热器通断状态",
"成像电箱加热器通断状态",
"相机正X正Y侧桁架杆加热器通断状态",
"相机正X负Y侧桁架杆加热器通断状态",
"相机正X侧支撑背板加热器通断状态",
"相机负X侧支撑背板加热器通断状态",
"星敏支架加热器通断状态",
"保留",
"温度修正系数校验状态",
"电源下位机广播帧监视功能",
"当前控温码表",
"默认控温码表",
"飞轮1电源供电状态",
"飞轮2电源供电状态",
"飞轮3电源供电状态",
"SADA1电源供电状态",
"SADA2电源供电状态",
"测控数传电源供电状态",
"保留",
"保留",
"北斗短报文供电状态",
"推进电源供电状态",
"焦面电源供电状态",
"飞轮4电源供电状态",
"星敏1电源供电状态",
"星敏2电源供电状态",
"数字太阳敏电源供电状态",
"导航电源供电状态",
"三轴光纤陀螺电源供电状态",
"MEMS陀螺电源供电状态",
"热控正线状态",
"热控1状态",
"热控2状态",
"保留",
"保留",
"保留",
"锂电池加热器控温模式",
"相机主镜加热器控温模式",
"相机次镜加热器控温模式",
"推进模块加热器控温模式",
"相机负X侧桁架杆加热器控温模式",
"相机正X正Y侧桁架杆加热器控温模式",
"相机正X负Y侧桁架杆加热器控温模式",
"相机正X侧支撑背板加热器控温模式",
"相机负X侧支撑背板加热器控温模式",
"星敏支架加热器控温模式",
"成像电箱加热器控温模式",
"保留",
"保留",
"保留",
"保留",
"保留",
"保留",
"保留",
"接收机时间来源",
"定位模式",
"轨道数据有效标示",
"主备机标志",
"PPS状态",
"GPS最高信噪比",
"BD最高信噪比",
"参与定位的GPS导航星数",
"参与定位的BD导航星数",
"GPS几何精度因子",
"GPS连续工作时间",
"保留",
"保留",
ap.WGS84PosX,
ap.WGS84PosY,
ap.WGS84PosZ,
ap.WGS84VelX,
ap.WGS84VelY,
ap.WGS84VelZ,
ap.J2000Pos_X,
ap.J2000Pos_Y,
ap.J2000Pos_Z,
ap.J2000Vel_X,
ap.J2000Vel_Y,
ap.J2000Vel_Z,
ap.FOGyroXAV,
ap.FOGyroYAV,
ap.FOGyroZAV,
ap.FOGyroXAV1,
ap.FOGyroYAV1,
ap.FOGyroZAV1,
ap.SS1_UTCTime,
ap.SS1_UTCTimeFrac,
ap.SS1_Q1,
ap.SS1_Q2,
ap.SS1_Q3,
ap.SS1_Q4,
ap.SS1_ExposureTime,
ap.SS1_Threshold,
ap.SS1_BackgroudV,
"星敏A上电进入boot标志",
"星敏AEDAC打开标志",
"星敏A程序版本",
"星敏A四元数滤波标志",
"星敏A系统内部工作进程代号",
ap.SS1_WorkMode,
ap.SS1_ExtractStars,
ap.SS1_NavStars,
ap.SS1_Gain,
ap.SS1_RegonizedStars,
ap.SS1_ExtenalImage,
ap.SS1_AttitudeActive,
"星敏A内部软件版本号低3位",
"星敏A产品设备编号低5位",
"星敏A成像传感器温度",
"星敏A在轨EDAC错误计数",
ap.SS1_ImgFrmNo,
"星敏A四星寻找阈值",
"星敏A跟踪阈值",
"星敏ASAA阈值",
"星敏ASAA工作模式",
"星敏A动态模式标志位",
ap.SS1_XAV,
ap.SS1_YAV,
ap.SS1_ZAV,
"星敏A星点阈值自适应功能",
"保留",
"星敏A速率质量",
ap.SS2_UTCTime,
ap.SS2_UTCTimeFrac,
ap.SS2_Q1,
ap.SS2_Q2,
ap.SS2_Q3,
ap.SS2_Q4,
ap.SS2_ExposureTime,
ap.SS2_Threshold,
ap.SS2_BackgroudV,
"星敏B上电进入boot标志",
"星敏BEDAC打开标志",
"星敏B程序版本",
"星敏B四元数滤波标志",
"星敏B系统内部工作进程代号",
ap.SS2_WorkMode,
ap.SS2_ExtractStars,
ap.SS2_NavStars,
ap.SS2_Gain,
ap.SS2_RegonizedStars,
ap.SS2_ExtenalImage,
ap.SS2_AttitudeActive,
"星敏B内部软件版本号低3位",
"星敏B产品设备编号低5位",
"星敏B成像传感器温度",
"星敏B在轨EDAC错误计数",
ap.SS2_ImgFrmNo,
"星敏B四星寻找阈值",
"星敏B跟踪阈值",
"星敏BSAA阈值",
"星敏BSAA工作模式",
"星敏B动态模式标志位",
"保留",
ap.FlyWheel1_Vel,
ap.FlyWheel1_Amps,
ap.FlyWheel2_Vel,
ap.FlyWheel2_Amps,
ap.FlyWheel3_Vel,
ap.FlyWheel3_Amps,
ap.FlyWheel4_Vel,
ap.FlyWheel4_Amps,
ap.MemsGyroXAV,
ap.MemsGyroYAV,
ap.MemsGyroZAV,
ap.MagnetictrengthX,
ap.MagnetictrengthY,
ap.MagnetictrengthZ,
ap.ASSTimeInt,
ap.ASSTimeDec,
"",
fmt.Sprintf("%08b", ap.CheckSum),
}
for i := 0; i < len(values); i++ {
cell, _ := excelize.CoordinatesToCellName(col, row)
f.SetCellValue("Sheet1", cell, values[i])
col++
}
return len(values), nil
}
// Extractor 辅助数据提取器
// auxfile 辅助数据文件路径
func (e *Extractor) ParseAuxPlatform(auxfile string) ([]*AuxPlatform, error) {
data, err := os.ReadFile(auxfile)
if err != nil {
log.Println("read aux data from", auxfile, "error:", err.Error())
return nil, err
}
var aps []*AuxPlatform
for i := 0; i < len(data); i += 24 + 128 + 512 {
ap := AuxPlatform{}
if err := ap.Decode(data[i+24+128 : i+24+128+512]); err != nil {
return nil, err
}
aps = append(aps, &ap)
// ap.Print()
// Calculate(
// Vector3{ap.J2000Pos_X, ap.J2000Pos_Y, ap.J2000Pos_Y},
// Vector3{ap.J2000Vel_X, ap.J2000Vel_Y, ap.J2000Vel_Z},
// Quaternion{ap.SS1_Q1, ap.SS1_Q2, ap.SS1_Q3, ap.SS1_Q4},
// )
pp.Println(calculator.WGS84XYZtoLatLngH(ap.W84PosX, ap.W84PosY, ap.W84PosZ))
pp.Println(calculator.WGS84XYZtoLatLngH(ap.WGS84PosX, ap.WGS84PosY, ap.WGS84PosZ))
pp.Println(calculator.J2000ToWGS84(
ap.J2000PosX,
ap.J2000PosY,
ap.J2000PosZ,
time.Unix(
int64(ap.UTCTimeSec+uint32(ReferenceTime2000)),
int64(ap.Microsecond)*1000).UTC()))
pp.Println(calculator.J2000ToWGS84(
ap.J2000Pos_X,
ap.J2000Pos_Y,
ap.J2000Pos_Z,
time.Unix(
int64(ap.UTCTimeSec+uint32(ReferenceTime2000)),
int64(ap.Microsecond)*1000).UTC()))
break
}
return aps, nil
}
func (e *Extractor) ParseAuxPlatformWithHead(auxfile string) ([]*AuxPlatform, error) {
data, err := os.ReadFile(auxfile)
if err != nil {
log.Println("read aux data from", auxfile, "error:", err.Error())
return nil, err
}
fimg, _ := os.Create("demo/temp/ref_051622_aux_img.txt")
defer fimg.Close()
fimg.WriteString("index 流水号 文件号 时间秒 秒小数 utcTime\n")
var aps []*AuxPlatform
rows := 0
for i := 0; i < len(data); {
if data[i] == 0xD1 && data[i+1] == 0x5B && data[i+2] == 0xD1 && data[i+3] == 0x5B {
log.Debug("find package head: 0xD15BD15B")
} else {
i++
// log.Println(i,"not find package head: 0xD15BD15B, skip 1 byte")
continue
}
afh := &AuxFrameHead{}
afh.Decode(data[i : i+24])
if !afh.IsValidFrmHead {
log.Debugf("[%d] invalid frame head of original raw data %v", i, afh.FrmHead)
i += 1
continue
}
if (afh.SerialNo-1)%16 == 0 {
ab := &AuxFocalBox{}
ab.Decode(data[i+24 : i+32])
fmt.Println(ab.String())
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)
fimg.WriteString(
fmt.Sprintf("%d %d %d %d %d %d %s\n",
i,
afh.SerialNo,
afh.FileNo,
afh.TimeSec,
afh.TimeSecFrac,
utcTime,
taux.String(),
))
rows++
// if rows > 32 {
// break
// }
}
i += 64
}
return aps, nil
}
func Time2000UTCSec() int64 {
t, _ := time.ParseInLocation("2006-01-02 15:04:05", "2000-01-01 12:00:00", time.UTC)
return t.Unix()
}