それは、収集したデータで何をしたいか、およびユーザーがポケットに記録した iPhone をどのように使用するかによって異なります。その理由は、オイラー角は安全ではなく、特に回転を表現する独自の方法ではないからです。ユーザーが携帯電話をジーンズの後ろポケットに縦向きに入れ、約 90°左に向ける状況を考えてみましょう。CMAttitude はテーブル上に平らに置かれたデバイスに関連しているため、次の図に従って (pitch=x、roll=y、yaw=z) の 2 つの回転が続きます。
- 電話を直立させるためのピッチ +90° => (90, 0, 0)
- 左に曲がる場合は +90° 回転 => (90, 90, 0)
ただし、次の方法で同じ位置を取得できます。
- 電話を左に回すためのヨー +90° (0, 0, 90)
- 電話を直立させるためのピッチ -90° (-90, 0, 90)
同じ回転に到達するための 2 つの異なる表現 (90, 90, 0) と (-90, 0, 90) が表示され、さらに多くの表現があります。スタートボタンを押して、電話をポケットに入れるためにいくつかの派手な回転を行い、より複雑な動きをするときにオイラー角に頼ることができないため、問題が発生します (s.ジンバルロックはこれに関する頭痛の種です ;-)
ここで朗報です。あなたの言う通り、線形代数が仕事をしてくれます。あなたができることは、ユーザーに電話を常に同じ位置に置くように強制することです。たとえば、右後ろのポケットに直立させて固定し、CMDeviceMotion g = (x 、y、z)と直立位置の -Y 軸 (0、-1、0) である位置ベクトル p:
g • x = x*0 + y*(-1) + z*0 = -y = ||g||*1*cos (アルファ)
=> alpha = arccos (-y/9.81)全体の角度として。重力加速度 g は常に約 9.81 であることに注意してください。
左右の傾斜角と前後の角度を取得するには、接線を使用します。
alphaLR = アークタン (x/y)
alphaFB = arctan (z/y)
[アップデート:]
上記の方程式の (0, -1, 0) のような事前定義された位置に電話があることに依存できない場合は、合計角度のみを計算できますが、特定の角度 alphaLR と alphaFB は計算できません。その理由は、2 つ必要な新しい座標系の軸が 1 つしかないためです。新しい Y 軸y'は平均重力ベクトルとして定義されますが、y' に垂直なすべてのベクトルが有効になるため、新しい X 軸はわかりません。
そのため、ユーザーが逸脱することなく一方向に長い距離を歩けるようにし、GPS と磁力計のデータを使用して 2 番目の軸 z' を取得するなどの追加情報を提供する必要があります。実際にはかなりエラーが発生しやすいようです。
(0, -1, 0) を平均重力ベクトル (pX, pY, pZ) に置き換えることができるため、角度の合計は問題ありません。
g•p = x pX + y pY + z pZ = ||g|| ||p||*cos(アルファ) = ||g||^2*cos(アルファ)
アルファ = arccos ((x pX + y pY + z*pZ) / 9.81^2)
さらに 2 つの点に注意してください。
- さまざまな人がさまざまなポケットを備えたさまざまなズボンを着用しています。そのため、同じ人が他の服を着ていても重力ベクトルは異なり、何らかの正規化が必要になる場合があります
- CMMotionManager はバックグラウンドでは動作しません。つまり、ユーザーはスタンバイ ボタンを押してはいけません。