محاسبه مختصات ماهواره از فایل SP3مدارات دقیق IGS
فایلهای SP3 دقیقترین داده مداری ماهوارههای GNSS را ارائه میدهند. در این مقاله ساختار فایل، نحوه خواندن، درونیابی لاگرانژ و استفاده عملی از این دادهها را بررسی میکنیم.
۱SP3 چیست؟
SP3 (Standard Product 3) فرمت استانداردی برای ذخیره مختصات دقیق ماهوارههای GNSS است. این فایلها توسط IGS (International GNSS Service) و مراکز تحلیل وابسته تولید میشوند.
بر خلاف افمریس پخشی که پارامترهای کپلری ارائه میدهد، فایل SP3 مستقیماً مختصات کارتزین (X, Y, Z) و تصحیح ساعت ماهواره را در اپوکهای مشخص (معمولاً هر ۱۵ دقیقه) ذخیره میکند.
انواع محصولات مداری IGS:
| محصول | دقت مدار | دقت ساعت | تاخیر | بازه زمانی |
|---|---|---|---|---|
| Ultra-rapid (predicted) | ~۵ سانتیمتر | ~۳ نانوثانیه | بلادرنگ | ۱۵ دقیقه |
| Ultra-rapid (observed) | ~۳ سانتیمتر | ~۱.۵ نانوثانیه | ۳–۹ ساعت | ۱۵ دقیقه |
| Rapid | ~۲.۵ سانتیمتر | ~۰.۱ نانوثانیه | ۱۷–۴۱ ساعت | ۱۵ دقیقه |
| Final | ~۲ سانتیمتر | ~۰.۱ نانوثانیه | ۱۲–۱۸ روز | ۱۵ دقیقه |
چرا SP3 دقیقتر از افمریس پخشی است؟
افمریس پخشی توسط بخش کنترل GPS با شبکه محدود ایستگاههای زمینی محاسبه و پیشبینی میشود. اما مدارات دقیق IGS از دادههای بیش از ۵۰۰ ایستگاه ردیابی جهانی و با پردازش پس از وقوع (Post-processing) محاسبه میشوند — بنابراین دقت آنها ۵۰ برابر بهتر است.
۲ساختار فایل SP3
فایل SP3 یک فایل متنی (ASCII) با ساختار ثابت است. نسخه فعلی SP3-d از تمام منظومههای GNSS پشتیبانی میکند. ساختار فایل شامل بخشهای زیر است:
نمونه فایل SP3 (هدر و اولین اپوک):
#dP2024 1 7 0 0 0.00000000 96 ORBIT IGb14 HLM IGS ## 2296 518400.00000000 900.00000000 60316 0.0000000000000 + 32 G01G02G03G04G05G06G07G08G09G10G11G12G13G14G15G16G17 + G18G19G20G21G22G23G24G25G26G27G28G29G30G31G32 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ++ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 0 0 %c G cc GPS ccc cccc cccc cccc cccc ccccc ccccc ccccc ccccc %f 1.2500000 1.025000000 0.00000000000 0.000000000000000 %i 0 0 0 0 0 0 0 0 0 /* IGS FINAL ORBIT COMBINATION FROM IGNAAC /* IGS = International GNSS Service /* Computed using 12 Analysis Center solutions /* * 2024 1 7 0 0 0.00000000 PG01 -11044.578312 -11717.015832 21620.942143 260.887523 PG02 15501.434825 -4523.175039 21190.685038 481.610574 PG03 12052.762653 22403.839972 7804.261313 -68.379814 PG12 -14867.283145 4238.112308 21568.198472 39.498721 ... * 2024 1 7 0 15 0.00000000 PG01 -12261.345127 -10429.876543 21142.567891 260.891234 ...
خط اول (#d)
نسخه فرمت (d)، نوع فایل (P=Position)، تاریخ شروع، تعداد اپوکها، سیستم مختصات (IGb14)، نوع مدار (HLM)، سازمان تولیدکننده
خط دوم (##)
هفته GPS، ثانیه از شروع هفته، بازه زمانی بین اپوکها (۹۰۰ ثانیه = ۱۵ دقیقه)، روز ژولین اصلاحشده
خطوط ماهواره (+)
تعداد ماهوارهها و لیست شناسه آنها. G01 = GPS PRN 01، R01 = GLONASS، E01 = Galileo، C01 = BeiDou
رکورد اپوک (*)
سال، ماه، روز، ساعت، دقیقه، ثانیه — مشخصکننده زمان اپوک
رکورد موقعیت (P)
شناسه ماهواره + مختصات X, Y, Z به کیلومتر + تصحیح ساعت به میکروثانیه
واحدهای مهم:
مختصات در SP3 به کیلومتر (نه متر) و ساعت به میکروثانیه ذخیره میشود. هنگام استفاده حتماً تبدیل واحد انجام دهید. مقدار 999999.999999 برای هر مولفه نشاندهنده داده ناموجود است.
۳خواندن فایل SP3
الگوریتم خواندن فایل SP3 ساده است — فایل خطبهخط خوانده میشود و بر اساس کاراکتر اول هر خط تفسیر میشود:
الگوریتم خواندن:
def read_sp3(filename, target_prn):
"""Read SP3 file and extract positions for a satellite."""
epochs = []
positions = [] # list of (x_km, y_km, z_km, clk_us)
current_epoch = None
with open(filename, 'r') as f:
for line in f:
# Skip header lines (start with #, +, %, /)
if line[0] in ('#', '+', '%', '/'):
continue
# Epoch line
if line[0] == '*':
# * 2024 1 7 0 0 0.00000000
parts = line.split()
year = int(parts[1])
month = int(parts[2])
day = int(parts[3])
hour = int(parts[4])
minute = int(parts[5])
sec = float(parts[6])
current_epoch = datetime(year, month, day,
hour, minute, int(sec))
continue
# Position line
if line[0] == 'P':
prn = line[1:4].strip() # e.g. "G12"
if prn != target_prn:
continue
x_km = float(line[4:18])
y_km = float(line[18:32])
z_km = float(line[32:46])
clk_us = float(line[46:60])
# Check for missing data
if abs(x_km) > 999999 or abs(clk_us) > 999999:
continue
epochs.append(current_epoch)
positions.append((x_km, y_km, z_km, clk_us))
return epochs, positionsنکات مهم در خواندن:
- فیلدها موقعیت ثابت (Fixed-width) دارند — از
split()استفاده نکنید، با اندیس استخراج کنید - مقدار
999999.999999یعنی داده وجود ندارد — باید فیلتر شود - ساعت ماهواره
999999.999999ممکن است با موقعیت معتبر همراه باشد - خط V (سرعت) اختیاری است و در بسیاری از فایلها وجود ندارد
- خط EOF پایان فایل را مشخص میکند
۴درونیابی لاگرانژ
فایل SP3 مختصات ماهواره را در بازههای ۱۵ دقیقهای ارائه میدهد. اما در پردازش GNSS معمولاً به مختصات ماهواره در لحظه دلخواه نیاز داریم. بنابراین باید از درونیابی (Interpolation) استفاده کنیم.
روش استاندارد درونیابی برای فایل SP3 استفاده از چندجملهای لاگرانژ (Lagrange Polynomial) است. برای موقعیت ماهواره، معمولاً از ۹ نقطه (درجه ۸) استفاده میشود.
فرمول درونیابی لاگرانژ:
هر مولفه بهطور مستقل درونیابی میشود.
پیادهسازی در شبهکد:
def lagrange_interpolation(t_points, y_points, t_target):
"""
Lagrange polynomial interpolation.
t_points: list of known times (length n)
y_points: list of known values (length n)
t_target: desired time
Returns: interpolated value at t_target
"""
n = len(t_points)
result = 0.0
for i in range(n):
# Compute Lagrange basis polynomial L_i(t)
Li = 1.0
for j in range(n):
if j != i:
Li *= (t_target - t_points[j]) / (t_points[i] - t_points[j])
result += y_points[i] * Li
return result
def interpolate_sp3(epochs, positions, target_time, n_points=9):
"""
Interpolate SP3 positions using Lagrange polynomial.
n_points: number of points to use (9 recommended)
"""
# Convert epochs to seconds from first epoch
t0 = epochs[0]
t_sec = [(e - t0).total_seconds() for e in epochs]
t_target = (target_time - t0).total_seconds()
# Find closest n_points centered on target_time
center_idx = min(range(len(t_sec)),
key=lambda i: abs(t_sec[i] - t_target))
half = n_points // 2
start = max(0, center_idx - half)
end = min(len(t_sec), start + n_points)
start = max(0, end - n_points)
t_sub = t_sec[start:end]
pos_sub = positions[start:end]
# Interpolate each coordinate independently
x = lagrange_interpolation(t_sub,
[p[0] for p in pos_sub], t_target)
y = lagrange_interpolation(t_sub,
[p[1] for p in pos_sub], t_target)
z = lagrange_interpolation(t_sub,
[p[2] for p in pos_sub], t_target)
clk = lagrange_interpolation(t_sub,
[p[3] for p in pos_sub], t_target)
return (x, y, z, clk)نکات مهم درونیابی:
- درجه ۸ (۹ نقطه): برای موقعیت ماهواره توصیه میشود. درجه بالاتر بهبود چندانی ندارد.
- ساعت ماهواره: میتوان از درجه پایینتر (۲–۳) استفاده کرد، اما بهتر است تعداد نقاط یکسان باشد.
- اثر لبه (Edge Effect): درونیابی در ابتدا و انتهای فایل دقت کمتری دارد. همیشه زمان هدف را در میانه نقاط انتخابی قرار دهید.
- GLONASS: بهدلیل مدار پایینتر و سرعت بیشتر، ممکن است به نقاط بیشتری نیاز داشته باشد.
- برونیابی (Extrapolation): هرگز از SP3 برای برونیابی استفاده نکنید — خطا بهسرعت افزایش مییابد.
۵مثال عددی
فرض کنید میخواهیم مختصات ماهواره GPS G12 را در ساعت 00:07:30 UTC از فایل SP3 محاسبه کنیم. فایل SP3 دادهها را در ساعتهای 00:00, 00:15, 00:30, ... دارد.
دادههای SP3 برای G12 (۹ اپوک مجاور):
Epoch (UTC) X (km) Y (km) Z (km) CLK (μs) 23:00:00 -15421.283145 3012.456308 21998.342472 39.412341 23:15:00 -15189.876234 3421.789012 21876.123456 39.435678 23:30:00 -14945.234567 3828.345678 21741.567890 39.458912 23:45:00 -14688.567890 4231.012345 21594.890123 39.482145 00:00:00 -14867.283145 4238.112308 21568.198472 39.498721 00:15:00 -14142.890123 5023.567890 21267.234567 39.528234 00:30:00 -13855.123456 5416.890123 21094.567890 39.551567 00:45:00 -13555.456789 5806.123456 20909.890123 39.574890 01:00:00 -13244.789012 6191.345678 20713.123456 39.598123 Target time: 00:07:30 (t = 450 s from 00:00:00)
محاسبه درونیابی لاگرانژ (فقط مولفه X نشان داده شده):
# 9 known times (seconds from 23:00:00):
t = [0, 900, 1800, 2700, 3600, 4500, 5400, 6300, 7200]
# X coordinates (km):
x = [-15421.28, -15189.88, -14945.23, -14688.57,
-14867.28, -14142.89, -13855.12, -13555.46, -13244.79]
# Target time: 00:07:30 = 3600 + 450 = 4050 s from 23:00
t_target = 4050
# Lagrange interpolation:
# L_0(4050) = (4050-900)(4050-1800)...(4050-7200) /
# (0-900)(0-1800)...(0-7200)
# ... (9 basis polynomials computed)
# Result:
X_interp ≈ -14508.156 km
Y_interp ≈ 4632.845 km
Z_interp ≈ 21419.712 km
CLK_interp ≈ 39.513 μsنتیجه درونیابی:
G12 at 00:07:30 UTC:
X = -14,508.156 km Y = 4,632.845 km Z = 21,419.712 km
Clock = 39.513 microseconds
دقت این مختصات حدود ۲–۳ سانتیمتر است (برای محصول Final IGS). مقایسه با افمریس پخشی اختلاف حدود ۰.۵–۱.۵ متر را نشان میدهد.
۶منابع و نکات عملی
مراکز اصلی توزیع فایلهای SP3 و نکات عملی استفاده از آنها:
مراکز داده IGS:
CDDIS (NASA)
مرکز اصلی داده IGS — cddis.nasa.gov — نیاز به ثبتنام رایگان (Earthdata Login) دارد. پوشش کامل تمام محصولات.
BKG (آلمان)
igs.bkg.bund.de — دسترسی آزاد بدون ثبتنام. آینه کامل محصولات IGS. سرعت خوب برای کاربران اروپا و آسیا.
IGN (فرانسه)
igs.ign.fr — دسترسی آزاد. آینه محصولات IGS و محصولات مراکز تحلیل.
نامگذاری فایلها (فرمت جدید IGS):
# فرمت جدید (long filename): # AAA0OPSTYP_YYYYDDDHHMM_LEN_INT_CNT.SP3.gz # مثال: IGS0OPSFIN_20240070000_01D_15M_ORB.SP3.gz │ │ │ │ │ │ │ │ │ │ │ │ │ └─ نوع: ORB=orbit │ │ │ │ │ └─ بازه: 15M=15 دقیقه │ │ │ │ └─ مدت: 01D=1 روز │ │ │ └─ تاریخ: 2024, day 007, 00:00 │ │ └─ نوع: FIN=Final, RAP=Rapid, ULT=Ultra-rapid │ └─ Operation center └─ Agency: IGS, COD, GFZ, JPL, ... # محصولات مهم مراکز تحلیل: COD0OPSFIN → CODE (Switzerland) GFZ0OPSFIN → GFZ Potsdam (Germany) JPL0OPSFIN → JPL/NASA (USA) ESA0OPSFIN → ESA/ESOC (Europe) IGS0OPSFIN → IGS Combined (بهترین دقت)
انتخاب محصول مناسب:
| سناریو | محصول توصیهشده | دلیل |
|---|---|---|
| پردازش نهایی پروژه ژئودتیک | IGS Final | بالاترین دقت — تاخیر مهم نیست |
| پسپردازش روزانه | IGS Rapid | دقت عالی — حداکثر ۲ روز تاخیر |
| PPP بلادرنگ یا نیمهبلادرنگ | Ultra-rapid (predicted) | در دسترس فوری — دقت ~۵ سانتیمتر |
نرمافزارهای پردازش:
RTKLib
رایگان و متنباز — پشتیبانی کامل از SP3 — مناسب برای PPP و پسپردازش
Bernese GNSS
نرمافزار علمی دانشگاه برن — استاندارد طلایی پردازش ژئودتیک
GAMIT/GLOBK
MIT — تحلیل شبکههای ژئودتیک و تکتونیک
جمعبندی:
فایلهای SP3 دقیقترین منبع مداری ماهوارههای GNSS هستند. با درونیابی لاگرانژ ۹ نقطهای، میتوان مختصات ماهواره را در هر لحظه دلخواه با دقت ۲–۳ سانتیمتر محاسبه کرد. برای پسپردازش PPP و تحقیقات ژئودتیک، استفاده از محصول IGS Final توصیه میشود.
دانلود منابع
مطالب مرتبط
IMU و جبران زاویه انحراف ژالون
نقشهبرداری بدون نیاز به تراز کردن ژالون — با استفاده از سنسورهای اینرسی، موقعیت نوک ژالون حتی در حالت کج محاسبه میشود.
موقعیتیابی تصویری
ترکیب دوربین و GNSS برای تعیین موقعیت از روی تصاویر — کاربرد در مناطقی که سیگنال ماهوارهای ضعیف است.
پیادهسازی واقعیت افزوده
مشاهده نقاط طرح روی صفحهنمایش در محیط واقعی — سرعت و دقت بالاتر در پیادهسازی پروژههای عمرانی.
آیا این مطلب برای شما مفید بود؟