В настоящее время я работаю с RADAR, который выводит ковариационную матрицу 6x6 для каждой дорожки в следующем формате:
Где 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);
}
Однако матрица, которую я вывожу, выглядит неправильно, поскольку я вижу одни и те же значения несколько раз, тогда как оригинал вообще не имеет одинаковых значений, кроме симметричных соответствующих блоков. Я делаю это правильно?
Я получаю матрицу дисперсии-ковариации ENU 6x6 из RADAR и пытаюсь преобразовать ее в дисперсию-ковариацию 6x6 в ECEF. При этом у меня есть все дисперсии и ковариации для всех элементов матрицы ЕНУ. Я просто не уверен, как должна выглядеть Вращательная Матрица. Имеет ли это смысл?
@SimonGoater Кроме того, каждый элемент не является произведением двух. Диагонали — это дисперсии, а все остальные элементы — ковариации. [EP][EP]=Cov(EP,EP)=Variance(EP)=<некоторое значение с плавающей запятой>m^2, [EP][NP]=Cov(EP,NP)=<некоторое значение с плавающей запятой>m ^2 и так далее. На самом деле я получаю значения с плавающей запятой для каждого элемента в матрице ENU, где матрица симметрична (т.е. (столбец, строка) = (строка, столбец)).
Попробуйте обнулить верхний правый и нижний левый блоки (недиагональные блоки) в матрице вращения.
Есть два исправления:
Обоснование исправления № 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 - не могли бы вы отредактировать пост, Остин?
Я не уверен, что понимаю, что вы пытаетесь здесь сделать. У вас есть 6 значений ENU EP, NP, UP, EV, NV, UV? В вашей ковариационной матрице каждый элемент является произведением двух из них? Вы пытаетесь создать аналогичную ковариационную матрицу, но в координатах ECEF?