gpt4 book ai didi

ios - iOS 加速度计的高通滤波器方程未返回良好结果

转载 作者:行者123 更新时间:2023-12-01 18:10:45 25 4
gpt4 key购买 nike

我正在尝试基于 Accelerometer Graph project 为 iOS 加速度计实现高通滤波器.代码是用 Swift 编写的,这里是完整的类:

import Foundation
import CoreMotion
import SpriteKit

class Accelerometer {

let motionManager: CMMotionManager

var x: Double
var y: Double
var z: Double
var lastX: Double
var lastY: Double
var lastZ: Double
let kUpdateFrequency: Double
let cutOffFrequency: Double
let dt: Double
let RC: Double
let alpha: Double
let kFilteringFactor = 0.6


init(manager: CMMotionManager){

motionManager = manager
motionManager.accelerometerUpdateInterval = 1.0 / 60
motionManager.startDeviceMotionUpdates()

x = 0.0
y = 0.0
z = 0.0
lastX = 0.0
lastY = 0.0
lastZ = 0.00
kUpdateFrequency = 60.0
cutOffFrequency = 5.0
dt = 1.0 / kUpdateFrequency
RC = 1.0 / cutOffFrequency
alpha = RC / (dt+RC)
getAccelerometerUpdates()

}

func getAccelerometerUpdates() {

motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue(), withHandler: { (data, error) -> Void in

// Filter the raw measurments with high pass filter
self.highPassFilter(data!)
})

}


// High pass filter function for accelerometer measurments
func highPassFilter(data: CMAccelerometerData){

self.x = self.alpha * (self.x + data.acceleration.x - self.lastX)
self.y = self.alpha * (self.y + data.acceleration.y - self.lastY)
self.z = self.alpha * (self.z + data.acceleration.z - self.lastZ)

self.lastX = data.acceleration.x
self.lastY = data.acceleration.y
self.lastZ = data.acceleration.z

}

}

该类是涉及 SpriteKit 和 CoreLocation 的项目的一部分,因此我从该类中删除了一些部分,因为它们不相关。这段代码的问题在于它不像 Apple 给出的示例那样工作。在加速度计图中,当手机静止并且对移动非常敏感时,所有值都等于 0,这是高通滤波器所期望的,但是在我的情况下,当手机不移动时,这些值并不总是 0,它们需要时间来改变(即使是非常剧烈的摇晃),最后通常需要几秒钟才能稳定下来。简而言之,它的行为更像是低通或卡尔曼滤波器,而不是高通滤波器。由于它是一个 SpriteKit 项目,我也尝试从 GameScene.swift 文件中调用加速度计更新,但结果是相同的。我还尝试了重力,尝试了 startDeviceMotionUpdatesToQueue 和 startDeviceMotionUpdatesToQueue 函数,但没有运气。

最佳答案

问题是您使用应用程序的主队列来更新加速度计。主队列用于对 UI 进行更改。使用主队列进行加速度计更新会使主队列过载,因此并非每个操作在提交到 NSOperationQueue 后都会立即执行。
解决办法是新建一个NSOperationQueue

let queue = NSOperationQueue()

并将其传递给 motionManager.startAccelerometerUpdatesToQueue 而不是 NSOperationQueue.mainQueue() .
如果你想在motionHandler中对你的用户界面进行更改,你必须使用gcd的
dispatch_async(dispatch_get_main_queue() {
//perform UI changes here
}

关于ios - iOS 加速度计的高通滤波器方程未返回良好结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31975885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com