2016-03-29 45 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