2015-04-16 2 views
2

У меня проблемы с Trilateration с помощью iBeacon's. Я нашел формулу с использованием векторной математики в потоке this, и я реализовал ее в своем проекте. Однако, похоже, это дает мне странные цифры.iBeacon Trilateration - векторная математика

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

CGPoint pointA = [[curBlufiPoints objectAtIndex:0] CGPointValue]; 
CGPoint pointB = [[curBlufiPoints objectAtIndex:1] CGPointValue]; 
CGPoint pointC = [[curBlufiPoints objectAtIndex:2] CGPointValue]; 

/*Point A = (40, 612) 
    Point B = (379, 788) 
    Point C = (0, 352)*/ 

float distanceA = [[distances objectAtIndex:0] floatValue]; 
float distanceB = [[distances objectAtIndex:1] floatValue]; 
float distanceC = [[distances objectAtIndex:2] floatValue]; 

/*distanceA = 13.535637 
    distanceB = 46.931522 
    distanceC = 51.585461 
     ----OR---- 
    distanceA = 349.9057; 
    distanceB = 352.84134; 
    distanceC = 353.37515;*/ 


CGPoint P2MinusP1 = CGPointMake(pointB.x - pointA.x, pointB.y - pointA.y); 
CGPoint P3MinusP1 = CGPointMake(pointC.x - pointA.x, pointC.y - pointA.y); 
CGFloat magP2MinusP1 = sqrt(pow((P2MinusP1.x), 2) + pow((P2MinusP1.y), 2)); 
CGPoint eX = CGPointMake(P2MinusP1.x/magP2MinusP1, P2MinusP1.y/magP2MinusP1); 
CGFloat i = eX.x * P3MinusP1.x + eX.y * P3MinusP1.y; 
CGPoint eXTimesI = CGPointMake(eX.x * i, eX.y * i); 
CGPoint P3MinusP1MinusITimesEX = CGPointMake(P3MinusP1.x - eXTimesI.x, P3MinusP1.y - eXTimesI.y); 
CGFloat magP3MinusP1MinusITimesEX = sqrt(pow(P3MinusP1MinusITimesEX.x, 2) + pow(P3MinusP1MinusITimesEX.y, 2)); 
CGPoint eY = CGPointMake(P3MinusP1MinusITimesEX.x/magP3MinusP1MinusITimesEX, P3MinusP1MinusITimesEX.y/magP3MinusP1MinusITimesEX); 
CGFloat j = eY.x * P3MinusP1.x + eY.y * P3MinusP1.y; 
CGFloat x = (pow(distanceA, 2) - pow(distanceB, 2) + pow(magP2MinusP1, 2))/(2 * magP2MinusP1); 
CGFloat y = (pow(distanceA, 2) - pow(distanceC, 2) + pow(i, 2) + pow(j, 2))/(2 * j) - (i * x)/j; 

CGPoint finalPoint = CGPointMake(pointA.x + x * eX.x + y * eY.x, pointA.y + x * eX.y + y * eY.y); 

NSLog(@"%f %f %f %f", finalPoint.x, finalPoint.y); 

//finalPoint.x = ~343 
//finalPoint.y = ~437 

Как видно из значений я комментировал в приведенном выше коде, когда я использую одни и те же точки, но разные расстояния я в конечном итоге с тем же результатом. Для меня не имеет смысла, как они могут обойти один и тот же ответ. Если точка (343, 437) (ответ, который я получаю для обоих наборов ввода), находится на расстоянии 13,5 единиц от точки (40, 612), как же она может быть равна 349,9 единицы?

Я не уверен, где моя математика пошла не так, но я думаю, что что-то о вычислении x и y - вот где проблемы. Я обнаружил, что строки «pow (distanceA, 2) - pow (distanceB , 2) "и" pow (distanceA, 2) - pow (distanceC, 2) "дают мне примерно одинаковый ответ для обоих наборов чисел, поэтому x и y в конечном итоге становятся одинаковыми независимо от того, какой набор чисел I использовать.

Я не думаю, что это должно быть так, любая помощь будет принята с благодарностью, спасибо!

+1

Можете ли вы привести примеры входов и выходов, которые дают вам «нечетные» результаты, и что вы думаете, что они должны быть? – davidgyoung

+0

@ davidgyoung Я вставляю значения входов и выходов в виде комментариев рядом с соответствующими строками кода. Значение y для ответа кажется намного большим, чем я ожидал. – shadowarcher

+0

Если 'distanceA' - расстояние между вами и маяком A (и тем же самым с другим), если вы попытаетесь рассчитать его снова из вашего« finalPoint »и положения маяка A, вы не получите тот же самый , Формула может быть неправильной или ваш перевод кода может быть. По крайней мере, с первым набором расстояний, но это кажется нормальным, так как «круги» не пересекаются. – Larme

ответ

2

Я пробовал свой код с образцом (и плохо выглядящим кодом). Код для тестирования: here. Для отладки я использовал "3D" new feature of XCode 6, чтобы увидеть точки и окружность, которые были вне экрана рамки, потому что я не хочу, чтобы сделать перевод (центрирования самолета и т.д.)

Основным выпуск (с вашим первый пример теста (@[@(13.535637), @(46.931522), @(51.585461)];) состоит в том, что круги не пересекаются. Нет пересечения, поэтому вы не можете угадать позицию. Если вы нарисуете круг с центральной точкой А и радиусом distanceA и сделайте это для точки B и C, вам нужно найти пересечение геолокализации, что ясно показано в статье wiki-related по связанному вопросу.

Я добавил метод «проверки», чтобы проверить, правильно ли они перекрываются, с допустимой ошибкой, , becau se мы делаем некоторые математические вычисления с плавающей точкой, и может быть несколько вопросов округления.
Метод проверки состоит в пересчете расстояния между конечным пунктом (найденной координатой) и каждой точкой. Вопрос теперь, если они отличаются (много?) От исходных.

Screenshot with first set of distances

Screenshot with second set of distances

Смежные вопросы