说明文档及下载链接
涉及文件清单
| 文件 | 修改内容概要 |
|---|---|
InspectorService.kt |
隧道惯导死推算法修复、bufferRecord 修复、GPS丢失窗口修复 |
MainActivity.kt |
calibrateLine 跳过锚点、外推距离保护、scale 保护、代码重复消除 |
InspectorDatabase.kt |
新增 overwriteMileageLibrary() 事务方法 |
MileageUtils.kt |
公共工具类:calculateMileageValue、calculateDistance、formatMileage |
一、隧道惯导死推算修复(InspectorService.kt)
2.1 双重积分路径消除
- 之前: 同一
onSensorChanged回调中存在两条积分路径:- 路径A:
ry - baseGravityY(Y轴纵向加速度)→ 积分 →estimatedIntegralSpeed - 路径B:
finalH × 9.81(水平总加速度,含离心力)→ 覆盖filteredLongitudinalAcc→ 再次积分
- 路径A:
- 之后: 删除路径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 原有的 calculateMileageValue、calculateDistance、formatMileage 三函数全部删除,改为调用 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原子性保证
暂无评论