Fix GPS nav-solve phase seeding for cold PVT

This commit is contained in:
Codex
2026-08-04 15:52:36 +03:00
parent 28b55fdfb6
commit dce1dd5ea9
7 changed files with 164 additions and 37 deletions
+33 -20
View File
@@ -923,7 +923,8 @@ yollarini calistirir.
- Firmware nav bit interrupt'lari ile subframe verisini surekli toplar.
- Bir tracking kanali ancak IODC/IODE degerleri eslesen subframe 1, 2 ve 3 seti atomik olarak commit edildikten sonra navigation-ready olur. Subframe 4 ve 5 ilk fix'i bloke etmez; page 18 iyonosfer/UTC ve almanak verisi arka planda toplanmaya devam eder.
- En az 4 satellite icin tutarli ephemeris commit edilince nav-bit snapshot'i yalniz ephemeris uygunlugunu ve kullanilacak kanallari belirler; bu snapshot'tan pozisyon hesaplanmaz.
- Tutarlı ephemerisi hazir olan tracking kanallarinda nav-solve akisi etkinlestirilir:
- Tutarlı ephemerisi hazir olan ve HOW/sample anchor'indan hardware phase seed'i
tamamlanmis tracking kanallarinda nav-solve akisi etkinlestirilir:
- nav bits interrupt/flag acik kalir,
- `NAV_SOLVE_INTR_EN=1`,
- `NAV_SOLVE_FLAG_EN=1`.
@@ -945,10 +946,12 @@ epoch'lara koyar. Coalescent snapshot ayni receiver zamanina ait olcumler ister;
farkli epoch'lari yalniz software interrupt zamanina bakarak birlestirmek
pseudorange ve position scatter hatasi yaratir.
Cached reacquisition yolu bu nedenle su sirayi izler:
HOW-anchor phase seed yolu bu nedenle hem cold ephemeris decode sonrasinda hem
cached reacquisition sonrasinda su sirayi izler:
1. Fresh ephemeris ile birlikte saklanan week-qualified HOW TOW, corrected/raw
RF sample ve CPU systick anchor'i yeni tracking kanalina restore edilir.
1. Cold yolda parity-valid live HOW TOW, corrected/raw RF sample ve CPU systick
anchor'i commit edilir. Cached yolda ayni bilgiler yeni tracking kanalina
restore edilir.
2. Background software kopyasi yerine channel'in en yeni atomik 20 ms hardware
measurement mailbox'i okunur; PRN, valid ve lock alanlari dogrulanir.
3. Anchor, bu measurement'in GPS zamanina tasinir ve global bit numarasi ile
@@ -963,9 +966,10 @@ phase = global_bit mod GPS_NAV_SOLVE_TIMER_TICKS
yazilir. RTL bu yazma darbesiyle `IDLE` durumundan dogrudan `COUNT` durumuna
gecer. Yazma sirasinda mailbox sequence ilerlemisse interrupt acilmaz; yeni
mailbox ile sonraki background turunda yeniden seed edilir.
5. Stable seed sonrasinda nav-solve flag ve interrupt acilir. Her channel'in
lokal counter'i artik ayni global GPS bit numarasinin modulo-N fazini
tasidigi icin sonraki wrap darbeleri ayni coalescent epoch'ta olusur.
5. Stable seed sonrasinda nav-solve flag ve interrupt acilir ve tracking node
`gps_nav_phase_seeded=true` olur. Her channel'in lokal counter'i artik ayni
global GPS bit numarasinin modulo-N fazini tasidigi icin sonraki wrap
darbeleri ayni coalescent epoch'ta olusur.
Bu register ephemeris cache'in yerine gecmez ve TOW uretmez; cache'deki zaman
anchor'ini RTL'nin periodic measurement fazina uygular. Epoch assembler yine
@@ -975,15 +979,16 @@ basina hatali kanallari zorla ayni solution'a sokmaz.
Cold start'ta fresh flash assistance da yoksa RAM cache ve valid HOW/sample
anchor olmadigi icin phase tahmin edilmez. Orijinal parity-valid LNAV/HOW yolu
kullanilir ve SF1/SF2/SF3 ephemerisi decode edilir. Fresh flash ephemerisi
varsa ilk live subframe zaman/issue kontrolunden sonra orbit restore edilir,
fakat power-cycle oncesi HOW/sample anchor yine kullanilmaz. RF sample
counter'in resetlenmesi veya RF clock'un
durmasi halinde CPU systick ile RF elapsed-time kontrolu uyusmaz; ephemeris
cache korunur fakat unsafe phase seed reddedilir ve en fazla bir yeni HOW
beklenerek guvenli hizalama yapilir. `GPS_NAV_SOLVE_TIMER_TICKS`, hem 300-bit
subframe'i hem 30240000-bit GPS haftasini tam bolecek sekilde compile-time'da
kontrol edildigi icin week rollover da ortak fazi bozmaz.
kullanilir, SF1/SF2/SF3 ephemerisi decode edilir ve ayni live HOW/sample
anchor'i ile `NAV_SOLVE_PHASE` seed edilir. Fresh flash ephemerisi varsa ilk
live subframe zaman/issue kontrolunden sonra orbit restore edilir, fakat
power-cycle oncesi HOW/sample anchor yine kullanilmaz. RF sample counter'in
resetlenmesi veya RF clock'un durmasi halinde CPU systick ile RF elapsed-time
kontrolu uyusmaz; ephemeris cache korunur fakat unsafe phase seed reddedilir ve
en fazla bir yeni HOW beklenerek guvenli hizalama yapilir.
`GPS_NAV_SOLVE_TIMER_TICKS`, hem 300-bit subframe'i hem 30240000-bit GPS
haftasini tam bolecek sekilde compile-time'da kontrol edildigi icin week
rollover da ortak fazi bozmaz.
- Ilk pozisyon dahil butun pozisyon hesaplari, kanallardan senkron nav-solve tick ve `ABS_SAMPLE` geldikten sonra olusturulan coherent nav-solve snapshot'i ile yapilir.
- Nav-bit ve nav-solve handler'lari canli ephemeris deposunu ortak kullansa da her kabul edilen nav-solve event'i corrected `ABS_SAMPLE`, TOW ve o anda commit edilmis ephemerisin tam kopyasini aktif epoch snapshot'ina birlikte yazar. WLS daha sonra canli node listesinden ephemeris okumaz; araya giren nav-bit interrupt'i eski olcumle yeni ephemerisi karistiramaz.
@@ -994,9 +999,9 @@ kontrol edildigi icin week rollover da ortak fazi bozmaz.
- Subframe 1 `toc` alani parity bitleri disarida birakilarak 16 bit okunur ve `2^4` ile olceklenir.
- Subframe 4 page 18 henuz alinmadiysa iyonosfer duzeltmesi uygulanmaz. Page 18 hazir oldugunda her navigation solve tek bir `ionoutc` kopyasi kullanir.
- Klobuchar gecikmesi WLS'nin receiver ECEF, azimut ve elevasyon hesabindan uretilir. Ilk unseeded iteration iyonosfersizdir; yaklasik receiver konumu olustuktan sonraki iteration'larda gecikme gozlenen pseudorange'dan cikarilir.
- Bundan sonra periyodik pozisyon hesaplamasi nav-solve interrupt'lari ile tetiklenir. RTL cold/HOW yolunda `subframe_ready`, cached reacquisition yolunda ise `NAV_SOLVE_PHASE` write pulse'u sonrasinda COUNT durumuna girer ve `NAV_SOLVE_TIMER=N` icin N adet navigation `bit_valid` darbesi sayar. Her navigation biti 20 ms oldugu icin periyot `N * 20 ms`'dir; firmware `GPS_NAV_SOLVE_TIMER_TICKS` build ayarini `gps_startup_initialization()` fonksiyonuna verir.
- Bu siralama onemlidir: cold/HOW yolunda RTL `nav_solve_timer` sayaci `NAV_SOLVE_EN` ve ilk gecerli `subframe_ready` ile baslar. `NAV_SOLVE_EN` nav-bit asamasinda acik tutulur; tutarli subframe 1..3 ephemerisi commit edilene kadar yalniz nav-solve interrupt/flag kapali kalir. Cached yol ayni COUNT durumunu explicit global-bit phase ile baslatir. Timer COUNT durumuna girdikten sonra sonraki subframe darbeleri sayaci sifirlamaz veya yeniden fazlamaz.
- Tracking kanallari farkli zamanlarda lock olabilir ve ilk gecerli subframe'lerini 6 saniyenin farkli katlarinda gorebilir. Timer bu nedenle ilk subframe'in HOW alanindaki 17-bit Z-count degerini kullanarak `Z_COUNT * 300 mod NAV_SOLVE_TIMER` baslangic fazini hesaplar. Hesap ALIGN durumunda 26 PCLK cevriminde ard arda modulo ile yapilir; 20 ms'lik ilk navigation bitinden cok once tamamlanir. RTL ayni GPS haftasi icinde keyfi pozitif `N` degerlerini hizalayabilir; firmware hem subframe/HOW hem week rollover boyunca ortak fazi korumak icin `300 mod N == 0` ve `30240000 mod N == 0` kosullarini compile-time'da zorunlu tutar. Ornegin `N=10`, `N=25`, `N=50`, `N=75`, `N=100`, `N=150` ve `N=300` gecerlidir; kosullari saglamayan build acik bir `#error` ile durur.
- Bundan sonra periyodik pozisyon hesaplamasi nav-solve interrupt'lari ile tetiklenir. Current internal-timer RTL'de cold ve cached yollarin ikisi de `NAV_SOLVE_PHASE` write pulse'u sonrasinda ortak global-bit fazina hizalanir; yalniz `NAV_SOLVE_INTR_EN` acmak timer'lari hizalamaz. `NAV_SOLVE_TIMER=N` icin N adet navigation `bit_valid` darbesi sayilir. Her navigation biti 20 ms oldugu icin periyot `N * 20 ms`'dir; firmware `GPS_NAV_SOLVE_TIMER_TICKS` build ayarini `gps_startup_initialization()` fonksiyonuna verir.
- Bu siralama onemlidir: `NAV_SOLVE_EN` nav-bit asamasinda acik tutulabilir, fakat tutarli subframe 1..3 ephemerisi ve hardware phase seed tamamlanmadan kanal navigation-ready sayilmaz. Stable seed sonrasinda nav-solve interrupt/flag acilir. Timer COUNT durumuna girdikten sonra sonraki subframe darbeleri sayaci sifirlamaz veya yeniden fazlamaz.
- Tracking kanallari farkli zamanlarda lock olabilir ve ilk gecerli subframe'lerini 6 saniyenin farkli katlarinda gorebilir. Bu nedenle hepsini counter zero'dan baslatmak farkli fiziksel epoch'larda interrupt uretir. Firmware her kanali live/cached HOW anchor'i ile en yeni 20 ms measurement mailbox'ina tasir ve `round(TOW / 0.020) mod NAV_SOLVE_TIMER` fazini yazar. Firmware hem subframe/HOW hem week rollover boyunca ortak fazi korumak icin `300 mod N == 0` ve `30240000 mod N == 0` kosullarini compile-time'da zorunlu tutar. Ornegin `N=10`, `N=25`, `N=50`, `N=75`, `N=100`, `N=150` ve `N=300` gecerlidir; kosullari saglamayan build acik bir `#error` ile durur.
- Initial position sonrasinda subframe'lerini tamamlayan yeni tracking kanallarinda da nav bits acik tutularak nav-solve otomatik etkinlestirilir.
- Coherence kontrolu sadece software systick ile yapilmaz; periodic snapshot icin tracking node'da saklanan nav-solve interrupt sonrasi raw `ABS_SAMPLE` kullanilir. `GPS_NAV_ABS_SAMPLE_SYNC_WINDOW_MS=25` oldugu icin 4 satellite measurement'i 25 ms'den fazla ayriksa navigation solve calistirilmaz. Bu pencere interrupt skew'den cok uydu path delay farkini kapsamak icindir: 20 ms yaklasik 6000 km, 25 ms yaklasik 7500 km pseudorange farkina denk gelir. 25 ms, dusuk-elevation uydu geometrisi ve tracking jitter icin pay birakir ama 50 ms kadar gevsek degildir.
- Interrupt'lar epoch'a GPS TOW ile degil, butun kanallarda ortak olan 64-bit PPS capture counter ile atanir. Ilk olcum sabit expected maskeyi ve 30 ms bounded holdoff'u baslatir. 25 ms pencereye giren kanallar ayni fiziksel epoch'a katilir; yarim nav periyodundan uzaktaki eski/yeni capture'lar stale veya yeni epoch olarak siniflanir. Boylece bozuk bir gelecek HOW degeri epoch assembler'i kilitleyemez.
@@ -1222,7 +1227,15 @@ olarak yayinlanir.
- `POSTPONE_TOW=0.180` mevcut RTL'nin dokuzuncu takip eden navigation bitinde
yaptigi teslimi duzeltir. `satpos()` ve PPS receive-time anchor bu degeri
tam bir kez ve ayni firmware surumunde kullanir.
- Ilk nav-solve interrupt'i geldiginde o anda allocated, hardware busy ve nav-solve interrupt'i etkin olan kanallar epoch'un sabit bekleme maskesine alinir. Unlock interrupt'i gelen kanal artik tracked olmadigi icin bekleme maskesinden cikarilir; epoch ortasinda navigation-ready olan yeni kanal ise aktif maskeyi buyutmez ve sonraki epoch'tan itibaren beklenir. Kalan beklenen kanallarin tamami gelirse snapshot son interrupt'ta hemen yayinlanir. 30 ms holdoff dolarsa veya daha yeni fiziksel epoch baslarsa eksik eski epoch WLS calistirilmadan discard edilir; eski ve yeni olcumler birlestirilmez.
- Ilk nav-solve interrupt'i geldiginde o anda allocated, hardware busy, lock'lu,
ephemeris-valid, measurement-fresh ve phase-seeded kanallar epoch'un sabit
bekleme maskesine alinir. Unlock interrupt'i gelen kanal artik tracked
olmadigi icin bekleme maskesinden cikarilir; epoch ortasinda
navigation-ready olan yeni kanal ise aktif maskeyi buyutmez ve sonraki
epoch'tan itibaren beklenir. Kalan beklenen kanallarin tamami gelirse
snapshot son interrupt'ta hemen yayinlanir. 30 ms holdoff dolarsa veya daha
yeni fiziksel epoch baslarsa eksik eski epoch WLS calistirilmadan discard
edilir; eski ve yeni olcumler birlestirilmez.
- Interrupt bekleme maskesi tamamlandiktan sonra frozen kanallarin tumu ortak TOW/`ABS_SAMPLE` kumesinde degilse epoch reddedilir. Selector'in buldugu daha kucuk alt kume yalniz diagnostic bilgidir ve WLS girdisi olamaz.
- Dort uydu 3D konum + receiver clock bias icin minimum ve yeterlidir. Bu durumda
`dof=N-4=0` oldugu icin WLS konumu publish edilir fakat residual chi-square