iPhone でジャイロスコープを使用する際に助けが必要です。特定の状況でのピッチ、ロール、ヨーに関する CMAttitude の読み取り値を理解できません。
これは私のコードです
- (void)handleDeviceMotion:(CMDeviceMotion*)motion {
NSLog(@"Yaw %f ",attitude.yaw * 180 / M_PI);
NSLog(@"Pitch %f ",attitude.pitch * 180 / M_PI);
NSLog(@"Roll %f ",attitude.roll * 180 / M_PI);
}
次の図のように、iPhone が平面に横たわっているとします。
ピッチ、ロール、ヨーは (ほぼ) 0 度であり、軸を中心に回転すると、理解できる読み取り値が返されます。たとえば、デバイスを右に回すと、ヨーは減少し、ピッチとロールは 0 のままです。
今、iPhone は次の位置にあります。
そして再び測定開始。
測定値: ヨー = 0、ピッチ = 90、ロール = 0
デバイスがこの軸を中心に回転するため、ピッチが増加します。
iPhone をこの位置に移動します。
測定値: ヨー = 30、ピッチ = 90、ロール = 0
繰り返しになりますが、デバイスはヨー軸を中心に回転するため、この値は変化しますが、他の値は変化しません。
ロール軸を中心にデバイスを移動します。
測定値は、ヨー = 0、ピッチ = 90、ロール = -20 です。
今、私が理解できないこと。次の図のように、半径 R (R > 0) の円の周りで iPhone を移動します。
ヨーは変化しますが、ピッチとロールは変化しません。
ヨーが変わらず、ロールが変わったと思っていたでしょう。
ユーザーが作成したヨー軸を中心とした回転にのみ関心があるため、これをどのように補正できますか?
私が抱えているもう1つの問題はドリフトです。iPhone は 2 番目の図のような位置にあり、手に持って長時間 (1 分以上) 静止しています。ヨーは常に増加します。ドリフトを補正する方法はありますか?
前もって感謝します
更新 Kay の提案に従いましたが、何も変わりません。私のコードの詳細。ユーザーがYaw軸を中心にデバイスを回転させた場合にのみ、Yawを使用してUIImageを回転させたいと思います。これは機能しますが、ユーザーが独自の垂直軸を中心に回転すると、ヨーが変化します。ユーザーが垂直軸を中心に移動すると、デバイスは独自のヨー軸を中心に回転しないため、これは正しくないと思います。私が間違っているかもしれません。これは私の元のコードです:
- (void)handleDeviceMotion:(CMDeviceMotion*)motion {
CMAttitude *attitude = motion.attitude;
NSLog(@"Yaw %f ",attitude.yaw * 180 / M_PI);
NSLog(@"Pitch %f ",attitude.pitch * 180 / M_PI);
NSLog(@"Roll %f ",attitude.roll * 180 / M_PI);
image.transform = CGAffineTransformMakeRotation(-attitude.yaw);
}
これはKayの提案の後のコードです:
- (void)handleDeviceMotion:(CMDeviceMotion*)motion {
CMAttitude *attitude = motion.attitude;
if (startAttitude == 0) {
startAttitude = attitude;
}
[attitude multiplyByInverseOfAttitude:startAttitude];
NSLog(@"Yaw %f ",attitude.yaw * 180 / M_PI);
NSLog(@"Pitch %f ",attitude.pitch * 180 / M_PI);
NSLog(@"Roll %f ",attitude.roll * 180 / M_PI);
image.transform = CGAffineTransformMakeRotation(-attitude.yaw);
}
デバイスモーションの監視を開始します
[motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXArbitraryZVertical toQueue:[NSOperationQueue currentQueue]
withHandler: ^(CMDeviceMotion *motion, NSError *error){
[self performSelectorOnMainThread:@selector(handleDeviceMotion:) withObject:motion waitUntilDone:YES];
}];