положение пользователя по данным акселерометра - PullRequest
0 голосов
/ 30 октября 2018

Задача состоит в том, чтобы получить положение пользователя по данным из акселерометра относительно исходного положения. У меня есть два массива: интегрированные значения (для сохранения скоростей) и интегрированные значения2 (для позиций), и я сначала добавляю нулевые начальные условия к этим массивам. Затем я получаю данные coremotion и два раза передаю вектор usececeleration в функции интегрирования, чтобы получить позицию:


Основная часть выглядит так:

 if(self.onButClickedFirstTime) {
                                self.initialFrame = dmData.attitude
                                self.onButClickedFirstTime = false
                                self.currentRotationMatrix = dmData.attitude.rotationMatrix
                                self.curAttitude = dmData.attitude
                            }

                            var calculatedAcceleration = self.multiplyMatrixOnVector(rotMat:
                                dmData.attitude.rotationMatrix, acceleration: [Double](arrayLiteral: dmData.userAcceleration.x,
                                                                                       dmData.userAcceleration.y,
                                                                                       dmData.userAcceleration.z)
                            )

                            for index in 0 ..< 3{
                                if(calculatedAcceleration[index] > -0.1 && calculatedAcceleration[index] < 0.1) {
                                    calculatedAcceleration[index] = 0.0
                                }

                            }

                            self.calculatedAccelerations.append(calculatedAcceleration)
                            if(self.calculatedAccelerations.count >= 2) {
                                //receive velocity in integratedValues array
                                self.integratedValues.append(self.trapezoid())
                                //receive position in integratedValues array
                                self.integratedValues2.append(self.trapezoid2())
                            }
                            else {
                                //receive velocity in integratedValues array
                                self.integratedValues.append(self.rectangle())
                                //receive position in integratedValues array
                                self.integratedValues2.append(self.rectangle2())
                            }

интегрирующие функции

func trapezoid() -> [Double]{
    let step = 0.01
    var innerArray:[Double] = [Double].init(repeating: 0, count: 3)

    for k in 0..<3 {

        innerArray[k] =  integratedValues[integratedValues.count-1][k] + (step/2.0)*(calculatedAccelerations[calculatedAccelerations.count-2][k] + calculatedAccelerations[calculatedAccelerations.count-1][k])
    }
    return innerArray
}

func rectangle() -> [Double]{
    let step:Double = 0.01
    var temporary:[Double] = [Double].init(repeating: 0, count: 3)
    for k in 0..<3 {

        temporary[k] =  integratedValues[integratedValues.count-1][k] + (step*calculatedAccelerations[calculatedAccelerations.count-1][k])
    }
    return temporary
}

Это не работает. Я получаю значения координат (x, y или z), которые по отдельности увеличиваются или уменьшаются все время после первого перемещения телефона. Например, x и y увеличиваются, z уменьшается постоянно:

x: 2.45885665392312 y: 12.0701960347246 z: -7,70172802770194

x: 2,46064406756483 y: 12.0903748004539 z: -7,71571460119331

x: 2.46241602875171 y: 12.1105587446889 z: -7,72968592982189

x: 2,46418465445463 y: 12.1307452781769 z: -7,74362066535627

x: 2,4659587846542 y: 12.1509318116648 z: -7,75751655337187

Что я делаю не так? Спасибо.

...