Document fusion handoff and PPS lock diagnosis
This commit is contained in:
@@ -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ı:
|
||||
|
||||
Reference in New Issue
Block a user