2015-07-28 47 views
1

我想要計算旋轉體的角速度。從數據來看,我在每個時間間隔都有對象的角度。例如。Numpy幫助計算旋轉體的角速度

numpy的數組= [5,85,185,270,355,10,75,170,250345,25,...]

爲順時針旋轉並且類似地對於

逆時針旋轉numpy的陣列= [25,345,250,170,75,10,355,270,185,85,5,...]。

所以,當我嘗試計算角度之間的差異,對於0到360的範圍,反之亦然,我可以使用numpy.diff(),在這種情況下工作良好。

當我碰巧從360到0的差異或例如。如圖所示。 A,從355度到5度,我不能再使用numpy.diff()。 我必須使用一個條件語句,如:

 if ang[i+1]>280 and theta<80: 
      new_theta=-1*((theta-ang[i+1])%360) 

並且類似地當所述旋轉運動是在逆時針方向上,我使用類似於上述的條件來獲得在角度(dTheta)之差:

elif ang[i+1]<80 and theta>280: 
     new_theta=360%(theta-ang[i+1]) 

Fig. A shows rotating object in clockwise direction and Fig. B shows counter clockwise rotation.

與廣義當角度既不是接近極限,即0或360

new_theta=ang[i+1]-theta 

那麼有沒有更好的計算方法可以快速有效地提供更好的結果?

我無法處理範圍限制。我不確定scipy norm在這裏是否有幫助。

歡迎任何有關改善問題的建議。

謝謝。

+0

您必須對最大角速度做一些假設,因爲您的物體可能會在一個時間步旋轉350度。如果不能,我會說你應該計算差異,那麼如果他們大多數是積極的,相應地糾正消極的或相反的。 – Aaron

回答

2

如果你知道旋轉總是在一個方向,就可以計算出差異,然後再通過並修復錯誤。因此,例如:

>>> arr = np.array([5,85,185,270,355,10,75, 170, 250,345, 25]) 
>>> darr = np.diff(arr) 
>>> print(darr) 
[ 80 100 85 85 -345 65 95 80 95 -320] 
>>> darr[darr<0] += 360 
[ 80 100 85 85 15 65 95 80 95 40] 

這可能是最快的方法。

另一種方法是使用numpy.unwrap,它試圖找出你繞着一個圓的地方。但是,它只能與弧度的作品,所以你需要將其轉換爲弧度,拆開包裝,然後將其轉換爲度:

>>> warr = np.rad2deg(np.unwrap(np.deg2rad(arr))) 
>>> print(warr) 
[ 5. 85. 185. 270. 355. 370. 435. 530. 610. 705. 745.] 
>>> dwarr = np.diff(warr) 
>>> print(dwarr) 
[ 80. 100. 85. 85. 15. 65. 95. 80. 95. 40.] 

在它給出了相同的結果,這種玩具的例子,但它不會永遠,因爲它並不假定旋轉是在一個特定的方向。這意味着如果旋轉始終與我之前提供的簡單方法相同,那麼它就更容易出錯。

如果你不能假設旋轉總是在一個特定的方向,那麼沒有一個好的客觀方法來做到這一點。 np.unwrap可能是你最好的選擇,但它只是猜測。沒有確切的方法來告訴從另一個方向的大跳躍向一個方向的小跳躍。

+0

對不起,我想我忘了補充一點,方向不是特別的。但是,是的,解包工作得很好。物體可能撞擊某物並且可能再次逆時針旋轉。 –

2

您可以在使用np.diff之前將您的測量結果轉換爲弧度並使用np.unwrap

例如,這裏是你的數據,以度:

In [93]: d = np.array([5, 85, 185, 270, 355, 10, 75, 170, 250, 345, 25]) 

轉換爲弧度:

In [94]: theta = (np.pi/180) * d 

In [95]: theta 
Out[95]: 
array([ 0.08726646, 1.48352986, 3.22885912, 4.71238898, 6.19591884, 
     0.17453293, 1.30899694, 2.96705973, 4.36332313, 6.02138592, 
     0.43633231]) 

展開:

In [96]: u = np.unwrap(theta) 

In [97]: u 
Out[97]: 
array([ 0.08726646, 1.48352986, 3.22885912, 4.71238898, 
     6.19591884, 6.45771823, 7.59218225, 9.25024504, 
     10.64650844, 12.30457123, 13.00270293]) 

計算的差異:

In [98]: delta_theta = np.diff(u) 

In [99]: delta_theta 
Out[99]: 
array([ 1.3962634 , 1.74532925, 1.48352986, 1.48352986, 0.26179939, 
     1.13446401, 1.65806279, 1.3962634 , 1.65806279, 0.6981317 ]) 

轉換回度:

In [100]: delta_degrees = (180/np.pi) * delta_theta 

In [101]: delta_degrees 
Out[101]: array([ 80., 100., 85., 85., 15., 65., 95., 80., 95., 40.]) 
+0

嘿,非常感謝。正如所解釋的,這工作完美無缺。但是我還沒有收到可能會出現小回轉的數據,這可能會導致@TheBlackCat在其最後一段中提到的問題。會導致問題嗎? –

+0

如果您足夠頻繁地採樣角度,以便您知道樣品之間的物體不會旋轉超過180度(無論哪種方式),這應該可以正常工作。如果你不能保證,那麼沒有更多的信息,測量中就會有不明確的地方(例如+190度與-170度相同)。 –

+0

嗯,即使我不確定,在給定的時間框架內,我的對象旋轉180度以上,我發現數據高峯。我不確定這是否是由於缺少一點,但高峯可能是危險的。 –