feat(gps): add timer-based assisted reacquisition

Remove the fixed pseudorange start offset, preserve per-PRN navigation assistance across RF loss and power cycles, and seed coherent navigation measurement phase on reacquisition. Add full LNAV almanac visibility scheduling, power-safe QSPI journaling, RF-domain reset isolation, and PPS Gray CDC hardening with Linux, sanitizer, RTL, and end-to-end coverage.
This commit is contained in:
onur
2026-08-04 02:52:35 +03:00
parent 347e1c671d
commit 30179df8e6
69 changed files with 6162 additions and 247 deletions
+18 -18
View File
@@ -300,10 +300,10 @@ def page_executive(report: Report) -> None:
0.07,
y,
"Bu projede konum WLS'i doğru çalışırken elde edilen dördüncü state, doğrudan "
"125 MHz receiver clock fazı değildir. Pseudorange'lar her epoch'ta minimum "
"ABS_SAMPLE ile normalize edildiği için RF sayacının mutlak fazı observation'dan "
"çıkar. WLS bias; 68.802 ms sentetik datum ile minimum kanalın gözlenen uçuş "
"süresi arasındaki ortak farkı taşır.",
"125 MHz receiver clock fazı değildir. Pseudorange'lar her epoch'ta corrected RF "
"sample ve satellite transmit-time farklarıyla kurulduğu için sayacın mutlak fazı "
"observation'dan çıkar. WLS bias, referans kanalın negatif uçuş süresini ve "
"satellite clock correction'ini taşıyan göreli datumdur.",
width=100,
fontsize=10.2,
)
@@ -556,7 +556,7 @@ def page_project_map(report: Report) -> None:
(0.77, 0.54, 0.17, 0.10, "Tracking ISR", "event queue +\nshadow counter", LIGHT, NAVY),
(0.54, 0.54, 0.18, 0.10, "Linked-list state", "TOW owner\nsequence + sample", LIGHT, NAVY),
(0.28, 0.54, 0.20, 0.10, "Coherent snapshot", "25 ms window\nmodulo unwrap", PALE_GREEN, GREEN),
(0.06, 0.54, 0.17, 0.10, "Pseudorange", "minimum +\n68.802 ms", PALE_GREEN, GREEN),
(0.06, 0.54, 0.17, 0.10, "Pseudorange", "ΔS_RF −\nΔT transmit", PALE_GREEN, GREEN),
(0.06, 0.34, 0.17, 0.10, "Satellite model", "TOW + 180 ms\nephemeris/clock", PALE_BLUE, BLUE),
(0.32, 0.34, 0.23, 0.10, "Weighted LS", "[X Y Z b]\niono + tropo + URA/el", PALE_GREEN, GREEN),
(0.64, 0.34, 0.30, 0.10, "Bugünkü çıkış", "position log + static last_solution[4]\nclock bias dışarı taşınmıyor", "#FBEAEA", RED),
@@ -651,14 +651,14 @@ def page_pseudorange(report: Report) -> None:
y = 0.84
ax.text(0.08, y, "1 Fractional RF sample düzeltmesi", fontsize=11, color=NAVY, weight="bold")
y = report.equation(ax, y - 0.025, r"A_i^{corr}=A_i^{raw}-\frac{REM_i}{1.023\times10^6}")
ax.text(0.08, y, "2 Wrap-safe coherent unwrap ve minimum seçimi", fontsize=11, color=NAVY, weight="bold")
y = report.equation(ax, y - 0.025, r"A_{min}=\min_i\left(A_i^{corr}\right)")
ax.text(0.08, y, "3 C kodundaki sentetik propagation datum'u", fontsize=11, color=NAVY, weight="bold")
ax.text(0.08, y, "2 Corrected RF sample ve transmit-time farkı", fontsize=11, color=NAVY, weight="bold")
y = report.equation(ax, y - 0.025, r"\Delta t_i=\frac{S_i-S_{ref}}{16.367981\,MHz}-(T_{tx,i}-T_{tx,ref})")
ax.text(0.08, y, "3 Offset-free göreli pseudorange datum'u", fontsize=11, color=NAVY, weight="bold")
y = report.equation(
ax,
y - 0.025,
r"P'_i=c\left[\frac{A_i^{corr}-A_{min}}{16.368\,MHz}+S\right]+c\,\delta t_{SV,i}",
"S = 68.802 ms; gps_ip.c içinde ms formunda hesaplanır",
r"P'_i=c\left[\Delta t_i+\delta t_{SV,i}\right]",
"Free-running counter başlangıcı ve ortak uzun-dönem drift farkta yok olur",
face=PALE_ORANGE,
)
report.box(
@@ -667,8 +667,8 @@ def page_pseudorange(report: Report) -> None:
0.17,
0.40,
0.14,
"Minimum neden var?",
"Raw ABS_SAMPLE'ın receiver açılışına bağlı büyük ortak sayısını çıkarır. Uydular arası arrival-time farkları korunur; konum geometrisi bu farklarda bulunur.",
"Referans neden var?",
"RF counter'ın receiver açılışına bağlı ortak sayısını wrap-safe çıkarır. Uydular arası arrival/transmit-time farkları korunur; konum geometrisi bu farklarda bulunur.",
face=PALE_BLUE,
)
report.box(
@@ -677,8 +677,8 @@ def page_pseudorange(report: Report) -> None:
0.17,
0.40,
0.14,
"68.802 ms neden var?",
"Göreli range'leri fiziksel 20–26 bin km büyüklüğüne taşır ve WLS common bias'ı sıfıra yakın tutar. Yeni bilgi eklemez; datum seçer.",
"Sabit offset neden yok?",
"WLS dördüncü state göreli datumun büyük ortak bias'ını zaten çözer. Fiziksel konum için kalibre edilmiş nominal uçuş süresi gerekmez.",
face=PALE_GREEN,
edge="#9BC9AF",
title_color=GREEN,
@@ -1136,7 +1136,7 @@ def page_sim_method(report: Report) -> None:
("Navigation", "Ortak 20 ms transmit-bit epoch; NAV_SOLVE_TIMER=10 → 200 ms"),
("Satellite", "Sentetik gerçekçi ECEF/az-el geometrisi, satellite clock, path delay"),
("Corrections", "Earth rotation, Klobuchar, aktif C troposfer modeli, URA/elevation noise"),
("Firmware", "Modulo unwrap, minimum + 68.802 ms, clock correction, cached four-state WLS"),
("Firmware", "Raw-counter/transmit-time difference, clock correction, cached four-state WLS"),
("Latency", "Satellite arrival span, WLS compute, scheduler stall, APB jitter"),
("PPS", "125 MHz raw oscillator, coarse mapping, timestamped/untagged PI, 8 ns edge grid"),
]
@@ -1264,7 +1264,7 @@ def page_verification(report: Report) -> None:
fig, ax = report.new_page("Doğrulama matrisi ve beklenen sonuç")
tests = [
("ABS common +5 ms", "XYZ aynı; normalized b aynı", "Observation common phase iptalini kanıtlar"),
("STARTOFFSET +1 ms", "XYZ aynı; b +c×1 ms", "Datum dönüşüm işaretini kanıtlar"),
("RF counter common shift", "XYZ ve göreli b aynı", "RF counter origin iptalini kanıtlar"),
("32-bit ABS wrap", "Pseudorange süreklidir", "Signed modulo unwrap"),
("Reference SVID değişimi", "Raw b step; mapped GPS time continuous", "Min datum ownership"),
("APB +50 ms delay", "Timestamped PPS fazı değişmez", "Epoch association"),
@@ -1340,7 +1340,7 @@ def page_conclusion(report: Report) -> None:
("1", "Raw clocks", "16.368 MHz measurement + 125 MHz monotonic counter"),
("2", "Paired capture", "ABS / REM / C125 / sequence aynı event"),
("3", "Coherent WLS", "minimum datum + all-satellite [XYZ b]"),
("4", "GPS receive time", "T_TX(epoch-aligned) + 68.802 ms − b/c"),
("4", "GPS receive time", "T_TX(epoch-aligned) − b/c"),
("5", "Atomic mapping", "(C125,k, TGPS,k, seq) shadow + commit"),
("6", "Disciplined PPS", "immutable raw counter + low-bandwidth PI accumulator"),
]
@@ -1414,7 +1414,7 @@ def generate(output_pdf: Path) -> None:
report,
"İlk HOW neden PPS receive-now değildir?",
required_plots[4],
"Sentetik acquisition/subframe Monte Carlo: mevcut hardware delivery, dokuzuncu takip eden bit nedeniyle HOW sınırından 180 ms ve signal flight time kadar sonradır. HOW +180 ms +68.802 ms kaba yaklaşım bırakır; WLS flight-time + paired timestamp doğru handover'dır.",
"Sentetik acquisition/subframe Monte Carlo: mevcut hardware delivery, dokuzuncu takip eden bit nedeniyle HOW sınırından 180 ms ve signal flight time kadar sonradır. HOW +180 ms tek başına uçuş süresi kadar hata bırakır; offset-free WLS flight-time + paired timestamp doğru handover'dır.",
)
plot_page(
report,