您的位置:首页 > 移动开发 > IOS开发

ios传感器测试-急刹车动作模拟

2016-02-19 09:40 477 查看
几个关键值: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

                }

            }

            

        })

    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息