Масштабирование 3 кругов постоянно, пока они не пересекаются - PullRequest
0 голосов
/ 23 мая 2019

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

current

когда это должно выглядеть примерно так:

expected

Так что я думал о том, чтобы одновременно масштабировать круги, используя постоянный коэффициент, пока все они не пересекаются в одной точке (что было бы оптимальным) или пока сумма их взаимных расстояний не станет минимальной. Учитывая координаты XY трех окружностей в 2D-пространстве, а также их FSPL -считанные расстояния от контрольной точки (которая является центром одной из окружностей), функция должна возвращать наилучшее масштабирование фактор, который минимизирует ошибку. Должно быть что-то вроде этого:

def find_best_scaling_constant(p1, p2, p3, r1, r2, r3):
  # some magic here
  return scalingConstant

find_best_scaling_constant((0.00, 0.00), (3.15, -0.47), (4.90, 7.00), 1.12, 1.77, 0.18)

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

1 Ответ

1 голос
/ 24 мая 2019

Пусть круги имеют центры с координатами:

enter image description here

и пусть соответствующие радиусы, которые вы вычислили, будут:

enter image description here

соответственно. Похоже, вы ищете точку enter image description here и коэффициент масштабирования со следующим свойством:

enter image description here

Эквивалентно, нам нужно найти точку enter image description here в плоскости, которая является общей точкой пересечения трех окружностей, полученную путем пересчета радиусов исходных окружностей на общий множитель к, или в математической записи нам нужно решить систему

enter image description here

Понятно, что системы выше и свойство, написанное перед системой, эквивалентны.

Чтобы упростить вещи, возведите в квадрат обе стороны каждого уравнения из системы:

enter image description here

По теореме Пифагора напишите

enter image description here

Вот почему в явных формулах система трех квадратов уравнений, приведенная выше, фактически является квадратичной системой уравнений:

enter image description here

которое после перемещения члена с правой стороны каждого уравнения в левую становится:

enter image description here

Разверните все квадратные различия в каждом уравнении и измените порядок слов:

enter image description here

Чтобы упростить эту систему, вычтите второе уравнение из первого, затем вычтите третье уравнение из второго и оставьте одно из квадратичных уравнений, скажем, оставьте первое квадратное уравнение:

enter image description here

Идея найти решение этой системы заключается в следующем:

enter image description here

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

enter image description here

и когда мы умножаем последнее матричное уравнение на обратную матрицу M:

enter image description here

Давайте также напишем в матричной записи

enter image description here

enter image description here

enter image description here

enter image description here

И, наконец, алгоритм нахождения точки пересечения трех окружностей после масштабирования с соответствующим коэффициентом масштабирования можно сформулировать следующим образом:

enter image description here enter image description here

Заметим, что квадратное уравнение имеет два решения для z. Тот, который я выбрал с минусом, является первой точкой пересечения всякий раз, когда три круга являются внешними по отношению к каждому и имеют начальные непересекающиеся радиусы. Существует также вторая точка пересечения, которая соответствует положительному решению для z. Если у вас есть информация из четвертой башни, тогда вы сможете выбрать правильную точку и, возможно, даже сможете полностью линеаризовать проблему. Но только с этими доступными данными у вас есть два решения.

Я проверил алгоритм на следующем примере со служанкой:

x1 = 0;  y1 = 0;  r1 = sqrt(13)/3;
x2 = 5;  y2 = 1;  r2 = sqrt(13)/3;
x3 = 3;  y3 = 7;  r3 = sqrt(17)/3;

и выводит правильное местоположение

x = 2;  y = 3;  

и масштабный коэффициент k = 3.

Я реализовал это в Matlab / Octave, потому что мне там удобна линейная алгебра:

function [xy, k] = location_scaled(x1, y1, r1, x2, y2, r2, x3, y3, r3)

        M = 2*[x2 - x1  y2 - y1; 
               x3 - x2  y3 - y2];
        A = [r1^2 - r2^2; 
             r2^2 - r3^2];
        B = [x2^2 + y2^2 - x1^2 - y1^2; 
             x3^2 + y3^2 - x2^2 - y2^2];
        A = M\A;
        B = M\B;

        a = A'*A;
        b = 2*B'*A - 2*[x1  y1]*A - r1^2;
        c = [x1 y1]*[x1; y1] - 2*[x1  y1]*B + B'*B;

        k = (- b - sqrt(b^2 - 4*a*c)) / (2*a);

        xy = k*A + B;
        k = sqrt(k);

end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...