11 KiB
GPS code measurement ve DLL kalite modeli
Bu dizin, mevcut firmware/RTL ölçüm yolunu değiştirmeden önce code-phase hassasiyeti, DLL jitter telemetrisi, dinamik WLS sigma ve carrier/Doppler smoothing seçeneklerini aynı sentetik veri üzerinde karşılaştırır.
Bu genel amaçlı bir RF/GNSS simülatörü değildir. Projeye özgü executable tasarım modelidir.
Dizin iki ayrı kararı inceler:
- Position WLS için C/N0'ın açıklamadığı DLL jitter/variance telemetrisi.
- Velocity WLS ve ESKF öncesindeki sabit Doppler IIR'in gürültü-gecikme etkisi.
Modellenen mevcut mimari
| Proje davranışı | Model |
|---|---|
| Normalized early-minus-late DLL discriminator | rtl_dll_model.rtl_discriminator() |
| Signed Q2.13 discriminator quantization | rtl_dll_model.py |
LF_code.sv C1=21.25, C2=0.05712890625 ve Q20 çıkış |
CodeLoopFilterRtl |
| 20 adet 1 ms DLL örneği/NAV bit | synthesize_dll_window() |
Firmware C/N0 IIR, alpha=0.2 |
ChannelQuality.update() |
| URA/elevation/C/N0 position sigma | firmware_sigma_m(CURRENT) |
| ECEF x/y/z + common clock-bias WLS | firmware_wls() |
| 99% chi-square ve en az 7 uyduda leave-one-out FDE | firmware_wls() |
| Position solve periyodu 200 ms | measurement_scenarios.py |
Doppler IIR alpha=0.05, 50 Hz |
doppler_eskf_model.py |
| ECEF velocity + common clock-drift WLS | velocity_wls() |
| Velocity WLS periyodu 200 ms | doppler_eskf_model.py |
| TDK 100 Hz IMU process-noise profili | VelocityBiasEskf |
Velocity 3-DOF %99.9, NIS=16.266236 |
VelocityBiasEskf.update_velocity() |
Kaynak eşlemeleri:
hardware/external/gps/rtl/trck_src/code_loop_discriminator.svhardware/external/gps/rtl/trck_src/LF_code.svhardware/external/gps/rtl/trck_src/NCO_code.svhardware/external/gps/rtl/trck_src/tracking_measurement.svhardware/external/gps/rtl/common/definitions.svsoc/software/gps_system/src/gps/gps_tracking_measurement.csoc/software/gps_system/src/gps/gps_interrupt_handlers.csoc/software/gps_system/src/gps/NavEquations.c
REM_CODE_PHASE, DLL discriminator residual'ı olarak modellenmez. RTL'de bu
değer code NCO'nun epoch taşma remainder'ıdır. Yeni kalite metriğinin girdisi
RTL içindeki gerçek signed dll_error örnekleridir.
Karşılaştırılan sigma politikaları
current_cn0: mevcut URA + elevation + C/N0 modeli.naive_add_dll: DLL variance'ı bağımsızmış gibi ekler. Nominal durumda aynı thermal jitter'ı iki kere saydığı için negatif kontrol olarak bulunur.dll_excess: yalnız ölçülen DLL variance'ın C/N0'dan beklenen variance'ı aşan bölümünü code sigma'ya ekler.dll_excess_guard: excess variance'a ek olarak sürekli discriminator mean stress'inde ağırlığı azaltır.oracle_variance: sentetik gerçek jitter çarpanını bilir. Ulaşılabilir üst sınırı gösterir; firmware algoritması değildir.
Dinamik model:
sigma_base^2 = sigma_URA^2 + sigma_elevation^2 + sigma_CN0^2
ratio = EWMA(measured_DLL_variance / expected_DLL_variance(C/N0))
sigma_dynamic^2 =
sigma_URA^2
+ sigma_elevation^2
+ sigma_CN0^2 * max(1, ratio)
Bu form C/N0 ile DLL thermal jitter'ını iki kere toplamaz. Yalnızca C/N0 modelinin açıklayamadığı kanal-bağımlı excess jitter'ı şişirir.
Senaryolar
- Temiz açık gökyüzü
- Bütün kanallarda düşük C/N0
- C/N0'da görünmeyen tek-kanal DLL jitter
- Bütün kanallarda ortak, C/N0'da görünmeyen DLL jitter
- Gürültü burst ve recovery
- Re-lock sırasında DLL mean/jitter stress
- Düşük-variance stable multipath bias
- Bias + excess jitter
- Kötü geometri + gizli jitter
- İlk başta düşük, sonra iyileşen C/N0
Ayrı 1D model ham code, kör scalar IIR ve Doppler-predicted code smoothing'i
range-rate adımları ve residual carrier CFO altında karşılaştırır. Carrier
ölçümleri RTL cadence'i olan 50 Hz'de üretilir ve 200 ms WLS epoch'una kadar
entegre edilir. Ham, sabit alpha=0.05 ve IMU hareket durumuna göre bant
genişliğini açan adaptif Doppler yolları birlikte denenir. Bu ayrım önemlidir:
PPS datum-drift predictor'u için yararlı olan yavaş Doppler filtresi, ESKF
velocity veya hızlı code-aiding prediction'ında dinamik lag üretebilir; tam
ham snapshot ise kartta ölçülen gürültü seviyesinde fazla varyans üretebilir.
Doppler pre-IIR ve ESKF modeli
doppler_eskf_model.py, aynı truth, tracking gürültüsü ve IMU örnekleriyle şu
dört yolu karşılaştırır:
- Önceki: 50 Hz
alpha=0.05IIR -> 5 Hz velocity WLS -> ESKF. - Ham Doppler -> 5 Hz velocity WLS -> ESKF.
- C/N0 + düşük-geçiren navigation acceleration ile adaptif IIR -> WLS -> ESKF.
- Ham Doppler -> RAIM-benzeri leave-one-out robust WLS -> ESKF.
Mevcut alpha=0.05 tek-kutuplu IIR için 50 Hz'de eşdeğer cutoff yaklaşık
0.408 Hz, zaman sabiti 0.390 s, DC group delay ise yaklaşık 380 ms'dir.
Bu gecikme constant velocity'de görünmez; acceleration sırasında velocity
measurement innovation'ına doğrudan girer.
ESKF modeli bu karar için gerekli [velocity, accel-bias] alt sistemidir.
Firmware'deki TDK process acceleration noise density 0.025 m/s2/sqrt(Hz), accelerometer bias random walk 0.0015 m/s2/sqrt(s), WLS'nin
gerçek 3x3 covariance'ı, fusion adapter'ın 2/2/3 m/s ENU velocity sigma
tabanları ve velocity NIS kapısı kullanılır. Position, attitude, lever-arm ve
tam 15-state cross-covariance bu modelin kapsamında değildir.
Senaryo matrisi sabit uçuş, airliner/aggressive manevra, düşük C/N0, tek-kanal Doppler burst, common receiver clock-drift step, 15 saniye GPS kesintisi ve birleşik arıza koşullarını içerir.
Nominal 20-seed sentetik sonuçların özeti:
- ESKF ham WLS gürültüsünü nominalde yaklaşık
0.416 m/s3D RMS'ten0.190 m/sseviyesine indirir; temporal filtreleme zaten ESKF'de gerçekleşir. - Sabit pre-IIR sakin uçuşta
0.182 m/s, ham yol0.190 m/sverir. Airliner manevrasında sabit IIR gecikmesi sonucu0.416 m/s, ham yol0.190 m/s; aggressive manevrada sırasıyla0.942 m/sve0.190 m/soluşur. Adapter sigma tabanları iki yolu da NIS içinde tutsa bile dinamik lag kalır. - Düşük C/N0 manevrasında adaptif taslak en iyi gürültü/gecikme uzlaşmasını verir; eşikleri firmware'e taşımadan önce kart loguyla kalibre etmek gerekir.
- ESKF yalnız aggregate 3D velocity gördüğünden tek uydu burst'ünün kaynağını ayıramaz. Kanal outlier/FDE işlemi velocity WLS öncesinde yapılmalıdır.
- Common receiver clock-frequency hatası WLS'nin dördüncü clock-drift state'i tarafından hızdan ayrılır.
Genesys2 sabit-kart ölçümünde tam ham yolun velocity-WLS RMS'i 9.17 m/s,
p95'i 16.71 m/s ve FDE oranı 86/120 oldu. Aynı epoch'larda sabit
alpha=0.05 yol 0.92 m/s RMS, 1.63 m/s p95 ve 0/120 FDE verdi. Bu
nedenle nominal modelde iyi görünen doğrudan ham yol production'a alınmadı.
Kart gürültüsünü eşlemek için tracking noise 22x ile kalibre edilen regresyon
modelindeki regresyon seed'leri için steady-7/airliner-3/aggressive-7 fused
RMS değerleri:
- sabit IIR:
0.451 / 0.484 / 1.036 m/s, - adaptif IIR:
0.451 / 0.336 / 0.538 m/s, - tam ham:
1.260 / 1.100 / 1.260 m/s.
Production firmware ESKF için alpha=0.05/0.20/0.40 hareket-adaptif Doppler
-> bandwidth-aware sigma -> kanal validity/FDE -> velocity WLS + covariance
-> ESKF yolunu kullanır. Ham alan tanısal kayıt ve offline analiz için korunur.
Ayrı sabit alpha=0.05 Doppler velocity yalnız PPS position-WLS clock-bias
datumunun drift predictor'u ve PPS kalite metriği için kullanılır. Ayrıntılı
nominal tablo ve model sınırları output/DOPPLER_ESKF_ANALYSIS.md içindedir;
kart-kalibreli karar test_doppler_eskf_model.py ile regresyona alınmıştır.
Kurulum ve çalıştırma
Repo içindeki soc/software dizininden:
python3 -m venv gps_measurement_python/.venv
gps_measurement_python/.venv/bin/pip install \
-r gps_measurement_python/requirements.txt
gps_measurement_python/.venv/bin/python -m unittest \
gps_measurement_python/test_measurement_model.py \
gps_measurement_python/test_doppler_eskf_model.py
gps_measurement_python/.venv/bin/python \
-m gps_measurement_python.analyze_measurement_scenarios \
--seeds 12 --jobs 4
gps_measurement_python/.venv/bin/python \
-m gps_measurement_python.analyze_doppler_eskf \
--seeds 20 --jobs 4
Sistem Python'unda venv paketi yoksa bağımlılıklar izole bir target dizinine
de kurulabilir:
python3 -m pip install --target /tmp/gps-measurement-deps \
-r gps_measurement_python/requirements.txt
PYTHONPATH=/tmp/gps-measurement-deps:. python3 \
-m unittest gps_measurement_python/test_measurement_model.py
PYTHONPATH=/tmp/gps-measurement-deps:. python3 \
-m gps_measurement_python.analyze_measurement_scenarios \
--seeds 12 --jobs 4
Çıktılar gps_measurement_python/output/ altındadır:
scenario_summary.csvANALYSIS.md01_position_3d_rms.png02_solution_availability.png03_noise_burst_transition.png04_code_smoothing_cfo.pngdoppler_eskf_summary.csvDOPPLER_ESKF_ANALYSIS.md05_doppler_eskf_velocity_rms.png06_airliner_maneuver_trace.png07_outlier_wls_nis.png08_low_cn0_wls_vs_eskf.png
Kalibrasyon sınırı
Modelde C/N0'dan beklenen normalized discriminator standard deviation'ı
45 dB-Hz için 0.020 kabul edilir ve firmware ile aynı 20 dB amplitude yasası
ile ölçeklenir. Bu sayı karttan alınmış bir kalibrasyon değildir.
Karar vermeden önce karttan her kanal için en az şu 50 Hz kayıt alınmalıdır:
sequence, PRN, C/N0,
DLL mean, DLL variance, DLL sample count,
code NCO correction, carrier frequency,
ABS_SAMPLE, REM_CODE_PHASE, lock
Kayıtlarla expected_DLL_variance(C/N0) eğrisi çıkarılmalı; temperature,
elevation ve lock yaşına göre ayrıştırılmalıdır. Stable multipath, DLL yeni
denge noktasına oturduğunda düşük variance bırakabilir. Bu durum tek başına
DLL variance ile çözülemez; ek correlator tap'leri veya correlation-shape
metriği gerekir.
RTL için en düşük maliyetli keşif arayüzü, her 20 ms NAV-bit penceresinde
dll_error üzerinden aşağıdaki ham istatistikleri biriktirmektir:
signed sum(error) : 15 + ceil(log2(20)) = 20 bit
unsigned sum(error^2) : 30 + ceil(log2(20)) = 35 bit
valid sample count : 5 bit
35-bit kare toplamı APB'de iki 32-bit register ile taşınabilir. Ortalama,
sample variance, C/N0 expectation ratio ve hysteresis yazılımda hesaplanır.
Bölme ve square-root RTL'ye konmaz. Bu tuple mevcut measurement sequence,
C/N0, carrier frequency, ABS_SAMPLE ve REM_CODE_PHASE ile aynı 20 ms
snapshot'ta tutulmalıdır.