2016-03-29 61 views
0

我有一個傳感器連接到鑽機。傳感器輸出heading和roll的方向。從我可以告訴的是,這些順序是內在的旋轉。傳感器的Y軸平行於鑽頭的縱向軸線。我想從傳感器獲取一組輸出,並從最終方位找到最大方向的變化。我需要找到兩組滾動和偏航角度之間的角度

由於鑽頭將圍繞俯仰軸旋轉,我相信它可以被忽略。

我首先想到的是要儘量航向和卷轉換爲單位向量假設間距爲0。一旦我有自己的載體,給他們打電話v和VF,它們之間的角度是

Θ=反餘弦( v.vf)

然後,它應該是相當直接的讓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; 
} 

兩個間距球面三角形的邊,和三角洲卷是它們之間的角度。爲了計算剩餘的一面,我們使用海鳥的法則。我還提供了角度經緯度參數化的解決方案,以防您使用偏航距指定方位。

+0

這似乎是一個很好的方法去解決它。我希望你可以詳細闡述一下經濟特徵。我想我會以偏航的方向工作,我的經度是我的雅司而我的緯度是我的球場? – Richard

+0

nvm,緯度長的配方完美運作。通過我的傳感器定向的方式,它將鑽頭的間距標記爲滾動。因此,使用roll作爲緯度和緯度作爲我的經度,它將輸出與單位矢量方法相同的角度差,但計算量更少。 – Richard

0

假設u(1), u(2), ..., u(m), v都是單位向量。您想要確定i,以使u(i)v之間的角度最大化。這相當於找到i,使np.dot(u(i), v)最小化。所以如果你有一個矩陣U,其中行是u(i),你可以簡單地做i = np.argmin(np.dot(U, v))來找到最大化爲u(i)v之間的角度的i