pro mexico kontakt indoor beacons beacon objective-c trilateration

objective-c - mexico - kontakt io api



BLE(iBeacons) Trilateración (1)

Soy un estudiante de la Universidad de Furtwangen en Alemania.

Estoy en mi último término y estoy escribiendo mi tesis ahora. Estoy muy interesado en iBeacons y la tecnología detrás de ellos. Mi proyecto actual es comparar la tecnología de baliza con otras tecnologías como GPS, ubicación inalámbrica, GSM y NFC. Para mi tesis, crearé diferentes casos de uso y compararé los resultados.

En los últimos días he tratado de determinar mi posición en una habitación. Utilizo la distancia relativa (precisión) de tres balizas y le di a cada baliza una posición fija en mi habitación. Obtengo tres círculos y calculo 6 intersecciones. Cuando un radián (precisión) es demasiado bajo, aumento este valor artificialmente. Entonces miro cuál de los 6 puntos (intersecciones) son los más cercanos. (Los tres puntos más cercanos) Con esos puntos obtengo un triángulo, y con esto calculo el punto medio.

Mi problema es que el resultado no es realmente el mejor.

He encontrado una mejor solución aquí:

https://gis.stackexchange.com/questions/40660/trilateration-algorithm-for-n-amount-of-points

pero tengo problemas para implementar esto en el Objetivo C. Pero entiendo la solución. ¿Cómo puedo importar u obtener esto en Objective C. Encontré algunas libs (C, C ++) pero no estoy realmente seguro de cuál de estas libs es la mejor?

La mejor solución para mí será una biblioteca matemática Objectice C que pueda calcular con estos puntos (x1, x2, x3, -, y1, y2, y3, ---, r1, r2, r3).

Gráfico de mi cálculo ahora


Estaba luchando con el mismo problema, luego encontré esta solution , escrita en python. Intenté portar el código en object-c y usar el mismo caso para la prueba y el resultado es exacto. Modifiqué el código para que pueda aceptar también vectores de 2 dimensiones.

El caso de prueba fue:

P1 = (3,0) r1 = 6.4031 P2 = (9,0) r2 = 4.1231 P3 = (4,8) r3 = 5.6568

Corrí estos datos a través del código:

//P1,P2,P3 is the point and 2-dimension vector NSMutableArray *P1 = [[NSMutableArray alloc] initWithCapacity:0]; [P1 addObject:[NSNumber numberWithDouble:3]]; [P1 addObject:[NSNumber numberWithDouble:0]]; NSMutableArray *P2 = [[NSMutableArray alloc] initWithCapacity:0]; [P2 addObject:[NSNumber numberWithDouble:9]]; [P2 addObject:[NSNumber numberWithDouble:0]]; NSMutableArray *P3 = [[NSMutableArray alloc] initWithCapacity:0]; [P3 addObject:[NSNumber numberWithDouble:4]]; [P3 addObject:[NSNumber numberWithDouble:8]]; //this is the distance between all the points and the unknown point double DistA = 6.4031; double DistB = 4.1231; double DistC = 5.6568; // ex = (P2 - P1)/(numpy.linalg.norm(P2 - P1)) NSMutableArray *ex = [[NSMutableArray alloc] initWithCapacity:0]; double temp = 0; for (int i = 0; i < [P1 count]; i++) { double t1 = [[P2 objectAtIndex:i] doubleValue]; double t2 = [[P1 objectAtIndex:i] doubleValue]; double t = t1 - t2; temp += (t*t); } for (int i = 0; i < [P1 count]; i++) { double t1 = [[P2 objectAtIndex:i] doubleValue]; double t2 = [[P1 objectAtIndex:i] doubleValue]; double exx = (t1 - t2)/sqrt(temp); [ex addObject:[NSNumber numberWithDouble:exx]]; } // i = dot(ex, P3 - P1) NSMutableArray *p3p1 = [[NSMutableArray alloc] initWithCapacity:0]; for (int i = 0; i < [P3 count]; i++) { double t1 = [[P3 objectAtIndex:i] doubleValue]; double t2 = [[P1 objectAtIndex:i] doubleValue]; double t3 = t1 - t2; [p3p1 addObject:[NSNumber numberWithDouble:t3]]; } double ival = 0; for (int i = 0; i < [ex count]; i++) { double t1 = [[ex objectAtIndex:i] doubleValue]; double t2 = [[p3p1 objectAtIndex:i] doubleValue]; ival += (t1*t2); } // ey = (P3 - P1 - i*ex)/(numpy.linalg.norm(P3 - P1 - i*ex)) NSMutableArray *ey = [[NSMutableArray alloc] initWithCapacity:0]; double p3p1i = 0; for (int i = 0; i < [P3 count]; i++) { double t1 = [[P3 objectAtIndex:i] doubleValue]; double t2 = [[P1 objectAtIndex:i] doubleValue]; double t3 = [[ex objectAtIndex:i] doubleValue] * ival; double t = t1 - t2 -t3; p3p1i += (t*t); } for (int i = 0; i < [P3 count]; i++) { double t1 = [[P3 objectAtIndex:i] doubleValue]; double t2 = [[P1 objectAtIndex:i] doubleValue]; double t3 = [[ex objectAtIndex:i] doubleValue] * ival; double eyy = (t1 - t2 - t3)/sqrt(p3p1i); [ey addObject:[NSNumber numberWithDouble:eyy]]; } // ez = numpy.cross(ex,ey) // if 2-dimensional vector then ez = 0 NSMutableArray *ez = [[NSMutableArray alloc] initWithCapacity:0]; double ezx; double ezy; double ezz; if ([P1 count] !=3){ ezx = 0; ezy = 0; ezz = 0; }else{ ezx = ([[ex objectAtIndex:1] doubleValue]*[[ey objectAtIndex:2]doubleValue]) - ([[ex objectAtIndex:2]doubleValue]*[[ey objectAtIndex:1]doubleValue]); ezy = ([[ex objectAtIndex:2] doubleValue]*[[ey objectAtIndex:0]doubleValue]) - ([[ex objectAtIndex:0]doubleValue]*[[ey objectAtIndex:2]doubleValue]); ezz = ([[ex objectAtIndex:0] doubleValue]*[[ey objectAtIndex:1]doubleValue]) - ([[ex objectAtIndex:1]doubleValue]*[[ey objectAtIndex:0]doubleValue]); } [ez addObject:[NSNumber numberWithDouble:ezx]]; [ez addObject:[NSNumber numberWithDouble:ezy]]; [ez addObject:[NSNumber numberWithDouble:ezz]]; // d = numpy.linalg.norm(P2 - P1) double d = sqrt(temp); // j = dot(ey, P3 - P1) double jval = 0; for (int i = 0; i < [ey count]; i++) { double t1 = [[ey objectAtIndex:i] doubleValue]; double t2 = [[p3p1 objectAtIndex:i] doubleValue]; jval += (t1*t2); } // x = (pow(DistA,2) - pow(DistB,2) + pow(d,2))/(2*d) double xval = (pow(DistA,2) - pow(DistB,2) + pow(d,2))/(2*d); // y = ((pow(DistA,2) - pow(DistC,2) + pow(i,2) + pow(j,2))/(2*j)) - ((i/j)*x) double yval = ((pow(DistA,2) - pow(DistC,2) + pow(ival,2) + pow(jval,2))/(2*jval)) - ((ival/jval)*xval); // z = sqrt(pow(DistA,2) - pow(x,2) - pow(y,2)) // if 2-dimensional vector then z = 0 double zval; if ([P1 count] !=3){ zval = 0; }else{ zval = sqrt(pow(DistA,2) - pow(xval,2) - pow(yval,2)); } // triPt = P1 + x*ex + y*ey + z*ez NSMutableArray *triPt = [[NSMutableArray alloc] initWithCapacity:0]; for (int i = 0; i < [P1 count]; i++) { double t1 = [[P1 objectAtIndex:i] doubleValue]; double t2 = [[ex objectAtIndex:i] doubleValue] * xval; double t3 = [[ey objectAtIndex:i] doubleValue] * yval; double t4 = [[ez objectAtIndex:i] doubleValue] * zval; double triptx = t1+t2+t3+t4; [triPt addObject:[NSNumber numberWithDouble:triptx]]; } NSLog(@"ex %@",ex); NSLog(@"i %f",ival); NSLog(@"ey %@",ey); NSLog(@"d %f",d); NSLog(@"j %f",jval); NSLog(@"x %f",xval); NSLog(@"y %f",yval); NSLog(@"y %f",yval); NSLog(@"final result %@",triPt);

Lo he probado dibujando en un diagrama cartesiano usando los datos de casos de prueba anteriores, y obtuve el resultado de que el punto desconocido se encuentra en (8,4), luego probé usando el código anterior y obtuve el resultado (7.999978,4.000021710625001).

Luego hice una segunda prueba usando datos:

P1 = (2,0) r1 = 5.831 P2 = (8,0) r2 = 5.831 P3 = (8,10) r3 = 5.831

El resultado manual es (5,5) y el resultado con el código es (5,5). Entonces, creo que el código es correcto.