新增原始数据一步导出到 combined:对齐 Lidar-IMU 导出入口,适配 H32/G90/N300

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
lichun.qu
2026-08-03 16:08:37 +08:00
co-authored by Cursor
parent 24eaa8508e
commit 13624b0be8
14 changed files with 1600 additions and 130 deletions
+35
View File
@@ -131,6 +131,39 @@ def parse_heading(line: str) -> dict:
}
def parse_pvtslna(line: str) -> dict:
"""Parse Unicore/G90 ``#PVTSLNA`` into GGA-compatible position fields.
``fix_quality`` is synthesized as 4 when checksum-valid coordinates exist so
the existing prepare gate (accepted fixes {4,5}) keeps working. Position
stddevs are retained for audits.
"""
star = line.rfind("*")
fields = line[1:star if star >= 0 else None].split(",")
if len(fields) < 16:
raise ValueError("PVTSLNA has too few fields")
tow = safe_float(fields[5])
return {
"type": "PVTSLNA",
"gnss_week": safe_int(fields[4]),
"gnss_tow_ms": int(tow) if tow is not None else None,
"altitude_m": safe_float(fields[10]),
"lat_deg": safe_float(fields[11]),
"lon_deg": safe_float(fields[12]),
"height_std_m": safe_float(fields[13]),
"latitude_std_m": safe_float(fields[14]),
"longitude_std_m": safe_float(fields[15]),
# Downstream prepare still filters on NMEA-style fix quality.
"fix_quality": 4,
"satellites": -1,
"hdop": None,
"differential_age_s": None,
"position_time_utc": "",
"geoid_separation_m": None,
"station_id": "",
}
def chunk_source(chunks: list[RawChunk], offset: int, end: int) -> dict:
first = chunks[0]
last = chunks[-1]
@@ -184,6 +217,8 @@ def parse_rtk_capture(capture: CaptureFile) -> list[dict]:
try:
if line.startswith("$GNGGA") or line.startswith("$GPGGA"):
row.update(parse_gga(line))
elif line.startswith("#PVTSLNA"):
row.update(parse_pvtslna(line))
elif line.startswith("#UNIHEADINGA"):
row.update(parse_heading(line))
except ValueError as ex: