说明文档及下载链接

涉及文件清单

文件 修改内容概要
InspectorService.kt 隧道惯导死推算法修复、bufferRecord 修复、GPS丢失窗口修复
MainActivity.kt calibrateLine 跳过锚点、外推距离保护、scale 保护、代码重复消除
InspectorDatabase.kt 新增 overwriteMileageLibrary() 事务方法
MileageUtils.kt 公共工具类:calculateMileageValuecalculateDistanceformatMileage

一、隧道惯导死推算修复(InspectorService.kt)

2.1 双重积分路径消除

  • 之前: 同一 onSensorChanged 回调中存在两条积分路径:
    • 路径A:ry - baseGravityY(Y轴纵向加速度)→ 积分 → estimatedIntegralSpeed
    • 路径B:finalH × 9.81(水平总加速度,含离心力)→ 覆盖 filteredLongitudinalAcc再次积分
  • 之后: 删除路径B的积分代码,仅保留路径A(Y轴纵向加速度),使用 coerceIn(0f, 120f) 统一限幅

2.2 死推算定时器位移公式修正

  • 之前: displacementMeters = (v0 * dtSec) + (0.5 * accel * dtSec * dtSec) — 加速度已由传感器积分进入 estimatedIntegralSpeed,又被 ½·a·t² 二次计入
  • 之后: val displacementMeters = currentSpeed * dtSec — 纯匀速模型,加速度积分仅由传感器负责

2.3 lastValidTime 不由死推算更新

  • 之前: 死推算定时器每1秒更新 lastValidTime = currentTime,导致 GPS 短暂闪现后丢失窗口错乱
  • 之后: 注释掉 lastValidTime = currentTime,只更新 lastValidMileage

2.4 bufferRecord 隧道内使用推算速度

val speedForInterpolation = if (isGpsLost) estimatedIntegralSpeed.toDouble() else lastValidSpeed.toDouble()
  • 之前: 始终用 lastValidSpeed(丢失前GPS速度)
  • 之后: 丢失期间用 estimatedIntegralSpeed(实时推算速度)

二、坐标校准逻辑修复(MainActivity.kt)

3.1 calibrateLine 跳过锚点自身

  • 之前: 遍历所有点(含锚点),锚点的精确 calibratedMileage 被插值结果覆盖
  • 之后: if (point.isAnchor) continue — 锚点作为绝对真值,不参与插值

3.2 interpolateCalibratedMileage 外推距离保护

  • 之前: 外推时直接加偏移量,锚点范围外的点被平移校准(大距离下严重失准)
  • 之后: if (dist < 5.0) 时才平移校准,否则回退到原始 GPS 推算值

3.3 finishMapping scale 零值与负值保护

val scale = when {
    totalGeoDist <= 0 -> 1.0
    totalMileageDiff <= 0 -> 1.0
    else -> totalMileageDiff / totalGeoDist
}
  • 之前: if (totalGeoDist > 0) ... else 1.0 — 没检查 totalMileageDiff 负值
  • 之后: 双条件保护,避免用户输入反向里程导致校准崩溃

3.4 重复代码抽取到 MileageUtils

MainActivity.kt 原有的 calculateMileageValuecalculateDistanceformatMileage 三函数全部删除,改为调用 MileageUtils.*


三、公共工具类(MileageUtils.kt — 新建)

object MileageUtils {
    fun formatMileage(v: Double): String     // Kxxx+xxx 格式
    fun calculateDistance(lat/lng...): Double // Haversine 公式
    fun calculateMileageValue(lat, lng, refs, lastM): Double
}

改进:

  • calculateMileageValue 新增 lastM 参数(默认 0.0),无匹配点时返回 lastM 而非 0.0,防止里程跳回 K0+000
  • 两文件统一调用,一处修改两端生效

四、导入覆盖逻辑修复(InspectorDatabase.kt)

5.1 新增 overwriteMileageLibrary() 事务方法

@Transaction
suspend fun overwriteMileageLibrary(refs: List<MileageReference>) {
    val pairs = refs.map { it.lineName to it.lineDirection }.distinct()
    pairs.forEach { (name, dir) -> deletePointsByLine(name, dir) }
    insertMileageRefs(refs)
}
  • 之前: 覆盖模式只删除 refs.first() 的单条线路,删除+插入无事务保护
  • 之后: 全部 coverage + @Transaction 原子性保证