Debuging added
This commit is contained in:
parent
a4ca0d1913
commit
5f46f6ab21
@ -1,83 +0,0 @@
|
||||
package com.dumon.plugin.geolocation.fusion
|
||||
|
||||
import android.util.Log
|
||||
import kotlin.math.*
|
||||
|
||||
class SensorFusionManager(
|
||||
private val onFusedPositionUpdate: (Double, Double) -> Unit = { _, _ -> }
|
||||
) {
|
||||
|
||||
// Kalman filter state
|
||||
private var latEstimate = 0.0
|
||||
private var lonEstimate = 0.0
|
||||
private var latErrorEstimate = 1.0
|
||||
private var lonErrorEstimate = 1.0
|
||||
|
||||
private val processNoiseBase = 0.01
|
||||
private val measurementNoise = 3.0 // typical GPS error in meters
|
||||
|
||||
private var isFirstUpdate = true
|
||||
private var lastUpdateTimestamp: Long = 0L
|
||||
|
||||
private var lastSpeed = 0.0
|
||||
private var lastHeadingRad = 0.0
|
||||
|
||||
fun updateGpsPosition(lat: Double, lon: Double) {
|
||||
val currentTimestamp = System.currentTimeMillis()
|
||||
val dtSeconds = if (lastUpdateTimestamp > 0) {
|
||||
(currentTimestamp - lastUpdateTimestamp) / 1000.0
|
||||
} else {
|
||||
1.0
|
||||
}
|
||||
lastUpdateTimestamp = currentTimestamp
|
||||
|
||||
val processNoise = processNoiseBase * dtSeconds
|
||||
|
||||
if (isFirstUpdate) {
|
||||
latEstimate = lat
|
||||
lonEstimate = lon
|
||||
isFirstUpdate = false
|
||||
} else {
|
||||
// Kalman update for latitude
|
||||
val latKalmanGain = latErrorEstimate / (latErrorEstimate + measurementNoise)
|
||||
latEstimate += latKalmanGain * (lat - latEstimate)
|
||||
latErrorEstimate = (1 - latKalmanGain) * latErrorEstimate + processNoise
|
||||
|
||||
// Kalman update for longitude
|
||||
val lonKalmanGain = lonErrorEstimate / (lonErrorEstimate + measurementNoise)
|
||||
lonEstimate += lonKalmanGain * (lon - lonEstimate)
|
||||
lonErrorEstimate = (1 - lonKalmanGain) * lonErrorEstimate + processNoise
|
||||
}
|
||||
|
||||
Log.d("SENSOR_FUSION", "Fused Lat: $latEstimate, Lon: $lonEstimate")
|
||||
|
||||
onFusedPositionUpdate(latEstimate, lonEstimate)
|
||||
}
|
||||
|
||||
fun updateMotionEstimate(speed: Double, headingRad: Double) {
|
||||
lastSpeed = speed
|
||||
lastHeadingRad = headingRad
|
||||
}
|
||||
|
||||
fun predictForwardPosition(secondsAhead: Double): Pair<Double, Double> {
|
||||
val distance = lastSpeed * secondsAhead
|
||||
val R = 6371000.0
|
||||
|
||||
val deltaLat = (distance * cos(lastHeadingRad)) / R
|
||||
val deltaLon = (distance * sin(lastHeadingRad)) / (R * cos(Math.toRadians(latEstimate)))
|
||||
|
||||
val predictedLat = latEstimate + Math.toDegrees(deltaLat)
|
||||
val predictedLon = lonEstimate + Math.toDegrees(deltaLon)
|
||||
|
||||
return Pair(predictedLat, predictedLon)
|
||||
}
|
||||
|
||||
fun reset() {
|
||||
latEstimate = 0.0
|
||||
lonEstimate = 0.0
|
||||
latErrorEstimate = 1.0
|
||||
lonErrorEstimate = 1.0
|
||||
isFirstUpdate = true
|
||||
lastUpdateTimestamp = 0L
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user