几个关键值:THRESHOLD_MAX,THRESHOLD,THRESHOLD_MIN,mMotionManager.accelerometerUpdateInterval(更新周期),TIMES
刹车的反应快慢可根据上述值来调整。
同样逻辑安卓也可实现,上述关键值需调整。
private var mMotionManager: CMMotionManager!
private let THRESHOLD_MAX: Double = 1.0 //Android 20.0
private let THRESHOLD: Double = 0.1 //Android 4.0
private let THRESHOLD_MIN: Double = 0.1 //Android 1
private let TIMES = 5
//端末が実際に取得した加速度値。重力加速度も含まれる。This values include gravity force.
private var currentOrientationValues: [Double] = [ 0.0, 0.0, 0.0 ]//ローパス、ハイパスフィルタ後の加速度値 Values after low pass and high pass filter
private var currentAccelerationValues: [Double] = [ 0.0, 0.0, 0.0 ]
//diff 差分
private var dx: Double = 0.0
private var dy: Double = 0.0
private var dz: Double = 0.0
private var vectorSize: Double = 0
private var vectorSize_max: Double = 0
private var counter: Int64 = 0
private var counted = false
private var noiseflg = true
func startSensor() {
// MotionManagerを生成.
mMotionManager = CMMotionManager()
// 更新周期设定,周期越短反应越快
mMotionManager.accelerometerUpdateInterval = 0.1
// 加速度の取得を開始.
mMotionManager.startAccelerometerUpdatesToQueue(NSOperationQueue.mainQueue(), withHandler: {(accelerometerData:CMAccelerometerData?, error: NSError?) -> Void in
let x = accelerometerData!.acceleration.x
let y = accelerometerData!.acceleration.y
let z = accelerometerData!.acceleration.z
/* ローパスフィルタで重力値を抽出(重力の影響だけが残る) */
self.currentOrientationValues[0] = x * 0.1 + self.currentOrientationValues[0] * (1.0 - 0.1)
self.currentOrientationValues[1] = y * 0.1 + self.currentOrientationValues[1] * (1.0 - 0.1)
self.currentOrientationValues[2] = z * 0.1 + self.currentOrientationValues[2] * (1.0 - 0.1)
/* ハイパスフィルタで重力値を省く(重力の影響が取り除かれる=瞬間的な加速度がわかる) */
self.currentAccelerationValues[0] = x - self.currentOrientationValues[0]
self.currentAccelerationValues[1] = y - self.currentOrientationValues[1]
self.currentAccelerationValues[2] = z - self.currentOrientationValues[2]
/* ベクトル値を求めるために差分を計算 */
self.dx = self.currentAccelerationValues[0]
self.dy = self.currentAccelerationValues[1]
self.dz = self.currentAccelerationValues[2]
/* ベクトル値計算 */
self.vectorSize = sqrt(Double(self.dx * self.dx + self.dy * self.dy + self.dz * self.dz))
if(self.noiseflg){
self.noiseflg = false
}
else{
if(self.vectorSize > self.THRESHOLD) {
if (self.counted) {
self.counter++
self.counted = false
if(self.vectorSize > self.vectorSize_max) {
self.vectorSize_max = self.vectorSize
}
}
else if(!self.counted){
self.counted = true
}
}
else if(self.vectorSize < self.THRESHOLD_MIN) {
if( (TIMES < self.counter) && (self.vectorSize_max > self.THRESHOLD_MAX) ) {
// 急刹车后处理
}
self.vectorSize_max = 0
self.counter = 0
}
}
})
}