Преобразование ковариационной матрицы 6x6 из ENU в ECEF

В настоящее время я работаю с RADAR, который выводит ковариационную матрицу 6x6 для каждой дорожки в следующем формате:

Кол1 Кол2 Кол3 Кол4 Кол5 Col6 (ЭП) (ЭП) (ЭП) (НП) (ЭП) (ВВЕРХ) (ЭП) (EV) (ЭП)(НВ) (ЭП)(УФ) (НП)(ЭП) (НП)(НП) (НП)(ВВЕРХ) (НП)(EV) (НП)(НВ) (НП)(УФ) (ВВЕРХ) (ВП) (ВВЕРХ)(НП) (ВВЕРХ ВВЕРХ) (ВВЕРХ)(EV) (ВВЕРХ)(НВ) (ВВЕРХ)(УФ) (EV) (EP) (EV)(НП) (EV) (ВВЕРХ) (EV)(EV) (EV)(НВ) (EV)(УФ) (НВ)(ЭП) (НВ)(НП) (НВ)(ВВЕРХ) (НВ)(EV) (НВ)(НВ) (НВ)(УФ) (УФ)(ЭП) (УФ)(НП) (УФ)(ВВЕРХ) (УФ)(ЭВ) (УФ)(НВ) (УФ)(УФ)

Где EP = восточное положение, NP = северное положение, UP = верхнее положение, EV = восточная скорость, NV = северная скорость и UV = восходящая скорость. Пусть [EP][EP]=Cov(EP,EP)=Var(EP) и так далее

В своем исследовании я нашел это: https://gssc.esa.int/navipedia/index.php/Transformations_between_ECEF_and_ENU_coordinates

Это дает именно то, что мне нужно для ковариационного преобразования позиции 3x3 ENU в ECEF. Мое первое предположение состоит в том, что я бы просто продублировал матрицу вращения (R) следующим образом:

Где лямбда = долгота радара, а фи = широта радара.

Тогда из этой статьи: https://www.ngs.noaa.gov/CORS/Articles/SolerChin1985.pdf

Где Summation WGS72 на самом деле просто ковариационная матрица ENU 6x6, которую я получаю.

При реализации на Java получаю следующее:

    public static void enu2ecefCov(GMatrix ecefCov, GMatrix enuCov, LLA refLLA) {
        GMatrix R = new GMatrix(6, 6);
        GMatrix Rt = new GMatrix(6, 6);
        GMatrix tmp = new GMatrix(6, 6);

        createRotationMatrixV3(R, refLLA);

        Rt.transpose(R);
        tmp.mul(enuCov, R);
        ecefCov.mul(Rt, tmp);

    }

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

Я не уверен, что понимаю, что вы пытаетесь здесь сделать. У вас есть 6 значений ENU EP, NP, UP, EV, NV, UV? В вашей ковариационной матрице каждый элемент является произведением двух из них? Вы пытаетесь создать аналогичную ковариационную матрицу, но в координатах ECEF?

Simon Goater 24.01.2023 00:44

Я получаю матрицу дисперсии-ковариации ENU 6x6 из RADAR и пытаюсь преобразовать ее в дисперсию-ковариацию 6x6 в ECEF. При этом у меня есть все дисперсии и ковариации для всех элементов матрицы ЕНУ. Я просто не уверен, как должна выглядеть Вращательная Матрица. Имеет ли это смысл?

Travis Whitten 24.01.2023 02:54

@SimonGoater Кроме того, каждый элемент не является произведением двух. Диагонали — это дисперсии, а все остальные элементы — ковариации. [EP][EP]=Cov(EP,EP)=Variance(EP)=<некоторое значение с плавающей запятой>m^2, [EP][NP]=Cov(EP,NP)=<некоторое значение с плавающей запятой>m ^2 и так далее. На самом деле я получаю значения с плавающей запятой для каждого элемента в матрице ENU, где матрица симметрична (т.е. (столбец, строка) = (строка, столбец)).

Travis Whitten 24.01.2023 12:28

Попробуйте обнулить верхний правый и нижний левый блоки (недиагональные блоки) в матрице вращения.

Mark H 27.01.2023 05:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
4
176
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Есть два исправления:

  1. Обновите матрицу вращения, чтобы в недиагональных блоках были нули.
  2. Вычислите C' = RCRT, где C' — ковариационная матрица ECEF, C — ковариационная матрица ENU, а R — матрица поворота от ENU к ECEF для вашей комбинации положение-скорость.

Обоснование исправления № 1

Положение и скорость подобны двум различным точкам данных, которые нужно вращать, и матрица вращения должна отражать их независимость. Для этого возьмите исходную матрицу вращения 3x3 для ENU -> ECEF:

R = | -sin(λ), -cos(λ)*sin(φ), cos(λ)*cos(φ) | 
    |  cos(λ), -sin(λ)*sin(φ), sin(λ)*cos(φ) |
    |       0,         cos(φ),        sin(φ) |

И используйте его для построения матрицы вращения 6x6 (пусть «0» = матрица 3x3 из 0)

R = |R 0|
    |0 R|

Символьный расчет вращения:

R = | R11 R12 R13   0   0   0 |
    | R21 R22 R23   0   0   0 |
    | R31 R32 R33   0   0   0 | 
    |   0   0   0 R11 R12 R13 |
    |   0   0   0 R21 R22 R23 |
    |   0   0   0 R31 R32 R33 |

x = | e1 |
    | n1 |
    | u1 |
    | e2 |
    | n2 |
    | u2 |

x' = Rx = | R11*e1 + R12*n1 + R13*u1 +   0*e2 +   0*n2 +   0*u2 |
          | R21*e1 + R22*n1 + R23*u1 +   0*e2 +   0*n2 +   0*u2 |
          | R31*e1 + R32*n1 + R33*u1 +   0*e2 +   0*n2 +   0*u2 |
          |   0*e1 +   0*n1 +   0*u1 + R11*e2 + R12*n2 + R13*u2 |
          |   0*e1 +   0*n1 +   0*u1 + R21*e2 + R22*n2 + R23*u2 |
          |   0*e1 +   0*n1 +   0*u1 + R31*e2 + R32*n2 + R33*u2 |

Результатом является вектор 6x1, который представляет собой наложение одного независимо повернутого (e, n, u) поверх другого.

Обоснование исправления № 2

let X = | EP_1  EP_2 .. EP_n|  (i.e. a set of measurements)
        | NP_1  NP_2 .. NP_n|
        | UP_1  UP_2 .. UP_n|
        | EV_1  EV_2 .. EV_n|
        | NV_1  NV_2 .. NV_n|
        | UV_1  UV_2 .. UV_n|

let Xt = tranpose(X)
let C = variance-covariance matrix

C = E(XXt) - E(X)E(Xt)

let X' = RX = rotated measurements
let C' = variance-covariance matrix of rotated measurements

C' = E(X'X't) - E(X')E(X't)
   = E(RXXtRt) - E(RX)E(XtRt)     remember (AB)t = BtAt
   = RE(XXt)Rt - RE(X)E(Xt)Rt
   = R(E(XXt) - E(X)E(Xt))Rt
C' = RCRt

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

Я думаю, что сделал то, что вы ищете. Таким образом, в основном кажется, что может быть проблема с реализацией функции createRotationMatrixV3 или с входной ковариационной матрицей ENU. Я потратил немного времени, чтобы возиться с математическими функциями sin и cos, чтобы попытаться сделать это вручную.

Вот код, который у меня получился: https://codecatch.net/post/008da886-fa1a-4995-a024-f58d883e0504

Хотя совершенно нормально ссылаться на codecatch.net, было бы хорошо, если бы вы также включили код непосредственно в свой ответ (с форматированием), потому что, если другая служба отключена или недоступна по какой-либо причине, ваш ответ будет быть бесполезным без кода.

cyberbrain 28.01.2023 23:17

Да, пожалуйста, комментарий @cyberbrain - не могли бы вы отредактировать пост, Остин?

halfer 11.02.2023 22:07

Другие вопросы по теме