質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

1744閲覧

CMMotionManagerを使ってpitch角度を取得したい。

Masa_teratail

総合スコア9

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2021/03/13 16:17

編集2021/03/14 09:00

iPhoneを使って、角度を計測をしたいと考えています。
以下のようなコードで動きの始点と終点でそれぞれのroll, pitch, yawの角度を取得し、始点・終点の差から端末が動いた角度を算出したいと考えています。

Swift5

1 func startMotionManager(){ 2 3 guard motionManager.isDeviceMotionAvailable else { return } 4 5 motionManager.deviceMotionUpdateInterval = 1 6 7 motionManager.startDeviceMotionUpdates( 8 using: .xArbitraryCorrectedZVertical, 9 to: OperationQueue.current!, 10 withHandler: { 11 [weak self] (motion, error) in 12 guard let motion = motion, error == nil else { return } 13 14 self?.currentXAngle = Int(motion.attitude.roll * 180 / Double.pi) 15 self?.currentYAngle = Int(motion.attitude.pitch * 180 / Double.pi) 16 self?.currentZAngle = Int(motion.attitude.yaw * 180 / Double.pi) 17 18 }) 19 }

しかし、取得できる角度のうち、pitchだけ最大値が180°ではなく、90°であることが分かりました。得られるpitchの角度は二次元座標で表すと、第一象限は0°〜90°、第二象限は90°〜0°、第三象限は0°〜−90°、第四象限は−90°〜0°です。
(*「なお、ピッチ角の値は90度から-90度の間までで表され、±90度を超えてデバイスを傾けると、角度の値は再び減って(マイナスの場合は増えて)いきます。その代わり、デバイスが裏返ったとみなされ、ロール角の値が180度回転した値となります。」(https://www.atmarkit.co.jp/fsmart/articles/ios_sensor02/03.htmlより))

180°以内の角度であれば、正の値と負の値で条件を分けて計算することで角度を算出できそうですが、180°を超える動きで、pitchの移動角度を計算する方法がどうしても思いつきませんでした。

そもそも運動した角度を取得する方法自体が誤っているのでしょうか?

お分かりになる方がいらっしゃいましたら、ご助言願えれば幸いです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

そもそも角度の取得方法に根本的な問題があったようです。
知識としては知っていたジンバルロックですが、motion.attitudeが該当すると気づかずハマっていました・・。

issue with jumping rotation (or gimbal lock) at certain angle:
https://stackoverflow.com/questions/27705773/issue-with-jumping-rotation-or-gimbal-lock-at-certain-angle

Unityのジンバルロックを30秒で体感する:
https://qiita.com/fullmated/items/ac62ebd1206a6487232d

投稿2021/03/14 17:19

編集2021/03/14 17:21
Masa_teratail

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問