Numpy 帮助计算 Angular 旋转体的速度
Numpy help on calculation of Angular speed of rotational body
我正在尝试计算 Angular 旋转物体的速度。从数据中,我有每个时间间隔的对象角度。例如。
Numpy Array =[5,85,185,270,355,10,75, 170, 250,345, 25, ...]
顺时针旋转和类似的
counter clockwise rotation Numpy Array = [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])
并且对于角度既不接近极限即 0 或 360 的一般情况。
new_theta=ang[i+1]-theta
那么有没有更好的方法来快速有效地计算出更好的结果呢?
我无法处理范围限制。而且我不确定 scipy norm
是否可以在这里提供帮助。
欢迎提出任何改进问题的建议。
谢谢。
您可以将测量值转换为弧度并在使用 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.])
如果你知道旋转总是在一个方向上,你可以计算差异,然后通过并修复错误。所以,例如:
>>> 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.]
在这个玩具示例中,它给出了相同的结果,但并非总是如此,因为它不假定旋转是在特定方向上。这意味着如果旋转总是在同一个方向比我之前给出的简单方法更容易出错。
如果您不能假设旋转始终沿特定方向进行,那么就没有好的 objective 方法可以做到这一点。 np.unwrap
可能是您最好的选择,但这只是猜测。没有明确的方法可以区分一个方向的小跳跃和另一个方向的大跳跃。
我正在尝试计算 Angular 旋转物体的速度。从数据中,我有每个时间间隔的对象角度。例如。
Numpy Array =[5,85,185,270,355,10,75, 170, 250,345, 25, ...]
顺时针旋转和类似的
counter clockwise rotation Numpy Array = [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])
并且对于角度既不接近极限即 0 或 360 的一般情况。
new_theta=ang[i+1]-theta
那么有没有更好的方法来快速有效地计算出更好的结果呢?
我无法处理范围限制。而且我不确定 scipy norm
是否可以在这里提供帮助。
欢迎提出任何改进问题的建议。
谢谢。
您可以将测量值转换为弧度并在使用 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.])
如果你知道旋转总是在一个方向上,你可以计算差异,然后通过并修复错误。所以,例如:
>>> 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.]
在这个玩具示例中,它给出了相同的结果,但并非总是如此,因为它不假定旋转是在特定方向上。这意味着如果旋转总是在同一个方向比我之前给出的简单方法更容易出错。
如果您不能假设旋转始终沿特定方向进行,那么就没有好的 objective 方法可以做到这一点。 np.unwrap
可能是您最好的选择,但这只是猜测。没有明确的方法可以区分一个方向的小跳跃和另一个方向的大跳跃。