Integrate asynchronous GPS IMU fusion
This commit is contained in:
@@ -2,25 +2,87 @@
|
||||
|
||||
Bu notlar GPS bare-metal yaziliminin VCU118 Rocket SoC portu ve interrupt debug sureci icin yazildi.
|
||||
|
||||
## Uygulama akisi ve dosya sinirlari
|
||||
|
||||
Firmware giris noktasi [gps_system.c](gps_system.c)'dir. `main()` surucu veya
|
||||
ESKF matematigi icermez; fakat sistemlerin nasil baglandigini acikca gosterir.
|
||||
ESKF enable/disable, GPS WLS sonucu, timestamp'li IMU girdisi, GPS'in fusion
|
||||
olcumune donusumu ve ham/duzeltilmis lat-lon bu dosyada gorunur.
|
||||
Main'in GPS/IMU/fusion arasinda tasidigi mesajlar ve yasam-dongusu bayraklari
|
||||
`header/gps_system.h` icindeki `gps_system_state_t` tipindedir; uygulama veri
|
||||
tipleri giris noktasi C dosyasinda tekrar tanimlanmaz.
|
||||
|
||||
```text
|
||||
gps_system.c
|
||||
-> initialize GPS, IMU and optional ESKF
|
||||
-> wfi
|
||||
-> timestamped IMU queue -> navigation_fusion prediction
|
||||
-> GPS events -> coherent WLS -> gps_nav_solution_t
|
||||
-> valid GPS -> fusion_gps_measurement_t -> navigation_fusion update
|
||||
-> navigation_fusion_output_t -> corrected lat/lon publish
|
||||
```
|
||||
|
||||
Kaynak ve public header agaci ayni modul sinirlarini izler:
|
||||
|
||||
```text
|
||||
header/ + src/
|
||||
gps/ acquisition, tracking, nav epoch, WLS ve GPS interrupt state
|
||||
imu/ sensor secimi, kalibrasyon ve ortak imu_sample_t yonetimi
|
||||
drivers/imu/ yalniz cihaza ozel SPI/register/INT1 kodu
|
||||
fusion/ ESKF, motion/ZUPT, NIS ve delayed-measurement replay
|
||||
adapters/ GPS->fusion ve sensor-profile->fusion donusumleri
|
||||
```
|
||||
|
||||
UART konum/status formatlamasi `adapters/gps_system_uart` icindedir; bu sayede
|
||||
`gps_system.c` telemetry format string'leriyle sismez. Buna karsilik GPS WLS
|
||||
sonucunun fusion olcumune cevrilip ESKF'ye teslim edilmesi bilincli olarak
|
||||
`main()` icinde gorunur kalir.
|
||||
|
||||
GPS kaynaklari IMU veya ESKF header'i include etmez; IMU suruculeri de
|
||||
GPS/fusion header'i include etmez. Ortak trap/PLIC dispatcher harici bir IRQ
|
||||
numarasi ile callback kabul eder. `BSP_PMOD_IRQ -> imu_sensor_irq_handler`
|
||||
baglantisini GPS icinde hard-code etmek yerine `main`, GPS init'inden sonra ve
|
||||
IMU start'indan once kaydeder. GPS ve IMU girdileri yalniz `gps_system.c`
|
||||
uzerinden `navigation_fusion` API'sine verilir; tip donusumleri `adapters/`
|
||||
sinirinda kalir.
|
||||
|
||||
ESKF'nin public girisi `fusion/navigation_fusion.h`, sensor yonetiminin public
|
||||
girisi `imu/imu_sensor.h`, GPS alicisinin public girisi `gps/gps_receiver.h`dir.
|
||||
Yeni sensor eklemek icin yeni bir `drivers/imu` backend'i ve sensor profil
|
||||
adapter'i eklenir; GPS veya ESKF cekirdegi degistirilmez.
|
||||
|
||||
ISR icinde WLS veya ESKF calismaz. IMU ISR'i ornegi olcum aninda timestamp'ler
|
||||
ve raw kuyruga koyar. GPS ISR'leri acquisition/tracking olaylarini kaydeder.
|
||||
`wfi` sonrasi foreground bu kuyruklari tuketir. WLS sirasinda yeni IMU
|
||||
interrupt'lari gelebilecegi icin IMU kuyrugu WLS'den hem once hem sonra drain
|
||||
edilir; GPS update'i WLS bitis zamaninda degil capture epoch'unda uygulanir.
|
||||
|
||||
## Generic IMU Mimarisi (TDK ve ST)
|
||||
|
||||
GPS/ESKF artik dogrudan bir sensor surucusune bagli degildir. Veri yolu:
|
||||
|
||||
```text
|
||||
TDK ICM42688 -----\
|
||||
-> imu_sensor -> imu_calibration -> fusion_imu_measurement -> motion detector + ESKF
|
||||
ST LSM6DSOX ------/
|
||||
-> imu_sensor -> imu_calibration -> imu_sample_t
|
||||
ST LSM6DSOX ------/ |
|
||||
v
|
||||
GPS receiver -> WLS -> gps_nav_solution_t -> GPS adapter -> navigation_fusion
|
||||
|
|
||||
v
|
||||
motion/ZUPT + ESKF -> fused LLH
|
||||
```
|
||||
|
||||
- `src/tdk_icm42688.c`: TDK ICM42688'e ozel SPI, register, interrupt ve
|
||||
- `src/drivers/imu/tdk_icm42688.c`: TDK ICM42688'e ozel SPI, register, interrupt ve
|
||||
ham-veri donusumu.
|
||||
- `src/st_lsm6dsox.c`: STEVAL-MKI217V1 uzerindeki ST LSM6DSOX'e ozel SPI,
|
||||
- `src/drivers/imu/st_lsm6dsox.c`: STEVAL-MKI217V1 uzerindeki ST LSM6DSOX'e ozel SPI,
|
||||
register, INT1 data-ready interrupt ve ham-veri donusumu.
|
||||
- `src/imu_sensor.c`: ortak init/start/stop/IRQ/service/measurement arayuzu.
|
||||
- `src/imu_calibration.c`: markadan bagimsiz bias, 3x3 scale/cross-axis/mounting
|
||||
- `src/imu/imu_sensor.c`: ortak init/start/stop/IRQ/service/measurement arayuzu.
|
||||
- `src/imu/imu_calibration.c`: markadan bagimsiz bias, 3x3 scale/cross-axis/mounting
|
||||
donusumu ve opsiyonel sicaklik katsayisi.
|
||||
- `fusion_measurement.h`, motion detector ve ESKF yalniz SI birimindeki ortak
|
||||
mesaji gorur; aktif sensorun markasini bilmez.
|
||||
- `header/imu/imu_sample.h`: driver ve IMU yonetimi ile fusion arasindaki
|
||||
sensor-markasindan bagimsiz SI mesaj sozlesmesi.
|
||||
- `src/adapters/imu_fusion_profile.c`: aktif sensorun karakteristigini ESKF
|
||||
process-noise/kalibrasyon esiklerine cevirir.
|
||||
|
||||
Firmware isletim sistemi kullanmaz. Yeni IMU katmani `malloc` cagirmadan sensor
|
||||
kuyruklarini ve butun durumunu statik ayirir. Newlib ve formatli UART destegi
|
||||
@@ -47,6 +109,17 @@ edilerek 512 KiB sinirinda dogrulanmistir.
|
||||
|
||||
### Bare-metal sensor secimi
|
||||
|
||||
ESKF/fusion varsayilan olarak aciktir. GPS-only firmware icin ana uygulama
|
||||
akisini degistirmeden kapatilabilir:
|
||||
|
||||
```sh
|
||||
make -C soc/software/gps_system GPS_ESKF_ENABLE=0
|
||||
```
|
||||
|
||||
Bu durumda GPS acquisition/tracking/WLS ve ham lat-lon yayini calismaya devam
|
||||
eder; IMU stream'i ve `navigation_fusion` baslatilmaz. UART startup satirinda
|
||||
`eskf_enabled` ve gercek init sonucu olan `eskf_ready` ayri alanlardir.
|
||||
|
||||
Otomatik WHO_AM_I algilama varsayilandir:
|
||||
|
||||
```sh
|
||||
@@ -61,7 +134,8 @@ make -C soc/software/gps_system IMU_SENSOR=tdk \
|
||||
IMU_ODR_HZ=500 IMU_ACCEL_FS_G=4 IMU_GYRO_FS_DPS=250
|
||||
|
||||
make -C soc/software/gps_system IMU_SENSOR=st \
|
||||
IMU_ODR_HZ=104 IMU_ACCEL_FS_G=2 IMU_GYRO_FS_DPS=250
|
||||
IMU_ODR_HZ=50 GPS_NAV_SOLVE_TIMER_TICKS=10 \
|
||||
IMU_ACCEL_FS_G=2 IMU_GYRO_FS_DPS=250
|
||||
```
|
||||
|
||||
`IMU_SENSOR=stm`, `st` seciminin alias'idir. `IMU_ODR_HZ=0`,
|
||||
@@ -70,6 +144,33 @@ secer. Bu ozellikle `auto` icin onemlidir; TDK ve ST'nin ortak bir ODR degeri
|
||||
yoktur. Desteklenen ODR'ler TDK icin 25/50/100/200/500/1000 Hz, ST icin
|
||||
52/104/208 Hz'dir.
|
||||
|
||||
`IMU_ODR_HZ` fiziksel data-ready hizini secer; ST icin `50` istegi gercek 52 Hz
|
||||
ayarina eslenir. Her IMU ornegi kendi monotonik CLINT timestamp'i ile ESKF
|
||||
tahminine girer. 19/20 ms gibi sabit bir `dt` varsayilmaz ve CPU yuku icin ham
|
||||
ornek atlanmaz. Ileride ESKF orani dusurulecekse PX4'teki gibi delta-angle ve
|
||||
delta-velocity biriktiren, coning/sculling bilgisini koruyan bir downsampler
|
||||
kullanilmalidir.
|
||||
|
||||
GPS orani bundan bagimsizdir. `GPS_NAV_SOLVE_TIMER_TICKS=5/10/50` sirasiyla
|
||||
100/200/1000 ms nav-solve periyodu verir. WLS sonucu gec gelse bile olcum kendi
|
||||
capture timestamp'inde fixed-lag replay ile uygulanir; yalniz
|
||||
`solution_valid=true` olan GPS cozumu fusion'a girer. GPS yokken IMU ESKF'nin
|
||||
process-model tahminini surdurur, fakat filtre kendine sahte konum olcumu
|
||||
vermez. Global origin yoksa LLH cikisi valid degildir; origin daha once
|
||||
kurulduysa sonuc yardimsiz dead-reckoning'dir ve kovaryansi zamanla buyur.
|
||||
|
||||
NIS kapisi tek bir aykiri GPS'in ESKF'yi suruklemesini engeller. Ancak acilista
|
||||
ilk GPS fix'i kotu olup sonraki tutarli fix'ler bu ilk noktadan onlarca metre
|
||||
uzakta kalirsa, yalniz hard NIS rejection kullanmak filtreyi yanlis baslangica
|
||||
kilitler. Fusion engine bu nedenle ardisik reddedilen position fix'lerinin
|
||||
zamansal surekliligini izler. Son başarılı fusion'dan sonra yedi saniye timeout
|
||||
dolmuşsa ve en az uc fix birbirinin devamı
|
||||
ise yalniz ESKF konumu ve konum kovaryansi son olcume yeniden ankrajlanir;
|
||||
attitude, hiz ve IMU bias state'leri korunur, gecersiz hale gelen position
|
||||
cross-covariance'lari sifirlanir. Tek aykiri fix bu yolu tetiklemez. Bu davranis
|
||||
100/200/1000 ms GPS oranlarinda `gps_reacquisition_test.c` ile dogrulanir ve
|
||||
level-2 fusion status satirinda `recoveries=` sayaci ile gozlenir.
|
||||
|
||||
TDK ve ST veri-hazir interrupt'i ile calisir ve ana dongu `wfi` kullanabilir.
|
||||
Genesys2 son pin planinda ortak aktif sensor interrupt girişi `JB1/V29`
|
||||
uzerinden wrapper'daki 3FF synchronizer'a, oradan PLIC device 11'e gider. ST
|
||||
@@ -79,12 +180,14 @@ sicaklik alanlarini okuyup statik SPSC kuyruğa koyar. `imu_sensor_service()`
|
||||
interrupt backend'lerde no-op'tur.
|
||||
|
||||
Standalone LSM6DSOX SPI okuma, stationary log ve `INT1 -> JB1 -> 3FF -> PLIC
|
||||
11 -> C ISR` fiziksel yolu kartta dogrulanmistir. 2026-07-16 canli sayac
|
||||
snapshot'inda 4084 interrupt'in 4084'u sample'a donusmus; read-fail, queue
|
||||
overflow, unexpected IRQ ve trap sayilari sifir kalmistir. Buna karsilik GPS +
|
||||
ST + ESKF'nin ayni urun firmware kosusundaki end-to-end testi henuz tamamlanmis
|
||||
sayilmamalidir. Yuksek ODR ve uzun WLS sirasinda sample kaybini daha da azaltmak
|
||||
gerekirse sonraki gelistirme sensor FIFO + sensor timestamp kullanmaktir;
|
||||
11 -> C ISR` fiziksel yolu kartta dogrulanmistir. 2026-07-16 GPS + ST + ESKF
|
||||
end-to-end stationary kosusunda 6531 interrupt/sample, 467 ESKF aktarimi ve
|
||||
322 kabul edilen GPS update'i goruldu; read-fail, queue overflow, missed sample
|
||||
ve GPS NIS reject sayilari sifir kaldi. Ayni logun yerlesmis son bolumunde 100
|
||||
ham GPS fix'inin yatay RMS sacilimi 13.62 m, son 20 fused durumun yatay RMS
|
||||
sacilimi 0.39 m oldu. Bu degerler survey referansina gore mutlak dogruluk degil,
|
||||
sabit anten etrafindaki repeatability olcumudur. Yuksek ODR gerekirse sonraki
|
||||
gelistirme sensor FIFO + sensor timestamp veya daha yuksek CPU butcesidir;
|
||||
ortak IMU arayuzu ve ESKF bunun icin degismeyecektir.
|
||||
|
||||
Sensor ODR'si ile GPS nav-solve periyodu birbirinden bagimsizdir. Her IMU ve GPS
|
||||
@@ -93,6 +196,30 @@ ESKF olaylari timestamp sirasinda isler. TDK ve ST ISR timestamp'i data-ready
|
||||
kenarini yakindan temsil eder. Daha kesin ve WLS/interrupt latency'sinden
|
||||
bagimsiz yuksek-ODR zamanlama gerekirse sensor FIFO timestamp'i kullanilmalidir.
|
||||
|
||||
### Level-1 konum UART protokolu
|
||||
|
||||
Her gecerli GPS navigation epoch'unda level 1'de iki konum satiri art arda
|
||||
yayinlanir. Ilk satir WLS GPS konumu, ikinci satir o anda mevcut IMU+ESKF
|
||||
duzeltilmis konumdur:
|
||||
|
||||
```text
|
||||
[LOCATION] source=gps lat=... lon=... height=... gdop=... pdop=... hdop=... vdop=... tdop=... tracked=... used=...
|
||||
[LOCATION] source=imu_corrected lat=... lon=... height=... gdop=... pdop=... hdop=... vdop=... tdop=... tracked=... used=...
|
||||
```
|
||||
|
||||
`tracked`, donanimda calisan tracking kanal sayisini; `used`, ilgili WLS
|
||||
cozumunde kullanilan uydu sayisini belirtir. DOP alanlari ayni GPS epoch'unun
|
||||
geometrisidir ve iki satirda ayni tasinir. ESKF henuz kalibrasyon/origin
|
||||
asamasindaysa yalniz GPS satiri yayinlanir; ESKF valid olduktan sonra her GPS
|
||||
konumu geldiginde iki satir da yayinlanir. Eski `[NAV] position` ve periyodik
|
||||
`[FUSION] lat/lon` ayrintilari daha yuksek debug seviyesindedir; level 1
|
||||
parser'inin ayni konumu birden fazla kez gormesi engellenir.
|
||||
|
||||
Desktop `location_plotter`, `source=gps` serisini mavi ve
|
||||
`source=imu_corrected` serisini kirmizi cizer. Iki kaynak arasinda zigzag yol
|
||||
cizmez; corrected veri varsa CEP/RMS analizi yalniz corrected seriyle yapilir.
|
||||
Linux sentetik replay loglarindaki `source=trajectory` gerçek izi yeşil çizer.
|
||||
|
||||
### Kalibrasyon ve sicaklik politikasi
|
||||
|
||||
Uc farkli duzeltme birbirinden ayridir:
|
||||
@@ -142,7 +269,7 @@ Generated DTS/RTL'e gore GPS IP adresleri:
|
||||
| TRCK7 | `0x10028000` | `9` |
|
||||
| TRCK8 | `0x10029000` | `10` |
|
||||
|
||||
Bu degerler `soc/software/bsp/include/bsp/soc.h` icinde BSP define olarak tutuluyor. GPS yazilimi `header/gps_ip_defines.h` icinde bu BSP define'larini kullaniyor.
|
||||
Bu degerler `soc/software/bsp/include/bsp/soc.h` icinde BSP define olarak tutuluyor. GPS yazilimi `header/gps/gps_ip_defines.h` icinde bu BSP define'larini kullaniyor.
|
||||
|
||||
PLIC base:
|
||||
|
||||
@@ -357,14 +484,14 @@ Bu bolum continuous/background acquisition ve parametrik acquisition engine dest
|
||||
|
||||
### Degisen Dosyalar
|
||||
|
||||
- `header/gps_ip_defines.h`
|
||||
- `header/gps_macros.h`
|
||||
- `header/gps_interrupt_handlers.h`
|
||||
- `header/linked_list.h`
|
||||
- `src/gps_ip.c`
|
||||
- `src/gps_interrupt_handlers.c`
|
||||
- `src/linked_list.c`
|
||||
- `gps_test.c`
|
||||
- `header/gps/gps_ip_defines.h`
|
||||
- `header/gps/gps_macros.h`
|
||||
- `header/gps/gps_interrupt_handlers.h`
|
||||
- `header/gps/linked_list.h`
|
||||
- `src/gps/gps_ip.c`
|
||||
- `src/gps/gps_interrupt_handlers.c`
|
||||
- `src/gps/linked_list.c`
|
||||
- `gps_system.c` (onceki `gps_test.c` giris noktasi)
|
||||
|
||||
### Parametric Acquisition Engine Destegi
|
||||
|
||||
@@ -526,8 +653,9 @@ GPS_TRK_MEASUREMENT_STALE_TICKS
|
||||
- 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 `subframe_ready` 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; mevcut `gps_startup_initialization(10)` ayari 200 ms'de bir ABS_SAMPLE latch ve nav-solve interrupt'i uretir.
|
||||
- Bu siralama onemlidir: RTL `nav_solve_timer` sayaci `NAV_SOLVE_EN` ve `subframe_ready` ile baslar. `NAV_SOLVE_EN` nav-bit asamasinda acik tutulur ki timer GPS bit/subframe fazina otursun; subframe 1..5 hazir olana kadar yalniz nav-solve interrupt/flag kapali kalir.
|
||||
- Bundan sonra periyodik pozisyon hesaplamasi nav-solve interrupt'lari ile tetiklenir. RTL `subframe_ready` 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: RTL `nav_solve_timer` sayaci `NAV_SOLVE_EN` ve ilk gecerli `subframe_ready` ile baslar. `NAV_SOLVE_EN` nav-bit asamasinda acik tutulur; subframe 1..5 hazir olana kadar yalniz nav-solve interrupt/flag kapali kalir. 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 ise hafta rollover'i oncesinden aktif kalan kanallarla rollover sonrasinda katilan kanallarin da ayni fazda kalmasi icin `30240000 mod N == 0` kosulunu compile time'da zorunlu tutar. Ornegin `N=40`, `N=100`, `N=125`, `N=150`, `N=200` ve `N=300` gecerlidir; kosulu 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.
|
||||
- Partial coherent grup sayisi mevcut `ready channels` sayisina ulasmadiysa firmware nav-solve sequence'lerini consume etmez. Coherent snapshot tum ready kanallari kapsasa bile sequence ancak navigation solve basarili olduktan sonra, snapshot aninda kaydedilen sequence degerine kadar consume edilir. Basarisiz solve ayni epoch'u tekrar deneyebilir; daha yeni sequence yanlislikla tuketilmez.
|
||||
@@ -538,6 +666,7 @@ GPS_TRK_MEASUREMENT_STALE_TICKS
|
||||
- Tracking nav-solve interrupt'lari ayni GPS epoch'unda birbirine cok yakin gelebilir. External interrupt handler bu yuzden PLIC'te bekleyen farkli GPS source ID'lerini tek ISR girisinde bounded olarak drain eder. Ayni source ID tekrar claim edilirse handler durur; bu durum level interrupt clear'in henuz donanima yansimadigini gosterir ve `PLIC repeated source while draining` WARN sayaci ile raporlanir.
|
||||
- Normal nav-bit interrupt'larinda mevcut tracking node tekrar insert edilmeye calisilmaz. Bu nedenle `requested node already exists` UART spam'i normal akista gorulmemelidir; per-subframe `nav bits` logu `TRACE` seviyesine alinmistir.
|
||||
- Nav solve mode'da `NAV_SOLVE_TIMER`, subframe fazindan sonra kac adet 20 ms navigation biti sayilacagini; dolayisiyla ABS_SAMPLE latch ve interrupt epoch'unu belirler. Her islenen event'te TOW `NAV_SOLVE_TIMER * 20 ms` artirilir ve GPS hafta sinirinda normalize edilir. Raw `ABS_SAMPLE` TOW artisini belirlemez; yalniz ayni nav-solve epoch'undan gelen kanallari secmek ve pseudorange olcumunu olusturmak icin kullanilir. Pseudorange hesabina giden `gps_ephems.abs_sample` receiver sample'in corrected double halidir.
|
||||
- `hardware/external/gps/rtl/gps_timer/tb/nav_solve_timer_tb.sv`, RTL'nin ayni hafta icindeki genel fazlama davranisini bir kanalin digerinden tam bir subframe gec basladigi `N=40`, `N=37`, `N=512` ve `N=1` durumlariyla kontrol eder. Firmware build kurali bunlardan GPS haftasindaki `30240000` navigation biti tam bolmeyen degerleri sistem konfigurasyonu olarak reddeder.
|
||||
- Tracking wrapper'daki `REM_CODE_PHASE_REG` donanimda IEEE-754 double degildir. RTL'de code NCO phase accumulator 46 bittir; software'e expose edilen kisim `rem_code_ph[45:20]` yani 26-bit integer residue'dur ve APB `PRDATA[25:0]` alanina zero-extend edilerek verilir. Bu yuzden firmware bu register'i `uint32_t` okur; `uint64_t` veya `double*` olarak MMIO okumak iki 32-bit APB read uretir ve register map ile uyumlu degildir.
|
||||
- Navigation icin kullanilan corrected receiver sample formulu:
|
||||
|
||||
@@ -578,6 +707,11 @@ weight = 1 / variance
|
||||
- Ephemeris alanlarinin mevcut isimleri ile ICD anlamlari su sekildedir: `omgdot` gercekte `Omega0`, `omg0` gercekte argument of perigee `omega`, `omgkdot` gercekte `OmegaDot` degeridir. `satpos()` bunlari dogru matematiksel yerde kullanir; konu su an hesap hatasi degil, ileride yapilacak kontrollu isim duzeltmesidir.
|
||||
- `POSTPONE_TOW=0.160` donanim/pipeline zaman kalibrasyonunun bir parcasidir; kaynagi dogrulanmadan kaldirilmamalidir.
|
||||
- Tum ready kanallarin coherent nav-solve interrupt'inin beklenmesi bilincli davranistir. Donanimin her aktif tracking kanali icin ilgili interrupt'i uretecegi kabul edilir.
|
||||
- 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
|
||||
integrity bayragi false kalir. Bes veya daha fazla uyduda publish icin mevcut
|
||||
chi-square gecis kosulu uygulanir. Boylece `solution_valid` ile
|
||||
`integrity_available/pass` ayni kavram olarak kullanilmaz.
|
||||
- Broadcast SV health filtresi uygulanir. Sonraki integrity adimi ephemeris age/fit interval ve post-fit residual metriklerini eklemektir. En az bes satellite olmadan tek hatali olcumu residual ile guvenilir sekilde ayirmak mumkun degildir.
|
||||
|
||||
### Debug Mesajlari
|
||||
@@ -688,20 +822,20 @@ Eger ACQ engine'ler tracking bolgesinden once arka arkaya yerlestiriliyorsa `BSP
|
||||
#define BSP_GPS_TRCK0_IRQ 3UL
|
||||
```
|
||||
|
||||
ACQ tarafinda normal durumda `src/gps_ip.c` icinde manuel pointer eklemek gerekmez. Startup'ta `gps_init_acq_tables()` su helper'lari kullanarak tabloyu doldurur:
|
||||
ACQ tarafinda normal durumda `src/gps/gps_ip.c` icinde manuel pointer eklemek gerekmez. Startup'ta `gps_init_acq_tables()` su helper'lari kullanarak tabloyu doldurur:
|
||||
|
||||
```c
|
||||
GPS_ACQ_IP_BASE_ADDR(index)
|
||||
GPS_ACQ_INTR_LINE(index)
|
||||
```
|
||||
|
||||
ACQ engine sayisi firmware tarafinda tek noktadan `header/gps_ip_defines.h` icindeki `ACQ_ENGINE_COUNT` ile kontrol edilir. Varsayilan olarak `BSP_GPS_ACQ_COUNT` kullanilir. Donanim/BSP dogru count veriyorsa ekstra override gerekmez.
|
||||
ACQ engine sayisi firmware tarafinda tek noktadan `header/gps/gps_ip_defines.h` icindeki `ACQ_ENGINE_COUNT` ile kontrol edilir. Varsayilan olarak `BSP_GPS_ACQ_COUNT` kullanilir. Donanim/BSP dogru count veriyorsa ekstra override gerekmez.
|
||||
|
||||
Eger ACQ address veya IRQ offset'leri uniform degilse, mevcut `base + index * stride` modeli yeterli degildir. Bu durumda:
|
||||
|
||||
- `soc.h` icinde her ACQ icin explicit base/IRQ define'i eklenmeli, ornek `BSP_GPS_ACQ0_BASE`, `BSP_GPS_ACQ1_BASE`.
|
||||
- `header/gps_ip_defines.h` icindeki `GPS_ACQ_IP_BASE_ADDR(index)` ve `GPS_ACQ_INTR_LINE(index)` helper'lari explicit tablo veya switch ile guncellenmeli.
|
||||
- `src/gps_ip.c` icindeki `gps_init_acq_tables()` explicit base/IRQ tablolarini kullanacak sekilde guncellenmeli.
|
||||
- `header/gps/gps_ip_defines.h` icindeki `GPS_ACQ_IP_BASE_ADDR(index)` ve `GPS_ACQ_INTR_LINE(index)` helper'lari explicit tablo veya switch ile guncellenmeli.
|
||||
- `src/gps/gps_ip.c` icindeki `gps_init_acq_tables()` explicit base/IRQ tablolarini kullanacak sekilde guncellenmeli.
|
||||
|
||||
ACQ register layout'u degisirse sadece count/base degistirmek yetmez. Su alanlar da XLSX/RTL'e gore kontrol edilmelidir:
|
||||
|
||||
@@ -726,14 +860,14 @@ Uniform tracking channel address/IRQ stride varsa `soc.h` icinde su define'lar g
|
||||
|
||||
Tracking tarafinda mevcut firmware bazi yerlerde hala manuel channel entry'leri kullaniyor. `BSP_GPS_TRCK_COUNT` arttirilinca su dosyalarda yeni kanal icin entry eklenmelidir:
|
||||
|
||||
- `header/gps_ip_defines.h`
|
||||
- `header/gps/gps_ip_defines.h`
|
||||
- `TRCK9_IP_BASE_ADDR`, `TRCK10_IP_BASE_ADDR`, ...
|
||||
- `TRCK9_INTR_LINE`, `TRCK10_INTR_LINE`, ...
|
||||
- `src/gps_ip.c`
|
||||
- `src/gps/gps_ip.c`
|
||||
- `trck9_ip`, `trck10_ip`, ...
|
||||
- `trck_ips[]` array'ine yeni pointer'lar,
|
||||
- `trck_ips_intr_lines[]` array'ine yeni IRQ line'lar.
|
||||
- `src/gps_interrupt_handlers.c`
|
||||
- `src/gps/gps_interrupt_handlers.c`
|
||||
- dosya sonundaki `DEFINE_TRCK_INTR_HANDLER(9)`, `DEFINE_TRCK_INTR_HANDLER(10)`, ... wrapper'lari.
|
||||
|
||||
`GPS_TRCK_IP_COUNT`, `BSP_GPS_TRCK_COUNT` uzerinden gelir ve loop/array boyutlari bu count'u kullanir. Ancak yukaridaki manuel array initializer'lar ve handler wrapper'lari yeni count ile uyumlu olmak zorundadir.
|
||||
@@ -741,8 +875,8 @@ Tracking tarafinda mevcut firmware bazi yerlerde hala manuel channel entry'leri
|
||||
Eger TRCK address veya IRQ offset'leri uniform degilse, mevcut `BSP_GPS_TRCK0_BASE + index * BSP_GPS_TRCK_STRIDE` ve `BSP_GPS_TRCK0_IRQ + index * BSP_GPS_TRCK_IRQ_STRIDE` modeli yeterli degildir. Bu durumda:
|
||||
|
||||
- BSP'ye her tracking channel icin explicit base/IRQ define'i eklenmeli.
|
||||
- `header/gps_ip_defines.h` icindeki `TRCKn_IP_BASE_ADDR` ve `TRCKn_INTR_LINE` define'lari explicit degerlerden gelmeli.
|
||||
- `src/gps_ip.c` icindeki `trck_ips[]` ve `trck_ips_intr_lines[]` array'leri bu explicit define'lari kullanmali.
|
||||
- `header/gps/gps_ip_defines.h` icindeki `TRCKn_IP_BASE_ADDR` ve `TRCKn_INTR_LINE` define'lari explicit degerlerden gelmeli.
|
||||
- `src/gps/gps_ip.c` icindeki `trck_ips[]` ve `trck_ips_intr_lines[]` array'leri bu explicit define'lari kullanmali.
|
||||
|
||||
TRCK register layout'u degisirse su alanlar XLSX/RTL'e gore tekrar kontrol edilmelidir:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user