1

Swift でロール、ピッチ、ヨーを正しく返すための構文を正しく取得するのに苦労しています。加速度計はすべて正常に動作しますが、これを整理できません。材料コードは次のとおりです。

var roll: Double    = 0.0
var pitch: Double   = 0.0
var yaw: Double     = 0.0    
var manager         = CMMotionManager()

override func viewDidLoad() {
     manager.startDeviceMotionUpdatesToQueue(NSOperationQueue.currentQueue()!, withHandler: { (rpyData: CMDeviceMotionHandler?, NSError) -> Void in self.outputRPY(rpyData!.deviceMotion)
     if(NSError != nil) {
          print("\(NSError)")
     }
   })
}

func outputRPY(data: CMDeviceMotion){
    roll    = data.attitude.roll
    pitch   = data.attitude.pitch
    yaw     = data.attitude.yaw
    rollLabel.text  = String(format: "%.2f°", roll)
    pitchLabel.text = String(format: "%.2f°", pitch)
    rollLabel.text  = String(format: "%.2f°", yaw)
}
4

2 に答える 2

1

2 番目のパラメーターの型は NSError である必要がありますか? (別名オプション)クロージャーの本体では、型を値と比較しています。

全体として、次のようになります。

manager.startDeviceMotionUpdatesToQueue(NSOperationQueue.currentQueue()!, withHandler: { (deviceMotion: CMDeviceMotion?, err: NSError?) -> Void in 
    self.outputRPY(deviceMotion!)
    if(err != nil) {
        print("\(err)")
    }
}

オプションのバインディングを使用して、より迅速にすることもできます... :)

if error = err {
    print("\(error)")
}

編集

自宅のマシンでテストした後、もう 1 つ問題があることに気付きました。CMDeviceMotionHandlerクロージャーの型 (または必要に応じて関数ポインター) を宣言します。次のように宣言されています。

public typealias CMDeviceMotionHandler = (CMDeviceMotion?, NSError?) -> Void

したがって、クロージャー(またはハンドラー)は次のようになります。

{ (deviceMotion: CMDeviceMotion?, error: NSError?) -> Void in
    // code goes here
}

最後に、2 番目のパラメーターは、識別子NSErrorが既に型である場合に変数を参照するようにします (これは有効です)。type と混同しやすいので、個人的にはそのような名前にはしませんNSError。という名前を付けるとnserror、既存の型との混乱を避けることができます。

最初のコード スニペットは、プロジェクトにコピー アンド ペーストするだけです。

于 2016-01-27T20:30:39.217 に答える
1

私を悩ませていたのは、ロール、ピッチ、ヨーが、加速度計、ジャイロ、磁力計とは異なる働きをしているように見えるということです。プレスコードからの新鮮なものは次のとおりです。

 var manager         = CMMotionManager()

 override func viewDidLoad() {   
    super.viewDidLoad()
    manager.deviceMotionUpdateInterval  = 0.2
    manager.startDeviceMotionUpdatesToQueue(NSOperationQueue.currentQueue()!, withHandler: {(motionData: CMDeviceMotion?, NSError) -> Void in self.outputRPY(motionData!)
        if (NSError != nil){
            print("\(NSError)")
        }
    })
 }

 func outputRPY(data: CMDeviceMotion){
    let rpyattitude = manager.deviceMotion!.attitude
    roll    = rpyattitude.roll * (180.0 / M_PI)
    pitch   = rpyattitude.pitch * (180.0 / M_PI)
    yaw     = rpyattitude.yaw * (180.0 / M_PI)     
    rollLabel.text  = String(format: "%.2f°", roll)
    pitchLabel.text = String(format: "%.2f°", pitch)
    yawLabel.text   = String(format: "%.2f°", yaw)
}
于 2016-01-28T21:48:16.330 に答える