18

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

Эта проблема в точности как Trilateration, как описано здесь Trilateration.

Однако я не понимаю, что касается «Предварительных и окончательных вычислений» (см. Сайт wikipedia). Я не понимаю, где я мог бы найти P1, P2 и P3, чтобы я мог применить эти уравнения?

Благодаря

ответ

23

трилатерация процесс нахождения центра области пересечения трех сфер. Центральная точка и радиус каждой из трех сфер должны быть известны.

Давайте рассмотрим ваши три примера центральных точек P1 [-1,1], P2 [1,1] и P3 [-1, -1]. Первое требование состоит в том, что Р1' быть в начале координат, так что давайте регулировки точки, соответственно, добавляя смещение вектора V [1, -1] для всех трех:

P1' = P1 + V = [0, 0] 
P2' = P2 + V = [2, 0] 
P3' = P3 + V = [0,-2] 

Примечания: Скорректированные точки обозначаются (первичная) аннотация.

P2 'также должен лежать на оси х. В этом случае это уже сделано, поэтому корректировка не требуется.

Мы предполагаем, что радиус каждой сферы будет 2.

Теперь у нас есть 3 уравнения (данные) и 3 неизвестных (X, Y, Z в системе центра пересечения точки).

Решите для P4'x:

x = (r1^2 - r2^2 + d^2)/2d //(d,0) are coords of P2' 
x = (2^2 - 2^2 + 2^2)/2*2 
x = 1 

Решите для P4'y:

y = (r1^2 - r3^2 + i^2 + j^2)/2j - (i/j)x //(i,j) are coords of P3' 
y = (2^2 - 2^2 + 0 + -2^2)/2*-2 - 0 
y = -1 

Игнорирование г для 2D задач.

P4' = [1, -1]

Теперь мы переводим обратно в исходное координатное пространство путем вычитания смещения вектора V:

P4 = P4' - V = [0,0]

Точка решения, P4, лежит в начале координат, как и ожидалось.

Во второй половине статьи описывается способ представления множества точек, где P1 не находится в начале координат, или P2 не находится по оси x так, чтобы они соответствовали этим ограничениям. Я предпочитаю думать об этом вместо этого как о переводе, но оба метода приведут к тому же решению.

Edit: Поворот P2' к оси х

Если P2' не лежит на оси х после перевода Р1 происхождения, мы должны выполнить поворот на представлении.

Во-первых, давайте создадим новые векторы для использования в качестве примера: P1 = [2,3] P2 = [3,4] P3 = [5,2]

Помните, мы должны сначала перевести P1 в начало. Как всегда, вектор смещения V является -P1. В этом случае V = [-2, -3]

P1' = P1 + V = [2,3] + [-2,-3] = [0, 0] 
P2' = P2 + V = [3,4] + [-2,-3] = [1, 1] 
P3' = P3 + V = [5,2] + [-2,-3] = [3,-1] 

Для определения угла поворота, мы должны найти угол между P2' и [1,0] (ось х).

Мы можем использовать dot product равенство:

A dot B = ||A|| ||B|| cos(theta) 

Когда Б [1,0], это может быть упрощена: Точка B всегда только X компонент А, и || B || (величина B) всегда умножается на 1 и поэтому может быть проигнорирована.

Теперь мы имеем Ax = || A || соз (тета), который мы можем перегруппировку к нашему окончательному уравнению:

theta = acos(Ax/||A||) 

или в нашем случае:

theta = acos(P2'x/||P2'||) 

Вычислит величину Р2' , используя || || = SQRT (Ax + Ay + Az)

||P2'|| = sqrt(1 + 1 + 0) = sqrt(2) 

Подключив что мы можем решить для тета

theta = acos(1/sqrt(2)) = 45 degrees 

Теперь давайте использовать rotation matrix, чтобы повернуть сцену -45 градусов. Поскольку P2'y положительно, а матрица вращения вращается против часовой стрелки, мы будем использовать отрицательное вращение, чтобы выровнять P2 по оси x (если P2'y отрицательный, не отрицайте theta).

R(theta) = [cos(theta) -sin(theta)] 
      [sin(theta) cos(theta)] 

    R(-45) = [cos(-45) -sin(-45)] 
      [sin(-45) cos(-45)] 

Мы будем использовать двойной простое обозначение, «», чтобы обозначить векторы, которые были как и переведены вращались.

P1'' = [0,0] (no need to calculate this one) 

P2'' = [1 cos(-45) - 1 sin(-45)] = [sqrt(2)] = [1.414] 
     [1 sin(-45) + 1 cos(-45)] = [0]  = [0] 

P3'' = [3 cos(-45) - (-1) sin(-45)] = [sqrt(2)] = [ 1.414] 
     [3 sin(-45) + (-1) cos(-45)] = [-2*sqrt(2)] = [-2.828] 

Теперь вы можете использовать P1 ', P2 '', и P3' решить для P4 ''. Примените обратное вращение к P4 '', чтобы получить P4 ', затем обратный перевод, чтобы получить P4, вашу центральную точку.

Чтобы отменить вращение, умножьте P4 '' на R (-theta), в этом случае R (45). Чтобы отменить перевод, вычтите вектор смещения V, который совпадает с добавлением P1 (если вы первоначально использовали -P1 как ваш V).

+0

Я не знаю, как я получаю эти точки P1, P2 и P3. Я имею в виду для каждого из ссылочных известных узлов, у меня есть координата x, y, z. – CB4

+0

Р1 является точкой (который состоит из пары X, Y координат) в центре первого опорного узла. Аналогично для P2 и P3. Если у вас есть координаты, у вас есть P1, P2 и P3. Они одно и то же. – Dan

+0

Я установил тестовые координаты, чтобы проверить математику, и это не дало мне правильный результат, поэтому я запутался. Это мой настройки: р1 = (-1,1) p2 = (1,1) р3 = (-1, -1) Из уравнения я нашел: ех = (1, 0) я = 0 еу = (0, -1) d = 2 и так, чтобы найти е и уг использовать другие уравнения и я получаю х = 1 у = 1 Что неправильно. Я ожидаю увидеть x = 0 и y = 0. Примечание: В этом случае я использую r1 = sqrt (2) = r2 = r3 Можете ли вы определить проблему в расчете? – CB4

0

Это алгоритм, который я использую в прошивке 3D-принтера. Это позволяет избежать вращения системы координат, но это может быть не лучшим.

Существует 2 решения проблемы трилатерации. Чтобы получить второй, замените «- sqrtf» на «+ sqrtf» в решении квадратичного уравнения.

Очевидно, что вы можете использовать двойники вместо поплавков, если у вас достаточно мощности процессора и памяти.

// Primary parameters 
float anchorA[3], anchorB[3], anchorC[3];    // XYZ coordinates of the anchors 

// Derived parameters 
float Da2, Db2, Dc2; 
float Xab, Xbc, Xca; 
float Yab, Ybc, Yca; 
float Zab, Zbc, Zca; 
float P, Q, R, P2, U, A; 

... 

inline float fsquare(float f) { return f * f; } 

... 

// Precompute the derived parameters - they don't change unless the anchor positions change. 
Da2 = fsquare(anchorA[0]) + fsquare(anchorA[1]) + fsquare(anchorA[2]); 
Db2 = fsquare(anchorB[0]) + fsquare(anchorB[1]) + fsquare(anchorB[2]); 
Dc2 = fsquare(anchorC[0]) + fsquare(anchorC[1]) + fsquare(anchorC[2]); 
Xab = anchorA[0] - anchorB[0]; 
Xbc = anchorB[0] - anchorC[0]; 
Xca = anchorC[0] - anchorA[0]; 
Yab = anchorA[1] - anchorB[1]; 
Ybc = anchorB[1] - anchorC[1]; 
Yca = anchorC[1] - anchorA[1]; 
Zab = anchorB[2] - anchorC[2]; 
Zbc = anchorB[2] - anchorC[2]; 
Zca = anchorC[2] - anchorA[2]; 
P = ( anchorB[0] * Yca 
    - anchorA[0] * anchorC[1] 
    + anchorA[1] * anchorC[0] 
    - anchorB[1] * Xca 
    ) * 2; 
P2 = fsquare(P); 
Q = ( anchorB[1] * Zca 
    - anchorA[1] * anchorC[2] 
    + anchorA[2] * anchorC[1] 
    - anchorB[2] * Yca 
    ) * 2; 

R = - ( anchorB[0] * Zca 
     + anchorA[0] * anchorC[2] 
     + anchorA[2] * anchorC[0] 
     - anchorB[2] * Xca 
    ) * 2; 
U = (anchorA[2] * P2) + (anchorA[0] * Q * P) + (anchorA[1] * R * P); 
A = (P2 + fsquare(Q) + fsquare(R)) * 2; 

... 

// Calculate Cartesian coordinates given the distances to the anchors (La, Lb and Lc) 
// First calculate PQRST such that x = (Qz + S)/P, y = (Rz + T)/P. 
// P, Q and R depend only on the anchor positions, so they are pre-computed 
const float S = - Yab * (fsquare(Lc) - Dc2) 
       - Yca * (fsquare(Lb) - Db2) 
       - Ybc * (fsquare(La) - Da2); 
const float T = - Xab * (fsquare(Lc) - Dc2) 
       + Xca * (fsquare(Lb) - Db2) 
       + Xbc * (fsquare(La) - Da2); 

// Calculate quadratic equation coefficients 
const float halfB = (S * Q) - (R * T) - U; 
const float C = fsquare(S) + fsquare(T) + (anchorA[1] * T - anchorA[0] * S) * P * 2 + (Da2 - fsquare(La)) * P2; 

// Solve the quadratic equation for z 
float z = (- halfB - sqrtf(fsquare(halfB) - A * C))/A; 

// Substitute back for X and Y 
float x = (Q * machinePos[2] + S)/P; 
float y = (R * machinePos[2] + T)/P; 
Смежные вопросы