7

アプリケーションの記録セッションがあります。ユーザーが記録セッションを開始すると、デバイスの CMMotionManager オブジェクトからデータの収集を開始し、CoreData に保存して後で処理して表示します。収集しているデータには、GPS データ、加速度計データ、ジャイロ データが含まれます。データの周波数は 10Hz です。

現在、モーションデータを使用してデバイスの傾斜角を計算するのに苦労しています。重力データを使用して、デバイスのどちら側が土地であるかを計算することは可能ですが、移動方向に関係なく、ユーザーと地面の間の左右の角度を計算したいと考えています。

この問題を解決するには、線形代数の知識が必要です。たとえば、ある点の計算では、計算された平面上の 3D 線の方程式を計算する必要があります。私はこれに1日取り組んでおり、より複雑になっています。私は数学がまったく苦手です。問題に関連するいくつかの数学の例も高く評価されています。

4

2 に答える 2

10

それは、収集したデータで何をしたいか、およびユーザーがポケットに記録した 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 はバックグラウンドでは動作しません。つまり、ユーザーはスタンバイ ボタンを押してはいけません。
于 2012-07-25T13:15:27.663 に答える
4

あなたの質問が理解できれば、あなたは自分のデバイスの姿勢を知りたいと思っていると思います。これは、オブジェクトのプロパティから取得しattitudeたオブジェクトのプロパティを使用して行うことができます。 CMDeviceMotiondeviceMotionCMMotionManager

CMAttitudeこのクラス には、ロールピッチという 2 つの異なる角度に興味があるかもしれません。お使いのデバイスを上部 (ヘッドホン ジャックがある場所) にプロペラがある飛行機と想像すると、ピッチは、飛行機が上昇または急降下している場合に、飛行機/デバイスが地面に対して作る角度です。一方、ロールは、飛行機がバンクしている場合、またはバレル ロールの途中である場合に、「翼」が地面に対して作る角度です。

(ところで、あなたの質問には関係ないと思うヨーと呼ばれる第3の角度があります。)

角度はラジアンで与えられますが、必要に応じて角度に変換するのは簡単です (180 を掛けてから で割りますpi)。

あなたが何を望んでいるかを私が理解していると仮定すると、良いニュースは、これらの角度を捉えて使用するために線形代数を理解する必要がないかもしれないということです. (何か不足している場合は、明確にしてください。さらにお手伝いさせていただきます。)

更新(コメントに基づく):

オブジェクトの姿勢の値CMAttitudeは地面に対して相対的です (つまり、デフォルトのリファレンス フレームでは Z 軸が垂直で、重力とは反対の方向を指しています)、重力の相殺について心配する必要はありません。したがって、たとえば、デバイスを平らなテーブルの上に置き、横にroll丸めると、CMAttitude オブジェクトのプロパティは 0 からプラスまたはマイナス 90 度 (+- .5pi ラジアン) に変化します。どちら側に転がしますか。一方、平置きから始めて、徐々に立てかけていくと、pitch物件にも同じことが起こります。

必要に応じてピッチ角、ロール角、ヨー角を直接使用することもできますが、別の参照フレームを設定することもできます (たとえば、「上」の別の方向)。これを行うには、「キャリブレーション」ステップでその方向の姿勢をキャプチャし、CMAttitude の multiplyByInverseOfAttitude:メソッドを使用して姿勢データを新しい参照フレームに変換します。

あなたの質問は「リーンアングル」のキャプチャについてのみ言及していましたが、" (地面で)、おそらく 3 つの姿勢角度のうち少なくとも 2 つ (たとえば、ピッチと、何をしているかに応じてロールまたはヨーのいずれか)、場合によっては 3 つすべてをキャプチャする必要があります。 (たとえば、ポケットがだぶだぶである場合、デバイスはポケットの中でさまざまな方法で回転する可能性があります。)ただし、ほとんどの場合、おそらく 3 つのうちの 2 つだけに頼ることができると思います(ただし、たとえば、私のジーンズのポケットでは、携帯電話は通常ほぼ垂直になっています. したがって、私にとっては、歩いたり座ったりすると、ピッチが大きく変化します.向いている方向を変えるたびにロールは変化します. 一方、ヨーはまったく変化しません (カートの車輪を使用しない限り、私にはできません!)。したがって、私にとってヨーはおそらく無視できます。

要点を要約すると、これらの姿勢角を使用するために、線形代数を行う必要はなく、重力について心配する必要もありません (もちろん、これを他の目的に使用することもできます)。

更新 2 (Kay の新しい投稿に基づく):

Kay が返信し、重力と線形代数を使用して角度が一意であることを確認する方法を示しました。(そして、ところで、あなたはその投稿に報奨金を与えるべきだと思います、fwiw。)

やりたいことによっては、この数学を使用したい場合があります。標準化された「話し方」や録音セッション中の態度の比較が必要な場合は、線形代数と重力を使用することをお勧めします。それらを視覚化するだけの場合は、複雑さの増加を使用しなくても済む可能性があります。(たとえば、視覚化 (ピッチ = 90、ロール = 0、ヨー = 0) は、視覚化 (ピッチ = 0、ロール = 90、ヨー = 90) と同じである必要があります。) 上記の私のアプローチでは、複数の方法がありますが、 「同じ」態度に言及すること自体は、実際に間違っているわけではありません。彼らはまだあなたに地面に対する角度を与えます.

しかし、ジャイロスコープが姿勢の 1 つの有効な記述から別の有効な記述に切り替えることができるという事実は、3 つのコンポーネントのうち 2 つだけで回避することについて上で書いたことを修正する必要があることを意味します。このため、3 つのコンポーネントすべてをキャプチャする必要があります。 、何があっても。ごめん。

于 2012-07-23T03:04:43.887 に答える