Files
CCSDS_study/test/__pycache__/Tianwen-1-frame-analysis-v2.cpython-38.pyc

214 lines
18 KiB
Plaintext
Raw Normal View History

2026-05-05 21:54:35 +08:00
U
<00><><EFBFBD>i;<3B><00>@s$dZddlZddlmZddlZddlZee<07><01><08>j j Z
ej <0B> e e
<EFBFBD><01>ddlZddlZej<10>dd<05>ddlZe<12>d<06>ddlmZdejd<ddlZddlZddlTddlmZddlm Z e
d Z!e!d
Z"dd d <0A>Z#dd<0F>Z$dd<11>Z%dd<13>Z&dd<15>Z'dd<17>Z(dd<19>Z)dd<1B>Z*e+dk<02>r e*<2A>dS)u<>Tianwen-1 frame analysis notebook converted to a Python script.
本脚本由 `Tianwen-1 frame analysis.ipynb` 转换而来,保留原 notebook
的执行顺序,并把原 Markdown 标题和交互式观察步骤整理为注释。
脚本主要功能:
1. 读取 2020-07-30 的天问一号 AOS 帧二进制数据。
2. 使用本目录下的 `ccsds.py` 解析 AOS 主头、插入区和 Space Packet。
3. 按 spacecraft ID、virtual channel 和 APID 对数据分组。
4. 绘制帧计数、时间戳、载荷字节和若干遥测通道的变化曲线。
注意:
- 原 notebook 假设当前工作目录就是 `Tianwen/`。本脚本会自动切换到
文件所在目录,以便相对路径 `tianwen1_frames_20200730.u8` 能正常工作。
- notebook 中单独显示表达式结果的单元,在脚本中改为 `print(...)`。
- 绘图默认使用 matplotlib 当前后端;如果在无图形界面环境运行,可在
执行前设置 `MPLBACKEND=Agg`。
<EFBFBD>N)<01>PathZ MPLCONFIGDIRz/tmp/matplotlibZAggzfigure.max_open_warning)<01>*ZTianwenZframe_analysis_figures<65>xcCsB|<00><00><00><01>}t<02>dd|<00>}t<02>dd|<00>}|<00>d<04>}|p8dd|<01>S)u<把图标题转换成适合作为文件名的短字符串。z[^0-9a-zA-Z._() -]+<2B>_z\s+z._- ZuntitledN)<04>strip<69>lower<65>re<72>sub)<02>textZ
max_length<EFBFBD>r <00>#test/Tianwen-1-frame-analysis-v2.py<70> safe_filename^s
 
r c Cs<>|jddd<02>g}t<01><02>D]|}t<01>|<02>}|<03><04>}d}|D]}|<06><05><00><06>}|r8qRq8d|d<05>dt|<05><01>d<07>}||}|j|dd d
<EFBFBD>|<01> |<08>t<01>
|<03>qt d t |<01><01>d |<00><00><04>|S) u保存当前 matplotlib 会话中的所有 figure。
文件名格式为 `figure_序号_标题.png`。标题来自当前坐标轴的 title
如果没有标题,则使用 `untitled`。保存后关闭 figure降低长脚本的内存占用。
T)<02>parents<74>exist_ok<6F>Zfigure_Z03drz.png<6E><67>Ztight)ZdpiZ bbox_incheszSaved z figures to ) <0A>mkdir<69>pltZ get_fignums<6D>figureZget_axesZ get_titlerr Zsavefig<69>append<6E>close<73>print<6E>len) Z
output_dirZ saved_pathsZ figure_numberZfigZaxes<65>titleZax<61>filename<6D>pathr r r <00>save_all_figuresqs" 
 
 rcCst|<00>tkr|dS|S)u<>返回 Space Packet 原始字节。
`ccsds.extract_space_packets(..., get_timestamps=True)` 返回
`(packet_bytes, timestamp)` 二元组;不带时间戳时只返回 packet bytes。
这个辅助函数屏蔽两种返回格式差异。
r)<02>type<70>tuple)<01>pr r r <00>
get_packet<EFBFBD>s
r cCst<00>dd<02>|D<00><01>S)u把 Space Packet 载荷转换为二维 uint8 数组。
每个 Space Packet 的前部是 CCSDS Space Packet Primary Header。
本函数跳过主头,只保留后续用户数据区,便于直接按字节或按数值类型
重解释为遥测通道矩阵。
cSs*g|]"}t<00>t|<01>tj<04><05>d<00>d<01><02>qS)N<>uint8)<06>npZ
frombufferr <00>ccsds<64>SpacePacketPrimaryHeaderZsizeof<6F><02>.0rr r r <00>
<listcomp><3E>s
<02><02>z#packets_asarray.<locals>.<listcomp><3E>r"<00>array<61>Zpacketsr r r <00>packets_asarray<61>s
<02><04>r+c Csjt|<00><01><00>D]X}tjddd<03>t||<00>}tj||jd|jdd<06>t<02>d|<03>d|<01>d |<02><00><06>q d
S) u按 APID 绘制 Space Packet 载荷热力图。
横轴对应载荷字节位置,纵轴对应同一 APID 下的 packet 序号。这个图常用于
观察哪些字段固定、哪些字段随时间变化,以及是否存在明显的分段结构。
)<02>r,<00>w<>ZfigsizeZ facecolor<6F>r)ZaspectzAPID z Spacecraft z Virtual channel N)<08>sorted<65>keysrrr+Zimshow<6F>shaper)ZapidsZscZvc<76>apidZpsr r r <00>
plot_apids<EFBFBD>s
 r4cCst<00>dd<02>|D<00><01>S)uF从 AOS 帧插入区提取时间戳,并转换为 numpy.datetime64。cSsg|]}t<00>|jj<03><01>qSr )<04> tianwen1_tm<74>parse_timestamp_datetime64<36> insert_zone<6E> timestamp<6D>r&<00>ar r r r'<00>sz"get_timestamps.<locals>.<listcomp>r()<01>aosr r r <00>get_timestamps<70>s <0C>r<cCst<00>dd<02>|D<00><01>S)uI从 `(packet, timestamp)` 形式的 Space Packet 列表提取时间戳。cSsg|]}t<00>|d<00><01>qS)r/)r5r6r%r r r r'<00>sz)get_packet_timestamps.<locals>.<listcomp>r(r*r r r <00>get_packet_timestamps<70>sr=c s~t<00>t<02>d}tjddd<04>}|d|j||<00><00>d|f<02>}td|jd<00>d d
<EFBFBD>|D<00>}td t <09>
d d
<EFBFBD>|D<00><01><01>td t <09>
dd
<EFBFBD>|D<00><01><01>tdt <09>
dd
<EFBFBD>|D<00><01><01>tdt <09>
dd
<EFBFBD>|D<00><01><01>tddd
<EFBFBD>|dd<15>D<00><01>tddd
<EFBFBD>|D<00>dd<18><00>dd
<EFBFBD>|D<00>}t<03> dd
<EFBFBD>|D<00><01>}t j ddd<1D>t <0C>t<03>|<04>d<00>t <0C>d<1F>t <0C>d <20>t <0C>d!<21>td"d#d
<EFBFBD>|D<00>dd<18><00>td$d%d&<26>|D<00><01>tt<14>|d'd<1E><03><01>d(d
<EFBFBD><00>D<00><01>t <09>
d)d
<EFBFBD><00>D<00><01>}td*|<05><00><03>fd+d,<2C>|D<00>}t|d'd<1E>d-d
<EFBFBD>|D<00>}t<03> d.d
<EFBFBD>|D<00><01>}t j ddd<1D>t <0C>t<03>|<04>d<00>t <0C>d/<2F>t <0C>d <20>t <0C>d!<21>td0d1d
<EFBFBD>|dd<18>D<00><01>t<03> d2d
<EFBFBD>t||<02>D<00><01>}td3t<03>|dd<05>d4d5<64>f<00><01>td6td7<64><01>td8t<03>|dd<05>d5f<00><01>td9td:<3A><01>td;t<03>|dd<05>d<d<05>f<00><01>td=t|djj<1B><01>d>d
<EFBFBD>|D<00>} t<03> d?d
<EFBFBD>| D<00><01>}t j ddd<1D>t <0C>t<03>|<04>d<00>t <0C>d@<40>t <0C>d <20>t <0C>d!<21>tdAdBd
<EFBFBD>| dd<18>D<00><01>t| <09>}
t j ddd<1D>t <0C>|
|dC<64>t <0C>dD<64>t <0C>dE<64>t <0C>dF<64>t <0C><1D>tdGdHd&<26>| D<00><01>ttj| dIddJdK<64><04><01>dLd
<EFBFBD><00>D<00><01>t <09>
dMd
<EFBFBD><00>D<00><01>} tdN| <0B><00><01>fdOd,<2C>| D<00>} t| dId<1E>t| dP<00><01>dQ<64><01> <20>} t!| dP<00>}t j ddd<1D>t <0C>|| dd<05>ddR<64>f<00>t <0C>dS<64>t <0C>dT<64>t <0C>dU<64>t <0C>"dVd
<EFBFBD>t#dd5dW<64>D<00><01>t j dXdd<1D>t$dYdZ<64>}t <0C>||| |ddR<64>f<00>t <0C>dS<64>t <0C>dT<64>t <0C>dU<64>t <0C>"d[d
<EFBFBD>t#dd5dW<64>D<00><01>t| d\<00><01>dQ<64><01> <20>} t!| d\<00>}t j ddd<1D>t <0C>|| dd<05>d]d^<5E>f<00>t <0C>d_<64>t <0C>dT<64>t <0C>dU<64>t <0C>"d`d
<EFBFBD>t#dadbdW<64>D<00><01>t j ddd<1D>t$dcdd<64>}t <0C>||| |d]d^<5E>f<00>t <0C>d_<64>t <0C>dT<64>t <0C>dU<64>t <0C>"ded
<EFBFBD>t#dadbdW<64>D<00><01>t j ddd<1D>t <0C>|| dd<05>d^da<64>f<00>t <0C>df<64>t <0C>dT<64>t <0C>dU<64>t <0C>"dgd
<EFBFBD>t#dbdhdW<64>D<00><01>t j ddd<1D>t <0C>||| |d^da<64>f<00>t <0C>df<64>t <0C>dT<64>t <0C>dU<64>t <0C>"did
<EFBFBD>t#dbdhdW<64>D<00><01>t<03>%t| dj<00>dd<05>dkd<05>fdd<05>ddl<64>f<00><01>dm<64><01> <20>} t!| dj<00>}tj&| t<03>'t<03>|<0E><01>dd<05>f<t j ddd<1D>t <0C>|| <0A>t <0C>dn<64>t <0C>dT<64>t <0C>do<64>t <0C>"dpd
<EFBFBD>t#dkdqdr<64>D<00><01>t <0C><1D>dsDt j ddd<1D>t#| jd<00>D]t}||dt<03>(ddt<64>}t<03>)| dd<05>|f<00>}t<03>*||| ||f<00><00>}t <0C>|| dd<05>|ft<03>+||<11><00><00>q<>t <0C>dn<64>t <0C>dT<64>t <0C>do<64>t <0C>"<22>fdud
<EFBFBD>t#dkdqdr<64>D<00><01>t <0C><1D><00>q<>t<03>%t| dv<00>dd<05>dwd<05>fdd<05>ddl<64>f<00><01>dm<64><01> <20>} t!| dv<00>}t<03> dxd
<EFBFBD>| dvD<00><01>}tj&| t<03>'t<03>|<0E><01>dd<05>f<t j ddd<1D>||t<03>(ddt<64>}tj&|t<03>'t<03>|<0E><01><t <0C>||<14>t <0C>dy<64>t <0C>dT<64>t <0C>dz<64>t j ddd<1D>t <0C>|| <0A>t <0C>d{<7B>t <0C>d|<7C>t <0C>do<64>t <0C>"d}d
<EFBFBD>t#dwd~dr<64>D<00><01>t <0C><1D>t<03>,|t<03>-d<64>k<01>dd}t$dd<05>t$d|<15>fD]<5D>}dsD]<5D><>t j ddd<1D>t#| jd<00>D]|}||||dt<03>(ddt<64>}t<03>)| ||f<00>}t<03>*||| |||f<00><00>}t <0C>||| ||ft<03>+||<11><00><00>
q8t <0C>d{<7B>t <0C>d<><64>t <0C>do<64>t <0C>"<22>fd<>d
<EFBFBD>t#dwd~dr<64>D<00><01>t <0C><1D><00>
q<18>
qt| dW<00>}t!| dW<00>}t| dW<00>}t!| dW<00>}t j ddd<1D>t j||dd<05>dfd<>d<EFBFBD>d<EFBFBD><64>t j||dd<05>dfdCd<43>d<EFBFBD><64>t <0C>d<><64>t <0C>dT<64>t <0C>d<><64>t <0C>"<22>t <0C><1D>t j ddd<1D>t j||dd<05>dWfd<>d<EFBFBD>d<EFBFBD><64>t j||dd<05>dWfdCd<43>d<EFBFBD><64>t <0C>d<><64>t <0C>dT<64>t <0C>d<><64>t <0C>"<22>t <0C><1D>t j ddd<1D>t$d<>d<EFBFBD><64>}t j||||d<>fd<>d<EFBFBD>d<EFBFBD><64>t j||||d<>fdCd<43>d<EFBFBD><64>t <0C>d<><64>t <0C>dT<64>t <0C>d<><64>t <0C>"<22>t <0C><1D>t j ddd<1D>t j||||drfd<>d<EFBFBD>d<EFBFBD><64>t j||||drfdCd<43>d<EFBFBD><64>t <0C>d<><64>t <0C>dT<64>t <0C>d<><64>t <0C>"<22>t <0C><1D>t| d<><00>} t!| d<><00>}t j ddd<1D>t$d<>d<EFBFBD><64>}t <0C>||| |dfd<><64>t <0C>d<><64>t <0C>dT<64>t <0C>d<><64>t <0C><1D>t j ddd<1D>t <0C>||| |d<>d<EFBFBD><64>fd<><64>t <0C>||| |dad<15>fd<><64>t <0C>d<><64>t <0C>dT<64>t <0C>d<><64>t <0C>"d<>d
<EFBFBD>tt#d<>d<EFBFBD><64><02>tt#dad<15><02>D<00><01>t <0C><1D>t| d<><00><01>dQ<64><01> <20>} t!| d<><00>}t j ddd<1D>t <0C>|| dd<05>dd<><64>f<00>t <0C>d<><64>t <0C>dT<64>t <0C>dU<64>t <0C>"d<>d
<EFBFBD>t#dd<>dW<64>D<00><01>t <0C><1D>t| d<><00><01>dQ<64><01> <20>} t!| d<><00>}t j ddd<1D>t <0C>|| dd<05>d]f<00>t <0C>d<><64>t <0C>dT<64>t <0C>dU<64>t <0C><1D>t j ddd<1D>t <0C>|| dd<05>df<00>t <0C>d<><64>t <0C>dT<64>t <0C>dU<64>t <0C><1D>t.t/<2F>dS)<29>u1按原 notebook 顺序执行完整分析流程。<E7A88B><E38082>ztianwen1_frames_20200730.u8r!)ZdtypeN<65><4E><EFBFBD><EFBFBD><EFBFBD>zNumber of frames:rcSsg|]}tj<01>|<01><01>qSr )r#ZAOSFrame<6D>parse)r&<00>fr r r r' szmain.<locals>.<listcomp>zTransfer frame versions:cSsg|] }|jj<01>qSr )<02>primary_headerZtransfer_frame_version_numberr9r r r r'szSpacecraft IDs:cSsg|] }|jj<01>qSr <00>rB<00> spacecraft_idr9r r r r'szSC 245 virtual channels:cSs g|]}|jjdkr|jj<02>qS)<01><><00>rBrDZvirtual_channel_idr9r r r r'"s <0C>zSC 82 virtual channels:cSs g|]}|jjdkr|jj<02>qS<00><01>RrFr9r r r r'.s <0C>zFirst 20 SC/VC pairs:cSsg|]}|jj|jjf<02>qSr rFr9r r r r':s<02><>zSC 82 VC 1 first headers:cSsg|]}|jjdkr|j<00>qSrGrCr9r r r r'Hs <00>
cSs(g|] }|jjdkr|jjdkr|<01>qS)rHr/rFr9r r r r'Ls  <0C>cSsg|] }|jj<01>qSr <00>rBZvirtual_channel_frame_countr9r r r r'Ts)<02> <00>r-r.r/z*Spacecraft 82 Virtual channel 1 frame lossz Lost framesz Frame numberz(SC 82 VC 1 first insert-zone timestamps:cSsg|]}t|jj<02><01>qSr )<03>hexr7r8r9r r r r'esz&SC 82 VC 1 insert-zone unknown values:cSsh|]}t|jj<02><01>qSr <00>rNr7<00>unknownr9r r r <00> <setcomp>jszmain.<locals>.<setcomp>rHcSsg|]}tj<01>|<01><01>qSr <00>r#r$r@r%r r r r'sscSsg|]
}|j<00>qSr <00>ZAPIDr%r r r r'xszSC 82 VC 1 APIDs:cs&i|]<1E><00><00>fdd<01>t<00><02><01>D<00><01>qS)csg|]\}}|j<00>kr|<02>qSr rS<00>r&<00>hr<00>r3r r r'}s
<EFBFBD><EFBFBD>#main.<locals>.<dictcomp>.<listcomp><3E><01>zip<69>r&)<02>sc82_vc1_packets<74>sc82_vc1_sp_headersrVr <00>
<dictcomp>|s
<02>
<08>zmain.<locals>.<dictcomp>cSs(g|] }|jjdkr|jjdkr|<01>qS<00>rE<00>rFr9r r r r'<00>s  <0C>cSsg|] }|jj<01>qSr rKr9r r r r'<00>sz+Spacecraft 245 Virtual channel 3 frame losszSC 245 VC 3 first headers:cSsg|]
}|j<00>qSr <00>rBr9r r r r'<00>scSs,g|]$\}}|jjdkr|jjdkr|<01>qSr^rF)r&rAr:r r r r'<00>s  <0C>zSC 245 VC 3 unique bytes 5-12:<3A>rLz hex(170):<3A><>zSC 245 VC 3 unique byte 12:z hex(138):<3A><>z SC 245 VC 3 unique bytes 13-end:<3A> z SC 245 VC 3 insert-zone unknown:cSs(g|] }|jjdkr|jjdkr|<01>qS)rEr/rFr9r r r r'<00>s  <0C>cSsg|] }|jj<01>qSr rKr9r r r r'<00>sz+Spacecraft 245 Virtual channel 1 frame losszSC 245 VC 1 first headers:cSsg|]
}|j<00>qSr r`r9r r r r'<00>s<00>.z Spacecraft 245 Virtual channel 1Z TimestampzVirtual channel frame countz'SC 245 VC 1 insert-zone unknown values:cSsh|]}t|jj<02><01>qSr rOr9r r r rQ<00>srET)r<cSsg|]}tj<01>|d<00><01>qS)rrRr%r r r r'<00>scSsg|]
}|j<00>qSr rSr%r r r r'<00>szSC 245 VC 1 APIDs:cs&i|]<1E><00><00>fdd<01>t<00><02><01>D<00><01>qS)csg|]\}}|j<00>kr|<02>qSr rSrTrVr r r'<00>s
<EFBFBD>rWrXrZ)<02>sc245_vc1_packets<74>sc245_vc1_sp_headersrVr r]<00>s
<02>
<08>iZint16rMz=APID 1280 Spacecraft 245 Virtual channel 1 bytes 0-12 (int16)zAOS frame timestampzRaw value (int16)cSs g|]}d|<01>d|d<00><00><04>qS<00><03>Bytes z and r/r <00>r&<00>jr r r r'
s<00>)<02>rMiRi<>cSs g|]}d|<01>d|d<00><00><04>qSrhr rjr r r r'si<00> <00>z>APID 1281 Spacecraft 245 Virtual channel 1 bytes 18-30 (int16)cSs g|]}d|<01>d|d<00><00><04>qSrhr rjr r r r''s<00><00>i<>iXcSs g|]}d|<01>d|d<00><00><04>qSrhr rjr r r r'0sz>APID 1281 Spacecraft 245 Virtual channel 1 bytes 30-36 (int16)cSs g|]}d|<01>d|d<00><00><04>qSrhr rjr r r r'8s<00>$cSs g|]}d|<01>d|d<00><00><04>qSrhr rjr r r r'@si<00>P<00>Zfloat64zAAPID 1288 Spacecraft 245 Virtual channel 1 bytes 80-104 (float64)zRaw value (float64)cSs g|]}d|<01>d|d<00><00><04>qS<00>ri<00>-<2D>r rjr r r r'\s<00>hrw)r/rl<00>sc s(g|] }d|<01>d|d<00>d<03><00>d<04><07>qS<00>rirvrwz minus degree z polynomialr rj<00><01>degr r r'vs<02>i<00>Bc Ss:g|]2}t<00>t<02>dd|ddd<04>dd<05><00>d<00><01>qS)z>QsrrpNrM)r5r6<00>structZunpackr%r r r r'<00>s<02>&<26>z?APID 1287 Spacecraft 245 Virtual channel 1 timestamp differencez,AOS frame timestamp - Space packet timestampz@APID 1287 Spacecraft 245 Virtual channel 1 bytes 66-90 (float64)zSpace Packet frame timestampcSs g|]}d|<01>d|d<00><00><04>qSrur rjr r r r'<00>s<00>Zz2020-07-31T03:00zSpace Packet timestampc s(g|] }d|<01>d|d<00>d<03><00>d<04><07>qSrzr rjr{r r r'<00>s<02>z.-z APID 2 byte 0)Zlabelz APID 3 byte 0z5APIDs 2 and 3 Spacecraft 245 Virtual channel 1 byte 0zRaw value (uint8)z APID 2 byte 2z APID 3 byte 2z5APIDs 2 and 3 Spacecraft 245 Virtual channel 1 byte 2i8i<>9<00>z APID 2 byte 4z APID 3 byte 4z5APIDs 2 and 3 Spacecraft 245 Virtual channel 1 byte 4z APID 2 byte 8z APID 3 byte 8z5APIDs 2 and 3 Spacecraft 245 Virtual channel 1 byte 8i<38>i<>i:z0APID 454 Spacecraft 245 Virtual channel 1 byte 0<>z:APID 454 Spacecraft 245 Virtual channel 1 bytes 4-7, 18-20cSsg|]}d|<01><00><02>qS)zByte r rjr r r r')si<>z4APID 462 Spacecraft 245 Virtual channel 1 bytes 0-14cSs g|]}d|<01>d|d<00><00><04>qSrhr rjr r r r'<srmiz6APID 1536 Spacecraft 245 Virtual channel 1 bytes 18-20z6APID 1536 Spacecraft 245 Virtual channel 1 bytes 20-22)0<>os<6F>chdir<69>DATA_DIRr"Zfromfile<6C>sizeZreshaperr2<00> collections<6E>Counterr)rrZplotZdiffrZylabelZxlabel<65>listr#Zextract_space_packetsr4rY<00>uniquerNr7rPr<Zgridr+ZviewZbyteswapr=Zlegend<6E>range<67>slice<63>copy<70>nanZargmaxZ timedelta64ZisnanZpolyfitZpolyval<61>whereZ
datetime64r<00>
OUTPUT_DIR)Z
frame_sizeZframesr;Zsc82_vc1ZfcZsc82_vc1_apidsZsc82_vc1_by_apidZ sc245_vc3Zsc245_vc3_framesZ sc245_vc1Zsc245_vc1_timestampsZsc245_vc1_apidsZsc245_vc1_by_apidZchannelsZ
timestampsZselrkryrZtimestamps_packetZt_diffZcutZseltZ channels2Z timestamps2Z channels3Z timestamps3r )r|rfrgr[r\r <00>main<69>sv
 <12><12><02><04><02> <02><04><02> 
<EFBFBD><04> <14><02>


<14> <0C> <02>
 <02> <02>


<08><04>  <02>





 <0C><10><02>
 <02>
 






 













2<02><06>  


(




<EFBFBD><04>
2<02><06> <06><04>  


 



<EFBFBD>(




<EFBFBD><04>    












  






, 


 





r<><00>__main__)r),<2C>__doc__<5F>sys<79>pathlibrZ PathlibPathr<68>r<00>__file__Zresolve<76>parentZ PROJECT_ROOTrr<00>strr<72>r~<00>environ<6F>
setdefaultZ
matplotlibZuseZmatplotlib.pyplotZpyplotrZrcParamsZnumpyr"Z scipy.signalZscipyZ constructZ Tianwen.ccsdsr#ZTianwen.tianwen1_tmr5r<>r<>r rr r+r4r<r=r<><00>__name__r r r r <00><module>sD 
 
  
3  y