Задача состоит в том, чтобы получить положение пользователя по данным из акселерометра относительно исходного положения. У меня есть два массива: интегрированные значения (для сохранения скоростей) и интегрированные значения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
Что я делаю не так? Спасибо.