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ı: