8

Pythonを使用して次の問題を解決する方法を考え出そうとしています:

  1. 剛体を形成する点a、b、c、dがあります
  2. 不明な3D移動と回転がリジッド ボディに適用されています
  3. a、b、cの座標がわかった
  4. d の座標を計算したい

私がこれまでに知っていること:

私が解決できないのは、a、b、c の「新しい」座標が与えられた場合に、回転行列と並進行列を計算する方法です。

一般的なケース (非剛体) では、これの回転部分はWahba の問題であることがわかりますが、剛体の場合は、次を使用して一連の直交単位ベクトルを計算することにより、直接計算するより高速な方法があるはずです。ポイント。

4

1 に答える 1

5

一致させようとしている一連の対応するポイント (摂動の可能性あり) については、numpy に存在するように見える SVD (特異値分解) を使用しました。

この手法の例 (Python でも) はこちらにありますが、正確性については評価していません。

あなたが目指しているのは、変換行列として表される「基底変換」または「基底の変更」です。既知の 3 点が同一線上にないと仮定すると、次の方法で初期基底を作成できます。

  1. ベクトルの計算: x=(ba) および y=(ca)
  2. x の正規化 (x = x / マグニチュード(x))
  3. y を x に射影 (proj_y = x DOT y * x)
  4. y から投影を減算します (y = y - proj_y)
  5. y を正規化する
  6. z = x CROSS y を計算します。

これにより、最初の x、y、z 座標の基底 A が得られます。新しい点に対して同じことを行うと、2 番目の基底 B が得られます。次に、A の点を取り、それを B に変換する変換 T を見つけたいとします (ベースの変更)。その部分は簡単です。A を反転して点を標準基底に変換し、次に B を使用して 2 番目の基底に変換できます。A は正規直交であるため、A を転置して逆数を取得できます。したがって、「新しい d」は d * inverse(A) * B に等しくなります (ただし、表現によっては、B * inverse(A) * d を使用する必要がある場合があります)。

それをすべて取得するには、行列にある程度精通している必要があります。ベクトルと行列の表現は、T を取得するために行列を乗算する順序を通知します (T は inverse(A)*B または B*inverse(A) のいずれかです)。

ベクトル x=(x1,x2,x3), y=(y1,y2,y3), z=(z1,z2,z3) から基底行列を計算するには、次のように入力します。

| x1 y1 z1 |
| x2 y2 z2 |
| x3 y3 z3 |
于 2013-04-18T15:31:35.353 に答える