如何使用Transform3DGroup从轨道元素绘制轨道

时间:2019-03-30 13:19:55

标签: c# .net orbit satellite orbital-mechanics

我正在尝试使用C#.NET框架中的Transform3DGroup类绘制轨道。我有轨道元素a,e,i,RAAN,ArgPer,trueAnom。为我吐出这些的算法在ECI中也给了我x y z坐标。由于某种原因,当我尝试使用Transform3DGroup进行旋转以基本绘制出卫星应该在ECI中走的位置时(使用上面给出的轨道元素),我的结果与ECI坐标不匹配,即原始算法随即吐出来。

那个原始算法是我的真实数据。但是我不想使用这些坐标,我想使用Transform3DGroup用Keplarian元素自己绘制轨道。

这是我的代码:

public Point3D calculatePosition(double trueAnomaly)
{
    double angle = trueAnomaly;
    double a = semiMajorAxis;
    double e = eccentricity;
    double b = (a * (1 - e * e)) / (1 + e * Math.Cos(angle));
    double SA = Math.Sin(angle);
    double X = b * CA;//(CA * CR + SA * CI * SR); 
    double Y = b * SA; //(CA * SR + SA * CI);
    double Z = 0; //b * SA * SI;
    Point3D p = new Point3D(X, Y, Z);//new Point3D(Math.Cos(angle) * b, 
    Math.Sin(angle) * b, 0);
    return p;
}
public void orient2OrbitalElements(double _time)
{

    orbitNorm = new Vector3D(0, 0, 1);
    positionPoint = calculatePosition(trueAnomaly);//Position of Orbiter
    Transform3DGroup tg = new Transform3DGroup();
    tg.Children.Add(new TranslateTransform3D(positionVec));//Translates to Orbit Position (relative to Parent)
    tg.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(1, 0, 0), inclinationDeg)));//Rotates Orbit to the set Inclination
    tg.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 0, 1), RAAN)));//Rotates Orbiter's model RAAN
    orbitNorm = tgNoTranslation(tg).Transform(orbitNorm);
    tg.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(orbitNorm, argOfPerigee)));//Rotates Orbiter's model to the Arg of Perigee
    Transform = tg;
    if (HasEphem)
    {
        Console.WriteLine(ObjectName + ": " + Transform.Value.OffsetX + ", " + Transform.Value.OffsetY + ", " + Transform.Value.OffsetZ);
        Console.WriteLine(ObjectName + ": " + cartesElems.xPos[ephemIndex] + ", " + cartesElems.yPos[ephemIndex] + ", " + cartesElems.zPos[ephemIndex]);
    }
}
public Transform3DGroup tgNoTranslation(Transform3DGroup tgWithTranslations)
{
    Transform3DGroup tempTg = tgWithTranslations.Clone();
    tempTg.Children.RemoveAt(0);
    return tempTg;
}

基本上,我会使用基本的偏心率,半长轴和真实的异常公式来计算在不涉及地球位置的情况下在轨道平面上的x,y位置。然后,将生成的坐标作为TranslateTransform3D放入我的Transform3DGroup中。这是我放入的第一个对象。

然后我执行轮换:  ---增加了一个倾斜度,使位置Vec旋转      单位x轴(1,0,0)  --- RAAN的旋转,围绕单位z轴(0,0,1)  ---然后我从中创建轨道法线并执行argPer旋转      关于新轴

我对Transform3DGroup的工作方式的理解是,它将应用第一个,然后应用第二个,依此类推。这意味着执行positionVec(在2d轨道平面的参考帧中只是x,y坐标),然后所有旋转都将执行,因为旋转矩阵在其之前完成之后就被保留了下来。

我不正确地执行argPer旋转吗? RAAN或INC?也许有一种更精确的方法来计算我在轨道平面上的位置或必须遵循的特定操作顺序?

我思考的越多,我越会想到,如果我使用Transform3DGroup,一切似乎都非常简单,并且我现在应该做对了,但ECI结果并不符合要求。上。

但是,瞧瞧,Transform.Value.OffsetX / Y / Z确实希望接近于与真实数据一致。也许Transform.Value.Offset不是我所想到的X,Y,Z?

0 个答案:

没有答案