生成飞行轨迹的函数(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# 中实现此功能。

出于说明目的:

有谁知道我如何做到这一点?是否有一些开源项目可以做到这一点?我已经找了一段时间了,但没有找到任何东西。

【问题讨论】:

那么问题出在哪里?对于您显示的图表,除了+-*/ 之外,您还需要cossinsqrt**2。尝试首先在 2D 中解决问题(如图所示)并将坐标转换为球面。此外,如果您只需要具有 3D 点的轨迹,则速度应该无关紧要。 飞机可以在任意高度起降吗? @meowgoesthedog 好吧,我想如果我有机场 A 和 B 的高度,那么是的。考虑到这一点会很好。 顺便说一句,你不能同时指定d_dd_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_vd_vd_d

【讨论】:

以上是关于生成飞行轨迹的函数(3D 点列表、lat、lon、alt)的主要内容,如果未能解决你的问题,请参考以下文章

对 lon\lat 点的排序列表,从最近的开始

从 R 中的 netCDF 提取点的时间序列(lon,lat)

如何在 gpx 文件中找到第 10 个跟踪点

阅读《基于转弯点聚类的航空飞行轨迹分析》笔记

计算点之间的距离时不一致

如何从 2D numpy (lat,lon) 数组中删除扇区/切片?