Document fusion handoff and PPS lock diagnosis

This commit is contained in:
2026-07-16 13:45:10 +03:00
parent dd6569c025
commit 927f6e2858
4 changed files with 155 additions and 32 deletions
+123 -4
View File
@@ -1,11 +1,130 @@
# Stationary GPS / ICM-4268x fusion
# GPS / IMU ESKF fusion
Bu klasör Genesys2 kartından UART ile alınan GPS WLS konumlarını ve PMOD SPI
üzerindeki ICM-42686/ICM-42688 ölçümlerini Python'da işler. Filtre 15 hata
durumlu bir ESKF'dir: ENU konum/hız, quaternion tutum, ivmeölçer biası ve
jiroskop biası. Kartın durağan olduğu deneyde zero-velocity update (ZUPT)
üzerindeki TDK ICM-4268x veya ST LSM6DSOX ölçümlerini Python'da işler. Filtre
15 hata durumlu bir ESKF'dir: ENU konum/hız, quaternion tutum, ivmeölçer biası
ve jiroskop biası. Kartın durağan olduğu deneyde zero-velocity update (ZUPT)
uygulanır ve GPS innovation değerlerine aykırı-ölçüm kapısı konur.
## Güncel durum ve devralma notu (2026-07-16)
Bu bölüm yeni bir geliştirme oturumunun nereden devam edeceğini tek yerde
özetler. Aşağıdaki Python model ve bare-metal C uygulaması aynı problemi çözer,
fakat aynı program değildir:
```text
Offline model:
UART GPS + IMU logları -> Python parser -> fixed/adaptive ESKF -> CSV/grafik/harita
Ürün yolu:
GPS WLS ---------> fusion_bus --\
-> fusion_engine -> 15-state ESKF -> fused LLH/ENU
TDK veya ST IMU -> imu_sensor ----/
```
Python tarafındaki giriş noktaları:
- `serial_capture.py`: UART akışını zaman damgalı CSV olarak toplar;
- `fusion_eskf.py`: GPS ve TDK/ST IMU kayıtlarını offline ESKF'de oynatır;
- `compare_eskf_models.py`: sürekli stationary kısıtlı model ile hareketi
algılayıp ZUPT'yi açıp kapatan adaptif modeli aynı veri üzerinde karşılaştırır;
- `map_player.py`: ham GPS ve düzeltilmiş ESKF noktalarını Linux masaüstü
penceresinde OpenStreetMap üzerinde zamana göre oynatır;
- `compare_firmware_logs.py` ve `synthetic_firmware_ab.py`: standalone GPS
firmware A/B ve sentetik WLS bütünlük analizlerini üretir.
Bare-metal ürün mimarisi sürücüden bağımsızdır. `imu_sensor` aktif TDK veya ST
backend'ini seçer, `imu_calibration` SI birimine ve ortak eksen takımına
dönüştürür, `fusion_engine` ise sensör markasını bilmeden motion detector ve
ESKF'yi çalıştırır. IMU ve GPS asenkrondur; ikisi de aynı monotonik CLINT/CPU
tick alanında ölçüm anında damgalanır. GPS WLS geç tamamlanırsa fixed-lag IMU
history replay ile update gerçek ölçüm epoch'unda uygulanır.
Doğrulama durumu:
- Linux/GCC sentetik hareket, stationary, ani ivmelenme/fren, dönüş, ZUPT,
GPS NIS rejection, gecikmiş GPS replay, covariance invariantları ve
ASan/UBSan testleri geçti. Ayrıntılı sonuçlar aşağıdadır.
- STEVAL-MKI217V1 üzerindeki LSM6DSOX'un SPI Mode-0 okuması ve 60 saniyelik
stationary ham veri kaydı gerçek Genesys2 kartında doğrulandı. Bu, tek başına
bütünleşik fusion doğrulaması değildir.
- PMOD asynchronous input -> 3FF synchronizer -> PLIC device 11 -> C ISR yolu
ASIC/Questa simülasyonunda geçti.
- Genesys2 fiziksel sensör interrupt girişi son tasarımda `JC9/AK30`, GPS PPS
çıkışı `JC10/AK28`'dir. JC9'a geçişin kaynak/XDC/standalone test değişiklikleri
2026-07-16 denetiminde henüz ayrı commit/push yapılmamıştı.
- GPS + ST/TDK + ESKF'nin aynı gerçek firmware koşusunda hareketli platform
testi, Rocket `rdcycle` yük ölçümü, mounting dönüşümü ve sample-loss testi
henüz tamamlanmadı. Sentetik metre sonuçları gerçek saha accuracy iddiası
değildir.
Git devralma durumu: aktif branch `tdk_ekf`, yerel HEAD `35fbc5b` ve
`origin/tdk_ekf` `df563aa` idi; yani yerel branch remote'dan bir commit ilerideydi.
Çalışma ağacında JC9 XDC/wrapper/test değişikliklerinin yanında çok sayıda
üretilmiş bitstream, object, simülasyon ve log dosyası bulunuyordu. Yeni oturum
önce `git status`, `git diff` ve `git log --oneline --decorate -5` ile tekrar
kontrol etmeli; üretilmiş dosyaları ayırmadan `git add -A` kullanmamalıdır.
Sonraki ana adımlar:
1. JC9 kaynak/XDC ve test dokümanlarını seçerek commit etmek ve remote'a push
etmek; build/sim çıktısını bu commite karıştırmamak.
2. Genesys2 üzerinde fiziksel JC9 interrupt sayacı ile LSM6DSOX INT1/sample
sayısını birlikte doğrulamak.
3. `gps_system` içinde ST veya TDK seçerek GPS + IMU + ESKF UART telemetry'sini
gerçek karttan toplamak; fused LLH/ENU, hız, motion state, NIS, GPS accept/
reject, IRQ/sample-loss ve queue sayaçlarını kaydetmek.
4. Stationary -> ani hareket -> sabit hız -> fren -> tekrar stationary testini
yapmak; hareket sırasında ZUPT'nin kapalı kaldığını doğrulamak.
5. PPS için aşağıdaki lock teşhisini tamamlamak.
### PPS çıkmıyor: lock problemi ve teşhis
Gözlenen belirti GPS konumunun UART'ta gelmesi fakat JC10'da PPS pulse
görülmemesidir. Bu henüz kesinleşmiş bir RTL hatası değildir. Mevcut PPS
tasarımı lock oluşmadan fiziksel çıkışı bilinçli olarak LOW tutar; dolayısıyla
konum çözülmesi tek başına PPS üretildiğini kanıtlamaz.
İlk kabul edilen WLS/PPS commit'i yalnız coarse alignment yapar. Ardından faz
hatası en fazla sekiz adet 125 MHz tracking-clock tick'i, yani 64 ns olan beş
ardışık PI update gerekir. Lock kazanıldıktan sonra 256 ns üzerindeki yeni bir
faz hatası lock'u düşürür. WLS receiver-clock bias/pseudorange jitter'ı veya
epoch capture belirsizliği beş ardışık ölçümde 64 ns koşulunu bozarsa konum
gelmeye devam ederken PPS pini sürekli LOW kalabilir. Bu şu an en güçlü
olasılıktır; register ölçmeden eşik değiştirilmemelidir.
Firmware ancak WLS başarılı, `solution_valid=true`, PPS referans satırı FDE ile
dışlanmamış ve referans kanalın capture sequence'i sıfır değilse PPS mailbox'a
commit yapar. Bunlardan biri sağlanmazsa PPS daha coarse alignment'a bile
ulaşmaz.
Genesys2 post-route checkpoint kontrolünde `gps_pps` portunun `JC10/AK28`,
LVCMOS33 olarak yerleştiği, sabit 0/1'e bağlanmadığı ve PPS core
`pps_out_p_reg/Q` tarafından sürüldüğü doğrulandı. Canlı ayrım için çalışan
kartta GDB ile şu register'lar okunmalıdır:
```gdb
x/wx 0x1002a07c
x/wx 0x1002a000
x/wx 0x1002a004
x/wx 0x1002a048
x/wx 0x1002a074
```
| Register | Beklenen/yorum |
|---|---|
| `VERSION @ 0x1002a07c` | `0x00020100`; farklıysa ELF/bitstream eşleşmiyor |
| `CONTROL @ 0x1002a000` | Enable + track açıkken alt bitler genellikle `0x3` |
| `STATUS @ 0x1002a004` | `0x1`: commit/alignment yok; alt bitler `0x7`: aligned fakat lock değil; bit 11 set ve alt bitler `0xf`: locked/valid |
| `ACTIVE_SEQUENCE @ 0x1002a048` | `0`: firmware hiç geçerli PPS commit'i yapmamış; artıyorsa WLS referansları PPS'ye ulaşıyor |
| `PULSE_COUNT @ 0x1002a074` | Artıyorsa RTL pulse üretiyor; sorun JC10/prob/GND tarafındadır |
Sağlıklı ve sticky hata biti olmayan tipik lock durumu `STATUS=0x0000080f`'tir.
`ACTIVE_SEQUENCE` artarken `STATUS` yaklaşık `0x7` kalıyorsa problem pin değil,
lock acquisition/faz jitter'ıdır. `STATUS` lock gösteriyor ve `PULSE_COUNT`
artıyorsa JC10 sinyali JC11 GND referansıyla osiloskop veya logic analyzer'da
ölçülmelidir; pulse saniyede bir yaklaşık 100 ms HIGH'dır.
## Çalıştırma
UART kaydı:
+19 -15
View File
@@ -15,7 +15,7 @@ ST LSM6DSOX ------/
- `src/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,
register, foreground polling ve ham-veri donusumu.
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
donusumu ve opsiyonel sicaklik katsayisi.
@@ -70,23 +70,27 @@ 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.
TDK veri-hazir interrupt'i ile calisir ve ana dongu `wfi` kullanir. Mevcut ST
baglantisinda interrupt pini bagli olmadigi icin ST surucusu foreground'da
ODR'nin iki kati hizda status poll eder; yeni ornekleri sensor ODR'sinde
uretir. Bu yontem fonksiyoneldir fakat CPU'nun `wfi` ile uyumasini engeller.
Uzun WLS islemi sirasinda foreground durdugu icin sensorun yeni ornekleri
overwrite olabilir. Bu nedenle interruptsiz ST yolu stationary bring-up ve log
testi icindir; hareketli fusion icin kayipsiz bir yol kabul edilmez.
Uretim baglantisinda ST INT pini eklendiginde yalniz ST backend acquisition
yontemi interrupt'a cevrilecek (alternatif olarak sensor FIFO ve sensor
timestamp'i kullanilacak); ortak arayuz ve ESKF degismeyecektir.
TDK ve ST veri-hazir interrupt'i ile calisir ve ana dongu `wfi` kullanabilir.
Genesys2 son pin planinda ortak aktif sensor interrupt girişi `JC9/AK30`
uzerinden wrapper'daki 3FF synchronizer'a, oradan PLIC device 11'e gider. ST
surucusu LSM6DSOX accel data-ready olayini INT1'e yonlendirir; ISR local CLINT
timestamp'ini basta alir, latched kaynagi temizler, ayni sample'in gyro ve
sicaklik alanlarini okuyup statik SPSC kuyruğa koyar. `imu_sensor_service()`
interrupt backend'lerde no-op'tur.
Standalone LSM6DSOX SPI okuma ve stationary log kartta dogrulanmistir. Buna
karsilik JC9 fiziksel interrupt yolu ile GPS + ST + ESKF'nin ayni urun firmware
kosusundaki end-to-end testi henuz tamamlanmis sayilmamalidir. ASIC/Questa
simulasyonunda asynchronous input -> 3FF -> PLIC device 11 -> C ISR yolu
gecmistir. Yuksek ODR ve uzun WLS sirasinda sample kaybini daha da azaltmak
gerekirse sonraki gelistirme sensor FIFO + sensor timestamp kullanmaktir;
ortak IMU arayuzu ve ESKF bunun icin degismeyecektir.
Sensor ODR'si ile GPS nav-solve periyodu birbirinden bagimsizdir. Her IMU ve GPS
olcumu ayni local monotonic CPU tick domaininde kendi olcum zamaniyla tasinir;
ESKF olaylari timestamp sirasinda isler. TDK interrupt timestamp'i data-ready
kenarini yakindan temsil eder. Poll edilen ST timestamp'i ise data-ready'nin
foreground'da goruldugu andir ve bir polling gecikmesi tasir. Hareketli nihai
sistemde ST INT veya FIFO timestamp kullanma gereksiniminin nedeni budur.
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.
### Kalibrasyon ve sicaklik politikasi
+5 -5
View File
@@ -1,8 +1,8 @@
# Genesys2 JB1 direct PLIC test
# Genesys2 JC9 direct PLIC test
This standalone image tests only the asynchronous PMOD interrupt path:
`JB1 (V29) -> wrapper 3FF synchronizer -> Rocket interrupt bus -> PLIC 11`
`JC9 (AK30) -> wrapper 3FF synchronizer -> Rocket interrupt bus -> PLIC 11`
The input is LVCMOS33 with a weak FPGA pull-down. The Rocket PLIC gateway is
level-sensitive, so the ISR masks source 11 on its first assertion before it
@@ -16,14 +16,14 @@ make -C soc/software/pmod_irq_test clean all
```
After loading `build/pmod_irq_test.elf`, wait for `PMOD_IRQ_READY`. Start with
JB1 disconnected, then connect JB1 to a Genesys2 PMOD 3.3 V pin once. A working
JC9 disconnected, then connect JC9 to a Genesys2 PMOD 3.3 V pin once. A working
path prints `PMOD_IRQ_PASS`. Remove the 3.3 V connection before resetting or
reloading the image.
Never apply 5 V to JB1 and never short a PMOD supply pin to ground.
Never apply 5 V to JC9 and never short a PMOD supply pin to ground.
For a voltage-source-independent loopback test, connect the FPGA-driven JC4
SPI clock output directly to the JB1 interrupt input. After
SPI clock output directly to the JC9 interrupt input. After
`LOOPBACK_READY`, send `t` over UART. The firmware emits 16 SPI transfers;
the first SCK HIGH must produce `PMOD_IRQ_PASS`. This loopback is confined to
the standalone diagnostic and does not add GPIO or alter the production PLIC
+8 -8
View File
@@ -1,11 +1,10 @@
# STEVAL-MKI217V1 polling test (Genesys2)
# STEVAL-MKI217V1 INT1 data-ready test (Genesys2)
This standalone bare-metal application reads the LSM6DSOX on the
STEVAL-MKI217V1 over the existing Genesys2 PMOD SPI peripheral. It does not
use INT1/INT2. The LIS2MDL magnetometer on the module is not enabled in this
first electrical/readout smoke test; it is internally reachable through the
LSM6DSOX sensor hub and will be integrated separately after the IMU link is
verified.
STEVAL-MKI217V1 over the existing Genesys2 PMOD SPI peripheral and uses INT1
for data-ready interrupts. The LIS2MDL magnetometer on the module is not
enabled; it is internally reachable through the LSM6DSOX sensor hub and will
be integrated separately after the IMU link is verified.
## Wiring
@@ -15,12 +14,13 @@ verified.
| SDA | JC2 | SPI MOSI / SDI |
| SDO | JC3 | SPI MISO |
| SCL | JC4 | SPI clock / SPC |
| INT1 | JC9 | active-high data-ready interrupt |
| VDD | 3.3 V | sensor supply |
| VDDIO | 3.3 V | digital I/O supply |
| GND | GND | common ground |
`CS` is mandatory for four-wire SPI. Never feed 5 V to VDDIO. JB1 is the
optional sensor interrupt pin but is deliberately unused here.
`CS` is mandatory for four-wire SPI. Never feed 5 V to VDDIO. JC9 is routed
through the FPGA 3FF synchronizer to PLIC device 11.
## Hardware bring-up results (2026-07-13)