生成飞行轨迹的功能(3D点列表,lat,lon,alt)

时间:2017-08-01 12:03:31

标签: c# python algorithm flightpath

我希望为飞机模拟生成一些3D轨迹数据。 这个想法是飞机在某个位置x起飞并继续以某个平均上升速度a_v和角度a_theta上升,直到达到最大高度m_a。然后飞机将在其m_a处继续行驶,直到距离目的地d_d一定距离,此时它将以某个角度d_theta开始下降,平均下降速度为{ {1}}。最后,飞机降落在目的地d_v

我希望该函数返回一个3D点列表。

我希望在Python(首选)或C#中实现它。

出于说明目的:

enter image description here

有谁知道我怎么能做到这一点?是否有一些开源项目可以做到这一点?我一直在寻找一段时间,但没有找到任何东西。

2 个答案:

答案 0 :(得分:0)

我建议你通过两个独立的步骤解决问题,这样飞机就不会穿过地面了:

  1. 计算球体表面上的路径。
  2. 沿此路径插入高度。
  3. 对于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);
    }
    

答案 1 :(得分:0)

你没有写任何代码,所以我也不会写任何代码。使用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