2017-11-02 21 views
0

加速度データを絶対的な垂直軸(地面から床まで)でアクセスしたいアプリケーションを作成していますが、CoreMotionで取得できるのは、デバイスの相対軸からの加速度。たとえば、デバイスがテーブル上に平らに置かれている場合、垂直軸は実際には絶対垂直軸から90°です。絶対縦軸加速度の検出

これを修正しようとするとジャイロデータを再生していますが、データは意味をなさないものです。

// Make sure the accelerometer hardware is available. 
    if self.motion.isAccelerometerAvailable && self.motion.isDeviceMotionAvailable { 
     self.motion.accelerometerUpdateInterval = 1.0/Double(slider.value) // Hz managed by slider 
     self.motion.startAccelerometerUpdates() 
     self.motion.startDeviceMotionUpdates(using: self.motion.attitudeReferenceFrame) 
     self.motion.deviceMotionUpdateInterval = 1.0/Double(slider.value) 



     // Configure a timer to fetch the data. 
     self.timer = Timer(fire: Date(), interval: (1.0/Double(slider.value)), 
          repeats: true, block: { (timer) in 
          // Get the gyroscope data. 

          if let data = self.motion.deviceMotion { 
           //Angles: pitch 
           pitch = data.attitude.pitch 
           print("Pitch angle: \(self.degrees(radians: pitch))") 

            //Angles: yaw 
           yaw = data.attitude.yaw 
           print("Yaw angle: \(self.degrees(radians: yaw))") 
          } 

          //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. 
           self.label.text = "x: \(x)" 
           let xCorrectedWithPitch = cos(self.degrees(radians: pitch)) * x 
           print("x: \(x)\nPitch: \(pitch)\nxCorrectedWithPitch: \(xCorrectedWithPitch)") 
           let xCorrectedWithYaw = cos(self.degrees(radians: yaw)) * xCorrectedWithPitch 
           print("x: \(x)\nYaw: \(yaw)\nxCorrectedWithYaw: \(xCorrectedWithYaw)") 

           // Use the accelerometer data in your app. 

           self.accelArrayY.append(xCorrectedWithYaw*9.81) 
           time = time + timer.timeInterval 
           self.timeArrayY.append(time) 


          } 

誰も助けにはあまり

答えて

2

CMMotionMagagerはあなたにiPhoneの軸とも重力の方向についての加速を与えていただければ幸いです。これらの2つを掛け合わせることで、地球からの加速度を計算することができます。この乗算の結果の長さです。私はRay Wenderlichの3D Vector utilsを使用しています。あなたのGameViewControllerで

:GameViewController.viewDidLoadで

var motionManager: CMMotionManager! 

:GameSceneで

motionManager = CMMotionManager() 
    motionManager.startDeviceMotionUpdates() 

:運動の方向を知ることが

override func update(_ currentTime: TimeInterval) { 

    if let deviceMotion = motionManager.deviceMotion { 

    let gravityVector = Vector3(x: CGFloat(deviceMotion.gravity.x), 
           y: CGFloat(deviceMotion.gravity.y), 
           z: CGFloat(deviceMotion.gravity.z)) 

    let userAccelerationVector = Vector3(x: CGFloat(deviceMotion.userAcceleration.x), 
             y: CGFloat(deviceMotion.userAcceleration.y), 
             z: CGFloat(deviceMotion.userAcceleration.z)) 

    // Acceleration to/from earth 
    let zVector = gravityVector * userAccelerationVector 
    let zAcceleration = zVector.length() 
    } 

sign(Double(zVector.x * zVector.y * zVector.z)) 

もう必要がないときは、.stopDeviceMotionUpdates()を呼び出すことを忘れないでください。

+0

ありがとうエリック、多くのありがとう!しかし、私は '未解決の識別子Vector3の使用'を得ています。私はGameSceneを使用していないことに注意してください。アプリは物理的なアクティビティトラッカーのようなものですから。私はそれをどのように宣言すべきですか?これを修正するために何かインポートする必要がありますか?ありがとう! – CarlosBF

+0

もう一度、私はRay WenderlichのUtilsを見つけました。私はVector3の拡張機能とパブリック関数を正常にインポートしました。しかし、私はまだあなたのコードの最後の部分が記号を検出するために構築することはできません。まず、私は '未解決の識別子のサインを使う'が得られますが、SceneKitをインポートすることでそれを修正しました。しかし問題は、 "タイプCGFloatの値にメンバーxがない"ということです。私はzVector.xを使ってzAcceleration.xを変更しました。それは実行されますが、それが正常かどうかわかりません。 – CarlosBF

+1

うれしいことに助けてください。あなたは正しい、それはzVectorでなければならない。切り取ってペーストしたもの...元の回答で変更しました –