Как сделать большинство RecentLocation.horizontAccuracy и hcKalmanFilter? .RValue редактируемыми текстовыми полями? стриж - PullRequest
0 голосов
/ 26 августа 2018

Я создаю приложение для отслеживания и обнаружил, что должен отфильтровать необработанные данные GPS, поэтому я использую фильтр Калмана, и он действительно сглаживает получающееся в результате отслеживание.Итак, я точно настраиваю два параметра, и чтобы иметь возможность изменять эти параметры на ходу с iPhone, я добавил два текстовых поля @IBOutlet weak var filterValueTextField: UITextField! и @IBOutlet weak var horizontalAccuracyTextField: UITextField!и я хочу подключить их к параметрам hcKalmanFilter?.rValue = 40.0 и guard mostRecentLocation.horizontalAccuracy < 60 else { return }.Я пробовал разные способы, но получаю ошибку:

Невозможно вызвать инициализатор для типа 'Double' со списком аргументов типа '(String?)' При этой попытке: guard mostRecentLocation.horizontalAccuracy < Double(horizontalAccuracyTextField.text) else { return }

Это функция:

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {


        hcKalmanFilter?.rValue = 40.0

        guard let mostRecentLocation = locations.last else { return }
        guard mostRecentLocation.horizontalAccuracy > 0 else { return }
        guard mostRecentLocation.horizontalAccuracy < 60 else { return }

        guard mostRecentLocation.horizontalAccuracy < horizontalAccuracy else { return }



        var myLocation: CLLocation = mostRecentLocation

        if hcKalmanFilter == nil {
            self.hcKalmanFilter = HCKalmanAlgorithm(initialLocation: myLocation)
        }
        else {
            if let hcKalmanFilter = self.hcKalmanFilter {
                if resetKalmanFilter == true {
                    hcKalmanFilter.resetKalman(newStartLocation: myLocation)
                    resetKalmanFilter = false
                }
                else {
                    let kalmanLocation = hcKalmanFilter.processState(currentLocation: myLocation)
                    self.actualRouteInUseCoordinatesArray.append(kalmanLocation.coordinate)
                }
            }
        }
    }

Я пытался обработать это так после того, как @maddy советует:

var filterValue:Double = 40.0
        guard let filterAmount:String? = filterValueTextField.text! else  {return}
        filterValue = Double(filterAmount)!
        hcKalmanFilter?.rValue = filterValue

, но я все еще получаю ошибку: Невозможно вызвать инициализатор для типа 'Double' ссписок аргументов типа '(String?)'

1 Ответ

0 голосов
/ 29 августа 2018

Итак, после всех советов и исправлений передовой практики, функция выглядит следующим образом:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    let filterValue = Double(filterValueTextField.text!)!
    hcKalmanFilter?.rValue = filterValue

    let horizontalAccuracy = Double(horizontalAccuracyTextField.text!)!
    let verticalAccuracy = Double( verticalAccuracyTextField.text!)!

     // make sure to get last location
    guard let mostRecentLocation = locations.last else { return }
    //make sure that it's a valid gps signal ( vertical -1 = no gps triangulation )
    guard mostRecentLocation.horizontalAccuracy > 0 else { return }
    guard mostRecentLocation.verticalAccuracy > 0 else { return }

    // check angainst fine tuning parameters, filtering out locations with errors greater than values
    guard mostRecentLocation.horizontalAccuracy < horizontalAccuracy else { return }
    guard mostRecentLocation.verticalAccuracy < verticalAccuracy else { return }

    // passing the surviving locations to kalman filter for further filtering aiming for precision
    var myLocation: CLLocation = mostRecentLocation

    if hcKalmanFilter == nil {
        self.hcKalmanFilter = HCKalmanAlgorithm(initialLocation: myLocation)
    }
    else {
        if let hcKalmanFilter = self.hcKalmanFilter {
            if resetKalmanFilter == true {
                hcKalmanFilter.resetKalman(newStartLocation: myLocation)
                resetKalmanFilter = false
            }
            else {
                let kalmanLocation = hcKalmanFilter.processState(currentLocation: myLocation)
                self.actualRouteInUseCoordinatesArray.append(kalmanLocation.coordinate)
            }
        }
    }
}
...