Я использую данные из локального набора данных MISB KLV и матричных операций. предоставлено в NASA Worldwind. Данные MISB обеспечивают ориентацию платформы по рысканию, тангажу и крену, а также ориентацию датчика относительно платформы по рысканью, тангажу и крену. Я пытаюсь рассчитать абсолютную ориентацию (рысканье, тангаж, крен) датчика относительно севера на основе ориентации платформы и относительной ориентации датчика.
В настоящее время я вычисляю матрицу вращения платформы и матрицу относительного вращения датчиков и умножаю результаты вместе. Полученная матрица вращения не кажется правильной. Согласно документации MISB в разделе 6.2.4, порядок операций с углом Эйлера: Yaw, Pitch, затем Roll. Каков правильный способ объединения матриц вращения для получения абсолютного вращения?
//use transpose for clockwise rotation
Matrix mpYaw = Matrix.fromRotationZ(pYaw).getTranspose();
Matrix mpPitch = Matrix.fromRotationY(pPitch).getTranspose();
Matrix mpRoll = Matrix.fromRotationX(pRoll).getTranspose();
Matrix msYaw = Matrix.fromRotationZ(sYaw).getTranspose();
Matrix msPitch = Matrix.fromRotationY(sPitch).getTranspose();
Matrix msRoll = Matrix.fromRotationX(sRoll).getTranspose();
Matrix mpRot = mpYaw.multiply(mpPitch).multiply(mpRoll); //platform
Matrix msRot = msYaw.multiply(msPitch).multiply(msRoll); //sensor
Matrix maRot = mpRot.multiply(msRot); //absolute
Пример данных MISB:
Platform Heading Angle:175.66308079652094
Platform Pitch Angle:3.4296700949125647
Platform Roll Angle:-0.3982665486617634
Sensor Rel. Az. Angle:326.08593764856596
Sensor Rel. El. Angle:-21.60937493741949
Sensor Rel. Roll Angle:0.0
Sensor Latitude:33.03482410173622
Sensor Longitude:-114.45451377632772
Sensor True Altitude:1022.4368657969026
Frame Center Lat.:33.01531312661958
Frame Center Lon.:-114.4367867216639
Frame Center El.:79.58953231097883
Slant Range:2883.640118614687
РЕДАКТИРОВАТЬ 1:
После применения исправления, предложенного @anjruu, похоже, что результат близок, но все же немного отличается. Я рассчитал локальные координаты NED до целевого местоположения, умножив прямой вектор матрицы вращения на целевое расстояние, предоставленное MISB. Затем я рассчитал локальные координаты NED (используя ViewUtil) из MISB предоставил целевое местоположение с источником, установленным на предоставленное местоположение платформы, и результаты немного отличаются.
Matrix mpYaw = Matrix.fromRotationZ(pYaw).getTranspose();
Matrix mpPitch = Matrix.fromRotationY(pPitch).getTranspose();
Matrix mpRoll = Matrix.fromRotationX(pRoll).getTranspose();
Matrix msYaw = Matrix.fromRotationZ(sYaw).getTranspose();
Matrix msPitch = Matrix.fromRotationY(sPitch).getTranspose();
Matrix msRoll = Matrix.fromRotationX(sRoll).getTranspose();
Matrix mpRot = mpRoll.multiply(mpPitch).multiply(mpYaw); //platform
Matrix msRot = msRoll.multiply(msPitch).multiply(msYaw); //sensor
Matrix maRot = msRot.multiply(mpRot); //absolute
Globe globe = new Earth();
Position pPlatform = Position.fromDegrees(33.03482410173622, -114.45451377632772, 1022.4368657969026);
Position pTarget = Position.fromDegrees(33.01531312661958, -114.4367867216639, 79.58953231097883);
double targetRange = 2883.640118614687;
Vec4 vTarNED = new Vec4(1,0,0).transformBy3(maRot.getTranspose()).multiply3(targetRange);
//NED = (-2165.935747907422, 1656.9597179630864, 937.3298046411029, 1.0)
Matrix localENU = ViewUtil.computePositionTransform(globe, pPlatform);
Vec4 vTarENU = globe.computePointFromPosition(pTarget).transformBy4(localENU);
//ENU = (1656.3846316600684, -2163.7501770820236, -943.4305881811306, 1.0)
//NED = (-2163.7501770820236, 1656.3846316600684, 943.4305881811306, 1.0)
multiply
? Я бы предположил, чтоMatrix::multiply
— это правое умножение, и что поза камеры относится к позе платформы, а это означает, что она должна бытьmsRot.multiply(mpRot)
, и что вы должны перевернуть цепочку умножения для полученияmpRot
иmsRot
, но я не могу сказать не зная, что на самом деле делаетmultiply
. - person anjruu   schedule 23.09.2014A.multiply(B)
этоA*B
(что разумно), поэтому я думаю, что это должно бытьMatrix mpRot = mpRoll.multiply(mpPitch).multiply(mpYaw);
, аналогично дляmsRot
иmaRot
. - person anjruu   schedule 23.09.2014