feat(gps): expose ESKF build profiles and 460800 UART

This commit is contained in:
2026-07-25 19:39:36 +03:00
parent ecbb8d0b68
commit 49b8609bb4
16 changed files with 393 additions and 39 deletions
+7 -3
View File
@@ -11,8 +11,10 @@ APP_FLASH_OFFSET ?= 0x06000000
APP ?= hello_uart
GPS_DEBUG ?= 1
GPS_DEBUG_LEVEL ?= 1
GPS_ESKF_ENABLE ?= 1
IMU_SENSOR ?= auto
BSP_UART_CLOCK_HZ ?= 100000000
BSP_UART_BAUDRATE ?= 115200
BSP_UART_BAUDRATE ?= 460800
GPS_SYSTEM_UART_BAUDRATE ?= 460800
BSP_CLINT_TIMEBASE_HZ ?= 1000000
GPS_SYSTEM_CLINT_TIMEBASE_HZ ?= 500000
@@ -42,6 +44,8 @@ help:
@echo " BSP_UART_CLOCK_HZ=$(BSP_UART_CLOCK_HZ)"
@echo " BSP_UART_BAUDRATE=$(BSP_UART_BAUDRATE)"
@echo " GPS_SYSTEM_UART_BAUDRATE=$(GPS_SYSTEM_UART_BAUDRATE)"
@echo " GPS_ESKF_ENABLE=$(GPS_ESKF_ENABLE)"
@echo " IMU_SENSOR=$(IMU_SENSOR)"
@echo " BSP_CLINT_TIMEBASE_HZ=$(BSP_CLINT_TIMEBASE_HZ)"
@echo " GPS_SYSTEM_CLINT_TIMEBASE_HZ=$(GPS_SYSTEM_CLINT_TIMEBASE_HZ)"
@echo " GPS_SYSTEM_IMU_PUBLISH_EVERY_N_SAMPLES=$(GPS_SYSTEM_IMU_PUBLISH_EVERY_N_SAMPLES)"
@@ -63,11 +67,11 @@ steval-mki217v1-test:
@make -C steval_mki217v1_test TOOLCHAIN="$(TOOLCHAIN)" BUILD_DIR="$(OUT_DIR)/steval_mki217v1_test" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(BSP_DTIM_BASE)" BSP_DTIM_SIZE="$(BSP_DTIM_SIZE)" all
gps-system:
@make -C gps_system TOOLCHAIN="$(TOOLCHAIN)" BUILD_DIR="$(OUT_DIR)/gps_system" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(GPS_SYSTEM_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(GPS_SYSTEM_CLINT_TIMEBASE_HZ)" IMU_CORRECTED_PUBLISH_EVERY_N_SAMPLES="$(GPS_SYSTEM_IMU_PUBLISH_EVERY_N_SAMPLES)" BSP_DTIM_BASE="$(BSP_DTIM_BASE)" BSP_DTIM_SIZE="$(BSP_DTIM_SIZE)" all
@make -C gps_system TOOLCHAIN="$(TOOLCHAIN)" BUILD_DIR="$(OUT_DIR)/gps_system" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" GPS_ESKF_ENABLE="$(GPS_ESKF_ENABLE)" IMU_SENSOR="$(IMU_SENSOR)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(GPS_SYSTEM_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(GPS_SYSTEM_CLINT_TIMEBASE_HZ)" IMU_CORRECTED_PUBLISH_EVERY_N_SAMPLES="$(GPS_SYSTEM_IMU_PUBLISH_EVERY_N_SAMPLES)" BSP_DTIM_BASE="$(BSP_DTIM_BASE)" BSP_DTIM_SIZE="$(BSP_DTIM_SIZE)" all
app:
@test -d "$(APP)"
@make -C "$(APP)" TOOLCHAIN="$(TOOLCHAIN)" BUILD_DIR="$(OUT_DIR)/$(APP)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(BSP_DTIM_BASE)" BSP_DTIM_SIZE="$(BSP_DTIM_SIZE)" all
@make -C "$(APP)" TOOLCHAIN="$(TOOLCHAIN)" BUILD_DIR="$(OUT_DIR)/$(APP)" GPS_DEBUG="$(GPS_DEBUG)" GPS_DEBUG_LEVEL="$(GPS_DEBUG_LEVEL)" GPS_ESKF_ENABLE="$(GPS_ESKF_ENABLE)" IMU_SENSOR="$(IMU_SENSOR)" BSP_UART_CLOCK_HZ="$(BSP_UART_CLOCK_HZ)" BSP_UART_BAUDRATE="$(BSP_UART_BAUDRATE)" BSP_CLINT_TIMEBASE_HZ="$(BSP_CLINT_TIMEBASE_HZ)" BSP_DTIM_BASE="$(BSP_DTIM_BASE)" BSP_DTIM_SIZE="$(BSP_DTIM_SIZE)" all
flash-image: app
@mkdir -p "$(FLASH_DIR)"
+1 -1
View File
@@ -13,7 +13,7 @@ APP_FLASH_OFFSET ?= 0x06000000
MARCH ?= rv64imafdc_zicsr_zifencei
MABI ?= lp64d
BSP_UART_CLOCK_HZ ?= 100000000
BSP_UART_BAUDRATE ?= 115200
BSP_UART_BAUDRATE ?= 460800
BSP_DTIM_BASE ?= 0x80000000
BSP_DTIM_SIZE ?= 0x00100000
CONFIG_STAMP := $(BUILD_DIR)/build_config.txt
+1 -1
View File
@@ -7,7 +7,7 @@
#endif
#ifndef BSP_UART_BAUDRATE
#define BSP_UART_BAUDRATE 115200UL
#define BSP_UART_BAUDRATE 460800UL
#endif
void bsp_init(void)
+1 -1
View File
@@ -13,7 +13,7 @@ LINKER_SCRIPT ?= $(COMMON_DIR)/linker_ram.ld
MARCH ?= rv64imafdc_zicsr_zifencei
MABI ?= lp64d
BSP_UART_CLOCK_HZ ?= 100000000
BSP_UART_BAUDRATE ?= 115200
BSP_UART_BAUDRATE ?= 460800
BSP_CLINT_TIMEBASE_HZ ?= 1000000
BSP_DTIM_BASE ?= 0x80000000
BSP_DTIM_SIZE ?= 0x00100000
+62 -7
View File
@@ -6,6 +6,22 @@ Bu klasör Genesys2 kartından UART ile alınan GPS WLS konumlarını ve PMOD SP
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.
Bare-metal ürün firmware'i ana dizinden iki profille üretilebilir:
```sh
# TDK + GPS + ESKF (varsayılan GPS_ESKF_ENABLE=1)
make FPGA_BOARD=genesys2 APP=gps_system \
GPS_ESKF_ENABLE=1 IMU_SENSOR=tdk fpga-mcs
# GPS-only; IMU/ESKF kapalı, WLS/Doppler/PPS açık
make FPGA_BOARD=genesys2 APP=gps_system \
GPS_ESKF_ENABLE=0 fpga-mcs
```
Firmware ve UART kayıt aracının varsayılan hızı `460800` baud'dur. İki profil
aynı MCS/BIN çıktı yolunu kullandığı için ikinci build ilk dosyanın üzerine
yazar.
## Güncel durum ve devralma notu (2026-07-16)
Bu bölüm yeni bir geliştirme oturumunun nereden devam edeceğini tek yerde
@@ -71,6 +87,37 @@ GPS position + Doppler velocity --\
TDK veya ST IMU -> imu_sensor ----/
```
### Doppler ESKF'ye nasıl geliyor?
1. Tracking RTL her 20 ms NAV-bit epoch'unda carrier NCO Q7 değerini,
`ABS_SAMPLE`, remaining code phase ve 20 prompt'un I/Q/WBP toplamlarını
birlikte latch eder. Payload 20 ms sabit kalır; APB wrapper registered
synchronizer ve settle süresinden sonra atomik register bankı ile interrupt
üretir.
2. Firmware coherent mailbox okumasında sequence'i payload öncesi/sonrası
kontrol eder. Carrier değeri için
`doppler_hz = carrier_q7/128 - 4092000`, L1 pseudorange-rate için
`range_rate = -doppler_hz*c/1575420000` kullanılır.
3. Aynı PRN'in 50 Hz snapshot'larında C/N0 `alpha=0.2`, Doppler `alpha=0.05`
software IIR ile yumuşatılır. RTL ham ölçümü korur; hardware Doppler IIR
içermez.
4. En az dört uyduyla C/N0-weighted velocity WLS
`[receiver_vx, receiver_vy, receiver_vz, receiver_clock_drift_mps]`
state'ini çözer. Her observation'dan satellite LOS velocity çıkarılır,
broadcast satellite clock drift eklenir. Inverse normal matrix ve post-fit
residual ECEF velocity covariance'ini üretir.
5. GPS adapter velocity ve 3x3 covariance'i ECEF'ten ENU'ya döndürür,
kart ölçümüne dayalı minimum `2/2/3 m/s` standard-deviation floor'larını
uygular ve position ile aynı capture timestamp'ini korur.
6. Fusion engine gecikmiş position ve velocity'yi aynı geçmiş epoch'unda
uygular. Velocity'nin ayrı 3-DOF `%99.9`, `NIS=16.266` kapısı vardır; bir
velocity reject aynı epoch'taki kabul edilmiş position update'ini bozmaz.
Sonra daha yeni IMU history current-time horizon'a kadar replay edilir.
Bu zincirin RTL/register ayrıntısı
`hardware/external/gps/rtl/trck_src/README.md`, bare-metal WLS ve kart
doğrulaması `soc/software/gps_system/README.md` içindedir.
Python tarafındaki giriş noktaları:
- `serial_capture.py`: UART akışını zaman damgalı CSV olarak toplar;
@@ -149,11 +196,12 @@ 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.
ardışık PI update gerekir. RTL reset release eşiği 256 ns'dir; v2.2 production
software profile'ları tek seyrek WLS sıçraması pulse kaybettirmesin diye
release eşiğini runtime `LOOP_CONFIG` ile 1.024 us yapar. WLS receiver-clock
bias/pseudorange jitter'ı veya epoch capture belirsizliği beş ardışık ölçümde
64 ns acquire koşulunu bozarsa konum gelmeye devam ederken PPS pini LOW
kalabilir.
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
@@ -185,7 +233,7 @@ monitor resume
| Register | Beklenen/yorum |
|---|---|
| `VERSION @ 0x1002a07c` | `0x00020100`; farklıysa ELF/bitstream eşleşmiyor |
| `VERSION @ 0x1002a07c` | Production v2.2 için `0x00020200`; farklıysa ELF/bitstream eşleşmesini kontrol edin |
| `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 |
@@ -197,7 +245,7 @@ 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.
2026-07-25 canlı Genesys2 ölçümünde `VERSION=0x00020100`,
Erken 2026-07-25 v2.1 canlı Genesys2 ölçümünde `VERSION=0x00020100`,
`CONTROL=0x00000003` ve snapshot `ACTIVE_SEQUENCE=11583` görüldü.
`PULSE_COUNT=314`, PPS core'un resetten beri 314 `pps_out` pulse olayı
oluşturduğunu kanıtladı; post-route top-level yol da sabit LOW değildir.
@@ -218,6 +266,13 @@ işaret eder. Eşik ölçümsüz büyütülmemeli; önce clock-bias/TDOP kalite
outlier reddi veya faz gözlemi süzme stratejisi board A/B testiyle
değerlendirilmelidir.
Bu tarihsel v2.1 teşhisinden sonra v2.2 dinamik PI profilleri, Doppler
clock-drift prediction, bounded WLS clock-bias filtresi, 2 s validity
watchdog/30 s state koruma politikası ve fractional capture correction
eklenmiştir. Güncel sentetik ve kart sonuçları
`soc/software/gps_system/README.md` altındaki PPS bölümlerinde, register/RTL
davranışı `hardware/external/gps/rtl/pps/README.md` içinde tutulur.
## Çalıştırma
UART kaydı:
+1 -1
View File
@@ -14,7 +14,7 @@ import serial
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser()
parser.add_argument("--port", default="/dev/ttyUSB2")
parser.add_argument("--baud", type=int, default=115200)
parser.add_argument("--baud", type=int, default=460800)
parser.add_argument("--duration", type=float, default=60.0)
parser.add_argument("--output", type=Path, required=True)
parser.add_argument(
+67 -15
View File
@@ -1,6 +1,8 @@
# GPS System Port Notes
Bu notlar GPS bare-metal yaziliminin VCU118 Rocket SoC portu ve interrupt debug sureci icin yazildi.
Bu notlar GPS bare-metal yaziliminin VCU118/Genesys2 Rocket SoC portunu,
tracking Doppler/C/N0 yolunu, ESKF entegrasyonunu ve interrupt debug surecini
belgeler.
## Uygulama akisi ve dosya sinirlari
@@ -66,6 +68,34 @@ ve raw kuyruga koyar. GPS ISR'leri acquisition/tracking olaylarini kaydeder.
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.
### ESKF entegrasyonunda yapilanlar
- TDK ICM42688 ve ST LSM6DSOX suruculeri sensor-markasindan bagimsiz
`imu_sensor`/`imu_sample_t` sinirinin arkasina alindi. Her IMU ornegi olcum
aninda monotonik CLINT timestamp'i alir; ISR icinde ESKF matematigi
calismaz.
- Filtre ENU position/velocity, quaternion attitude, accel bias ve gyro bias
iceren 15 hata durumlu ESKF'dir. Prediction her ham IMU orneginde midpoint
mechanization ile calisir; telemetry bolucusu prediction oranini dusurmez.
- GPS WLS position ve Doppler velocity ayni capture timestamp'iyle tek
`fusion_navigation_measurement_t` icinde tasinir. Gecikmis GPS olcumu
history icindeki kendi epoch'una uygulanir; sonraki IMU ornekleri current
time'a kadar tekrar oynatilir.
- Position ve velocity update'lerinin ayri 3-DOF NIS kapilari ve
accept/reject sayaclari vardir. Velocity bozuksa ayni epoch'taki gecerli
position update'i geri alinmaz.
- Doppler WLS ECEF velocity covariance'i ENU'ya dondurulur. Kart verisinde
zayif geometrinin formal covariance'i asiri iyimser yapmamasi icin
horizontal `2.0 m/s`, vertical `3.0 m/s` minimum standard deviation floor'u
uygulanir; daha buyuk formal belirsizlik korunur.
- Durağanlik supervisor'u IMU/GNSS hareket kanitlarini histerezisle
birlestirir ve yalniz guvenli durumda ZUPT/zero-gyro update uygular.
GPS kesintisinde sahte position olcumu uretilmez; dead-reckoning devam eder
ve covariance buyur.
- Kotu ilk fix sonraki tutarli fix'leri surekli NIS reject'e kilitlerse,
timeout ve coklu-fix sureklilik kosuluyla yalniz position state/covariance
yeniden ankrajlanir. Velocity, attitude ve IMU bias state'leri korunur.
## Generic IMU Mimarisi (TDK ve ST)
GPS/ESKF artik dogrudan bir sensor surucusune bagli degildir. Veri yolu:
@@ -129,6 +159,23 @@ 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.
Ana proje dizininden Genesys2 MCS uretmek icin:
```sh
# TDK + ESKF; GPS_ESKF_ENABLE verilmezse de varsayilan 1'dir.
make FPGA_BOARD=genesys2 APP=gps_system \
GPS_ESKF_ENABLE=1 IMU_SENSOR=tdk fpga-mcs
# GPS-only: tracking, C/N0, Doppler velocity WLS ve PPS calisir.
make FPGA_BOARD=genesys2 APP=gps_system \
GPS_ESKF_ENABLE=0 fpga-mcs
```
Her iki profil bootloader ve uygulamayi varsayilan `460800` baud ile derler.
Iki komut ayni MCS/BIN yoluna yazdigi icin iki imaj birlikte saklanacaksa
build'ler arasinda profil adiyla kopyalanmalidir. Bu secenekler software
derleme parametresidir; mevcut bitstream ile `fpga-mcs` yeterlidir.
Otomatik WHO_AM_I algilama varsayilandir:
```sh
@@ -446,32 +493,30 @@ Bu kosuda `mcause=5` tekrar etmedi.
## Build ve Debug Komutlari
Build:
Ana dizinden kalici flash imaji:
```sh
make -C /home/ankaoc/Desktop/rocket/rocket-chip/soc/software/gps_system \
BUILD_DIR=/home/ankaoc/Desktop/rocket/rocket-chip/soc/out/software/gps_system \
clean all
make FPGA_BOARD=genesys2 APP=gps_system \
GPS_ESKF_ENABLE=1 IMU_SENSOR=tdk fpga-mcs
```
OpenOCD:
```sh
make -C /home/ankaoc/Desktop/rocket/rocket-chip fpga-debug-openocd
make FPGA_BOARD=genesys2 fpga-debug-openocd
```
ELF'i RAM'e yukleyip calistirma:
```sh
/tools/toolchains/rvtc-medany/bin/riscv64-unknown-elf-gdb \
-q /home/ankaoc/Desktop/rocket/rocket-chip/soc/out/software/gps_system/gps_system.elf \
-ex "target extended-remote :3333" \
-ex "monitor reset halt" \
-ex "load" \
-ex "set \$pc = _start" \
-ex "monitor resume" \
-ex "detach" \
-ex "quit"
make FPGA_BOARD=genesys2 APP=gps_system \
GPS_ESKF_ENABLE=1 IMU_SENSOR=tdk fpga-debug-load
```
UART:
```sh
make FPGA_BOARD=genesys2 fpga-uart
```
Durum okumak icin claim register'ini okumadan:
@@ -749,6 +794,13 @@ Gecersiz oranlar reddedilir; sonuc `10..60 dB-Hz` araliginda sinirlanir.
Bir-bit estimator jitter'i ayni PRN'in ard arda olcumlerinde software
IIR'i ile `alpha=0.2` kullanilarak yumusatilir.
RTL snapshot, synchronizer, APB register ve measurement-interrupt ayrintilari
`hardware/external/gps/rtl/trck_src/README.md` icinde belgelenir. Ozetle
payload tracking domaininde yaklasik 20 ms sabit tutulur; valid ve tum alanlar
PCLK'e registered synchronizer ile alinir, iki ek settle cycle'dan sonra
atomik APB bankina kopyalanir. Software sequence-before/payload/sequence-after
okumasiyla coherence'i tekrar dogrular.
Carrier register'i signed Q7 toplam NCO frekansidir. Doppler ve range-rate
donusumu: