2016-03-29 8 views
0

私はドリルにセンサーが付いています。センサは、見出しのロールとピッチの方向を出力します。私が知ることから、これらは本質的な回転であると言えます。センサのY軸は、ドリルビットの長手軸に平行です。私はセンサから一連の出力を取り、最終的な方向から方向の変化が最大になるようにしたいと思います。私はロールとヨー角の2つのセットの間の角度を見つける必要があります

ピッチ軸を中心にドリルビットが回転しているので、無視することができます。

私の最初の考えは、私は彼らのベクトルを持っていたら、VおよびVFそれらを呼び出す0で、それらの間の角度が

Θ= ARCCOS(だろうピッチを想定した単位ベクトルに見出しとロールを変換しようとするだろうv。)

これは、Pythonが与えられた方向のセットに対してΘを計算し、最大のものを引っ張ることはかなり単純です。

私の質問は、Pythonを使ってこれを行う簡単な方法があります。もしそうでなければ、これらの内在的回転を単位ベクトルに変換する最も効率的な方法は何ですか。

+0

あなたは自分でコードを試しましたか? – Deusdeorum

+0

@Hugo - まだありません。コーディングを開始する前に数学を整理しておきたいと思っていました。そうすれば私は正しい方向に取り組んでいることが分かります。 – Richard

+0

私はこのような単位ベクトルを得ることができると信じています:x = cos(yaw)* cos(roll)、y = sin(yaw)* cos(roll)、そしてz = sin(roll) – Richard

答えて

1

私は球面三角法があなたを助けると思います。 https://en.wikipedia.org/wiki/Spherical_trigonometry https://en.wikipedia.org/wiki/Haversine_formula#The_law_of_haversines

私が正しくあなたを理解していれば、機能は以下のトリックを行う必要があります。

double AngleBetweenRollPitch(double roll1, double pitch1, double roll2, double pitch2) { 
    return SphericalSideFromSidesAndIncludedAngle(pitch1, pitch2, roll2 - roll1); 
} 
double SphericalSideFromSidesAndIncludedAngle(double b, double c, double alpha) { /* the Law of haversines */ 
    return archaversin(haversin(b - c) + sin(b) * sin(c) * haversin(alpha)); 
} 
double SphericalAngleBetweenTwoLongLats(double long0, double lat0, double long1, double lat1) { 
    return archaversin(haversin(lat1 - lat0) + cos(lat0) * cos(lat1) * haversin(long1 - long0)); 
} 
double haversin(double x) { 
    x = sin(x * .5); 
    x *= x; 
    return x; 
} 
double archaversin(double x) { 
    if  (x >= 1.) x = M_PI * .5; 
    else if (x <= 0.) x = 0.; 
    else    x = asin(sqrt(x)) * 2.; 
    return x; 
} 

2つのピッチは、球面三角形の辺であり、デルタロールは、それらの間の角度です。残りの部分を計算するために、私たちはhaversinesの法則を使用します。また、ヨーピッチを使用する代わりに向きを指定する場合には、角度の緯度経度パラメータ化のためのソリューションも含まれています。

+0

これは素晴らしい方法のようですそれについて行く。私はあなたがlat-longのキャラクタライゼーションについて少し詳しく説明してくれることを願っています。私はヨーピッチの方向で働いていると思うし、私の経度は私のヨーとなり、私の緯度は私のピッチになるだろう? – Richard

+0

nvm、lat-long式は完全に機能しました。私のセンサーの向きは、ドリルのピッチをロールとしています。私の経度として私の緯度とヨーとしてロールを使用すると、単位ベクトル法と同じ角度差を出力しますが、計算は少なくなります。 – Richard

0

u(1), u(2), ..., u(m), vはすべて単位ベクトルです。 u(i)vの間の角度が最大になるように、iを決定したいとします。これは、が最小になるようにiを見つけることと同じです。したがって、行がu(i)の行列Uがある場合は、i = np.argmin(np.dot(U, v))を実行して、u(i)vの間の角度が最大化されたiを見つけることができます。

関連する問題