如何在 swift 中使用加速度计和重力检测苹果手表位置



我正在为Apple Watch创建一个应用程序。逻辑是,当用户举手并点击应用程序中的按钮时。届时我将获取加速度计值。每当用户举手并遇到捕获的位置时,我都必须向iPhone发送消息。

对我来说,我正确获取了值但是,它将始终根据加速度计给出值。这意味着用户不会举手,但加速度计值匹配。因此,值将发送到移动设备。

func startUpadateAccelerometer() {
        self.motionManager.accelerometerUpdateInterval = 1.0 / 10.0
        self.motionManager.startAccelerometerUpdates(to: OperationQueue()) { (accelerometerData, error) -> Void in
            guard accelerometerData != nil else
            {
                print("There was an error: (String(describing: error))")
                return
            }
            DispatchQueue.main.async {
                if(self.can_reset){
                    let differenceX : Bool = self.validateButtom(currentValue: accelerometerData!.acceleration.x, inititalValue: self.gravityReference.x)
                    let differenceY : Bool = self.validateButtom(currentValue: accelerometerData!.acceleration.y, inititalValue: self.gravityReference.y)
                    if(differenceX && differenceY && self.gravityOffsetDifference(currentValue: accelerometerData!.acceleration.x, referenceValue: self.gravityReference.x ) && self.gravityOffsetDifference(currentValue: accelerometerData!.acceleration.y, referenceValue: self.gravityReference.y)){
                        WKInterfaceDevice().play(.success)
//                        self.addLog(_logStr: EventsTypes.Achievements1.rawValue)
                        self.logString += String(format: "X: %0.3f Y: %0.3f Z: %0.3f  n", accelerometerData!.acceleration.x,accelerometerData!.acceleration.y,accelerometerData!.acceleration.z)
                        self.m_XYZValueLbl.setText(self.logString)
                        self.is_RechedZeroPos = true
                        self.session?.sendMessage(["msg" : "(self.logString)"], replyHandler: nil) { (error) in
                            NSLog("%@", "Error sending message: (error)")
                        }
                    } else {
                        if(self.checkAchievements2_3(deviceMotionData: accelerometerData!.acceleration) == true) {
                            if self.is_RechedZeroPos == true {
                                self.addLog(_logStr: EventsTypes.Achievements2.rawValue)
                                self.is_RechedZeroPos = false
                            } else {
                                self.addLog(_logStr: EventsTypes.Achievements3.rawValue)
                            }
                        }
                    }
                } else {
                    self.gravityReference = accelerometerData!.acceleration
                    //self.logString = String(format: "Reference Acceleration   %0.3f   %0.3f   %0.3f  n", self.gravityReference.x,self.gravityReference.y,self.gravityReference.z)
                    self.can_reset = true
                }
            }
        }
    }
func validateButtom(currentValue : Double , inititalValue : Double) -> Bool {
        if( currentValue == 0 && inititalValue == 0) {
            return true
        } else if( currentValue < 0 && inititalValue < 0) {
            return true
        } else if( currentValue > 0 && inititalValue > 0) {
            return true
        } else {
            return false
        }
    }

 func gravityOffsetDifference(currentValue : Double , referenceValue: Double) -> Bool {
        var difference : Double!
        if (fabs(currentValue) <= fabs(referenceValue)) {
            difference = fabs(referenceValue) - fabs(currentValue)
        } else {
            difference = fabs(currentValue) - fabs(referenceValue)
        }
        if (difference <= gravityOffset ) {
            return true
        } else {
            return false
        }
    }

请指导我仅在用户捕获位置时才获取值。

加速度计测量沿 x、y 和 z 轴的速度变化

获取加速度计数据

let motion = CMMotionManager()
func startAccelerometers() {
    // Make sure the accelerometer hardware is available.
    if self.motion.isAccelerometerAvailable {
        self.motion.accelerometerUpdateInterval = 1.0 / 60.0  // 60 Hz
        self.motion.startAccelerometerUpdates()
        // Configure a timer to fetch the data.
        self.timer = Timer(fire: Date(), interval: (1.0/60.0),
                           repeats: true, block: { (timer) in
                               // Get the accelerometer data.
                               if let data = self.motion.accelerometerData {
                                   let x = data.acceleration.x
                                   let y = data.acceleration.y
                                   let z = data.acceleration.z
                                   // Use the accelerometer data in your app.
                               }
                           })
        // Add the timer to the current run loop.
        RunLoop.current.add(self.timer!, forMode: .defaultRunLoopMode)
    }
}

重要

如果你的应用依赖于加速计硬件的存在,请使用加速计值配置其 Info.plist 文件的 UIRequiredDeviceCapabilities 键。有关此键的含义的详细信息,请参阅信息属性列表键引用。

相关内容

  • 没有找到相关文章

最新更新