Расчет крена, тангажа и рыскания с углов - PullRequest
0 голосов
/ 15 октября 2019

Я работаю над моделированием самолета с тремя осями движения (крен, тангаж и рыскание). У меня есть угол крена (количество градусов, в котором крылья наклонены вокруг оси носа и хвоста самолета), угол тангажа (угол между носом и горизонтом) и угол поворота (компасный курс самолета).

То, что я пытаюсь определить, - это единичный вектор подъемной силы (т.е. вектор, который находится «вверх» от самолета) - т.е. когда самолет стоит прямо и выровнен, вектор подъема должен быть направлен вверх, когда нос самолета направлен вверх, вектор подъема задается как 180 - roll_angle и т. д.

Я добился частичного прогресса только с двумя углами(например, вращение и рыскание), просто взяв сферические координаты новой точки и преобразовав в декартову и перенеся нормаль к плоскости, заданной результирующим вектором. Однако я не уверен, как принять во внимание третий угол (шаг).

Я стремлюсь достичь функции, которая принимает три угла (крен, шаг и рыскание) и дает единичный векторлифт.

function get_lift_vector()
{
    var lift_vector_heading = 0;
    var lift_vector_elevation = 90;

    // Adjust to range (-180, 180]
    roll_angle %= 360;
    if(roll_angle > 180)
    {
        roll_angle = 180 - roll_angle;
    }

    // Roll
    if(roll_angle > 0)
    {
        lift_vector_heading = 90;
        lift_vector_elevation = 90 - roll_angle;
    }
    else if(roll_angle < 0)
    {
        lift_vector_heading = 270;
        lift_vector_elevation = 90 - roll_angle;
    }

    // Yaw
    lift_vector_heading += aircraft_compass_heading;
    lift_vector_heading %= 360;

    // Pitch

}

1 Ответ

0 голосов
/ 15 октября 2019

Решил эту проблему, используя реализацию библиотеки Эйлера углов Эйлера после публикации соответствующего вопроса в Math SE, где Подробный ответ Матти П. предоставил необходимый математический фон.

По существуэта проблема становится внутренней проблемой углов Эйлера, в результате чего мы избегаем не элегантного псевдокода, который я выложил выше, и просто подключаем соответствующие углы, а затем преобразуем исходный вектор единицы измерения оси z (который является вектором подъема), результирующий вектор являетсяединичный вектор подъема.

Я включил фрагмент кода, используя пакет Math библиотеки ThreeJS, который прекрасно заботится о реальной математике, лежащей в основе преобразования угла Эйлера.

var transform = 
    new Euler(_Math.degToRad(angle_of_attack),
    _Math.degToRad(roll_angle),
    _Math.degToRad(heading),
    'ZXY');

var v = new Vector3(0, 0, 1);
v.applyEuler(transform);

return [v.x, v.y, v.z];
...