生成飞行轨迹的函数(3D 点列表、lat、lon、alt)
Posted
技术标签:
【中文标题】生成飞行轨迹的函数(3D 点列表、lat、lon、alt)【英文标题】:Function to generate flight trajectory (list of 3D points, lat, lon, alt) 【发布时间】:2018-01-08 06:59:20 【问题描述】:我希望为飞机模拟生成一些 3D 轨迹数据。
这个想法是飞机在某个位置起飞x
,并继续以某个平均上升速度a_v
和角度a_theta
上升,直到它达到最大高度m_a
。然后飞机将继续以m_a
行驶,直到它到达距离目的地一定距离d_d
,此时它将以某个角度d_theta
开始下降,平均下降速度为d_v
。最后,飞机降落在目的地y
。
我希望该函数返回一个 3D 点列表。
我希望在 Python(首选)或 C# 中实现此功能。
出于说明目的:
有谁知道我如何做到这一点?是否有一些开源项目可以做到这一点?我已经找了一段时间了,但没有找到任何东西。
【问题讨论】:
那么问题出在哪里?对于您显示的图表,除了+-*/
之外,您还需要cos
、sin
、sqrt
和**2
。尝试首先在 2D 中解决问题(如图所示)并将坐标转换为球面。此外,如果您只需要具有 3D 点的轨迹,则速度应该无关紧要。
飞机可以在任意高度起降吗?
@meowgoesthedog 好吧,我想如果我有机场 A 和 B 的高度,那么是的。考虑到这一点会很好。
顺便说一句,你不能同时指定d_d
和d_theta
;任何一个都足以计算给定m_a
的轨迹。
【参考方案1】:
我建议你分2个独立的步骤解决问题,这样飞机就不会穿过地面:
-
计算球体表面上的路径。
沿此路径插入高度。
对于1.您可以使用spherical interpolation techniques on Quaternions。
Quaternion slerp(Quaternion v0, Quaternion v1, double t)
// Only unit quaternions are valid rotations.
// Normalize to avoid undefined behavior.
v0.normalize();
v1.normalize();
// Compute the cosine of the angle between the two vectors.
double dot = dot_product(v0, v1);
const double DOT_THRESHOLD = 0.9995;
if (fabs(dot) > DOT_THRESHOLD)
// If the inputs are too close for comfort, linearly interpolate
// and normalize the result.
Quaternion result = v0 + t*(v1 – v0);
result.normalize();
return result;
// If the dot product is negative, the quaternions
// have opposite handed-ness and slerp won't take
// the shorter path. Fix by reversing one quaternion.
if (dot < 0.0f)
v1 = -v1;
dot = -dot;
Clamp(dot, -1, 1); // Robustness: Stay within domain of acos()
double theta_0 = acos(dot); // theta_0 = angle between input vectors
double theta = theta_0*t; // theta = angle between v0 and result
Quaternion v2 = v1 – v0*dot;
v2.normalize(); // v0, v2 is now an orthonormal basis
return v0*cos(theta) + v2*sin(theta);
【讨论】:
【参考方案2】:你没有写任何代码,所以我也不会写任何代码。带有math
包的Python 足以解决这个问题。
所需步骤:
飞机应该使用great circle。这意味着您只需要 one distance 来描述 X 和 Y。 您可以将原点放置在 X 上并用纬度指定 Y。 计算地球在 X 处的切线,并旋转a_theta
。找到到达m_a
高度的点。
计算地球在 Y 处的切线,并旋转d_theta
。找到到达m_a
高度的点。
在前面两个点之间画一条圆弧,半径为EarthRadius + m_a
大圆的 2D 坐标中的每个坐标都是已知的,您只需将它们旋转回 3D 坐标即可。
对于 3D 点列表,您不需要 a_v
、d_v
或 d_d
。
【讨论】:
以上是关于生成飞行轨迹的函数(3D 点列表、lat、lon、alt)的主要内容,如果未能解决你的问题,请参考以下文章