rswapna28 Ответов: 3

Определение рыскания, тангажа и крена


Всем Привет,

Если я смотрю с экрана, то ось x направлена вправо, ось y-перед экраном, а ось z-вверх.

У меня есть точка (x1, y1, z1), и она смотрит на целевую точку(x2, y2, z2). Я хотел бы рассчитать рыскание, тангаж и крен в градусах.

Я попытался вычислить матрицу вращения и углы, но, похоже, это не дает правильного результата.

Кто-нибудь может пожалуйста помочь мне.

Заранее спасибо.

- свапна

3 Ответов

Рейтинг:
22

Stefan_Lang

Во-первых, ваша ось y должна указывать на экран, иначе у вас не будет правой системы координат, и это может испортить ваши формулы при адаптации заданного алгоритма, такого как тот, который связан с решением 1.

Во-вторых, вашей информации недостаточно для определения угла крена: он может быть любым.

В-третьих, алгоритм в псевдокоде выглядит примерно так:
Перемещение из одной точки в другую дает вам направление. он определяется вектором V вы получаете, вычитая две точки.

V := (v1, v2, v3) = (x2, y2, z2) - (x1, y1, z1) = (x2-x1, y2- y1, z2- z1)

Угол рыскания - это угол, который этот вектор охватывает с проекцией VP того же вектора с горизонтальной плоскостью. Вы можете получить этот вектор, просто установив z-координату в 0.
VP := (v1, v2, 0)

Чтобы вычислить угол рыскания, воспользуйтесь тем фактом, что скалярное произведение двух векторов приравнивает произведение их соответствующих длин и косинус заключенного угла, в данном случае: V*VP = |V|*|VP|*cos(yaw) Исходя из этого, вы получаете:
yaw := acos ( V*VP/(|V|*|VP|) )

Тангаж-это угол, который VP охватывает плоскостью y-Z. Вы можете получить его таким же образом, сначала проецируя VP в плоскость y-Z...
VPP := (0, v2, 0)

... а затем вычислите угол, заключенный между VPP и VP:
pitch = acos( VP*VPP / (|VP|*|VPP|) )


Что вам остается сделать, так это поместить это в код C/C++ и реализовать функции для вычисления скалярного произведения v1*v2 из двух векторов v1 и v2, и длина |v| заданного вектора v.


Рейтинг:
0

DaveAuld

Вы видели эту нить, она, кажется, дает вам все необходимые вычисления;
http://forum.onlineconversion.com/showthread.php?t=5408[^]


rswapna28

Спасибо за ссылку. По ссылке видно,что она повернута на некоторый угол по осям x,y, Z. Но в моем случае я не знаю, под каким углом он поворачивается. Я знаю только то, что моя точка зрения направлена в какую-то целевую точку. Итак, теперь я хочу рассчитать свое рыскание, тангаж и крен в градусах.

Надеюсь, я прояснил свой вопрос.

Спасибо Улыбка | :)

DaveAuld

Вам нужно больше информации, чтобы определить все значения; если вы находитесь в точке А и смотрите на точку в, вы, вероятно, можете вычислить только высоту тона.

Albert Holguin

На самом деле, вы должны быть в состоянии рассчитать тангаж и рыскание, основываясь на этом. Крен-это единственное независимое измерение.

Рейтинг:
0

TheNess

Если кто-то ищет простой кодовое решение, просто создайте матрицу из источника и цели (lookat) и используйте следующий код (C#):

public void ExtractYawPitchRoll( out float yaw, out float pitch, out float roll )
{
    yaw   = (float) Math.Atan2( V02, V22 );
    pitch = (float) Math.Asin( -V12 );
    roll  = (float) Math.Atan2( V10, V11 );
}


Я знаю, что этот вопрос относится к C++, но его должно быть довольно легко преобразовать. Например, при использовании C# с MonoGame полный код выглядит следующим образом:

Matrix matrix = Matrix.CreateLookAt(source, target, Vector3.Up);
float yaw = (float)Math.Atan2(matrix.M13, matrix.M33);
float pitch = (float)Math.Asin(-matrix.M23);
float roll = (float)Math.Atan2(matrix.M21, matrix.M22);


Оригинальный код от:

aforge/Matrix4x4. cs at master · cureos/aforge · GitHub[^]