2015-07-28 46 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度以上,我发现数据高峰。我不确定这是否是由于缺少一点,但高峰可能是危险的。 –