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

几个关键值: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
                }
            }
            
        })
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值