Mediciones de posición usando sonido y ultrasonido

Eduardo, tenes bibliografia sobre este tema?
No, de los artículos que he leido (unos pocos) no daban detalles del método de cálculo.

Hay un detalle que no es menor, que es la exactitud de las diferencias de tiempo medidas.
Un emisor de ultrasonido no emite un frente de onda abrupto-cortito-esférico sino que es una onda bastante direccional con un tiempo de crecimiento de varios ciclos.
Esto hace que en distancias cortas el error sea mucho mayor que el deseado.

Me acuerdo de una artículo de National Instruments (creo) donde unos tipos proponían instalar una red de micrófonos con su sistema de comunicación en barrios "peligrosos".
Si en la zona había disparos de arma de fuego, saltaba una alarma en la policía con el lugar preciso.

-----------------------------------------

Hace un rato hice una visita al baño y revisando el problema encontré que se puede simplificar al punto que con tres sensores en posición arbitraria solo hay que resolver una ecuación de 2do grado
Por lo tanto tengo que rectificarme sobre parte de los comentarios anteriores. :oops:
 
Bueno, desde el punto de vista de la implementacion, yo no mandaria pulsos desde el objeto a detectar, mucho menos un reloj. El reloj seria de los receptores, el dispositivo enviaria un mensaje, digamos, una vez por segundo. Dentro del mensaje y luego del preambulo estaria el dato al que los receptores se sincronizarian para medir la diferencia de tiempos.

Pero estoy de acuerdo con vos, la precision esta muy limitada, la velocidad del sonido ademas de ser lenta creo que sufre muy grandes fluctuaciones... despues de todo depende del aire para desplazarse.

Resolviste el problema con una ecuacion, sin saber el tiempo de emision? No puede ser, son tres incognitas independientes... necesitasvtres ecuaciones.
 
Última edición:
Resolviste el problema con una ecuacion, sin saber el tiempo de emision? No puede ser, son tres incognitas independientes... necesitasvtres ecuaciones.
Dos sensores y una diferencia de tiempo te definen una hipérbola.
Otro sensor más y otra diferencia de tiempo te definen otra hipérbola.
La intersección de las dos te da la posición.
 
Yo por ahora pongo el primer ejemplo que hice con Matlab, el que usa tabla de valores precalculados, por si a alguien le interesa...

Código:
% This simulation makes positioning inside a rectangle
% There are sensors in three corners of the rectangle 
% and an object inside emits sounds to the sensors

Len    = 180;
Heigth = 100;

% Positions of the sensors in cm
x = [0, 0, Len];
y = [0, Heigth, 0];

% Resolution of the positioning table in cm
res = 4;

% Speed of sound in cm/ms
vs = 34.02;

% time of emission of a pulse from the sensor - it is not needed,
% the calculation cancels it, but several values can be tested to see 
% that it doesn't affect the results
ts = 15;  % in ms

% matrix of delta distance for each position of the emitter
Xt = linspace(res/2, Len-res/2, Len/res); 
Yt = linspace(res/2, Heigth-res/2, Heigth/res); 

for ii = 1:size(Xt)(2)
    for jj = 1:size(Yt)(2)

        % calculate time of arrival of signal to each sensor
        t = sqrt( (Xt(ii)-x).^2 + (Yt(jj)-y).^2 ) / vs + ts; % in ms        
        d21(ii,jj) = t(2)-t(1);
        d31(ii,jj) = t(3)-t(1);
    end
end    

accum_err = 0;

% Now detect several positions
for tt = 1: 100

    % generate sensor data
    xpi = rand*Len;
    ypi = rand*Heigth;
    ts = 10 + rand*30;
    
    % measured values
    ta = sqrt( (xpi-x).^2 + (ypi-y).^2 ) / vs + ts ; % in ms
    
    d21a = ta(2)-ta(1);
    d31a = ta(3)-ta(1);  
    
    % explore the table and calculate quadratic error
    err = 10000; 
    ia = 1;   % index to the distance tables
    ja = 1;
    
    for ii = 1:size(Xt)(2)
        for jj = 1:size(Yt)(2)
            err_new = (d21a-d21(ii,jj))^2 + (d31a-d31(ii,jj))^2;
            
            % Lower error found, candidate for estimated position
            if (err_new < err)
                err = err_new;
                ia = ii;
                ja = jj;
            end    
        end
    end
    
    % To show maximum quadratic error 
    xpa = res * (ia-0.5);
    ypa = res * (ja-0.5);
    new_accum_err = (xpi-xpa)^2+(ypi-ypa)^2;
    if (new_accum_err > accum_err)
        accum_err = new_accum_err;
        xpam = xpa;
        ypam = ypa;
        xpim = xpi;
        ypim = ypi;
    end;    
end;        

printf('Maximum quadratic error after 100 tests  - Real x position: %g, estimated x position: %g\n', xpim, xpam);
printf('Real y position: %g, estimated y position: %g\n\n\n', ypim, ypam);
 
Bueno. Por el camino que propuse antes llegué a buen puerto.
Incluso me sobraba una ecuación. :rolleyes:

Cambié la notación para facilitar los pasos de algebra pero es lo mismo:
en lugar de Nac, Nbc, Ndc les llamo A, B y D respectivamente. Además uso:

H=L1/2 y V = L2/2.

Las ecuaciones quedan ahora:

1) (H + x)^2 + y^2 = (D + TC)^2
2) (H - x)^2 + y^2 = (B + TC)^2
3) (V + y)^2 + x^2 = (A + TC)^2
4) (V - y)^2 + x^2 = TC^2

Se simplifican los términos al cuadrado, lo que ocurre por la adecuada ubicación de los sensores.
Por ejemplo: restando la 1 menos la 2 se tiene:

4 H x = D*D - B*B + 2 TC (D - B)

y restando la 3 menos la 4 se llega a:

4 V y = A*A + 2 A TC

Como TC no se conoce se la debe eliminar y para eso se busca otra ecuación, restando la 1 menos la 3, lo que da:

H*H - V*V + 2 H x - 2 V y = D*D - A*A + 2 (D - A) TC

Despejando TC de la anterior y reemplazando en las otras dos se obtiene un sistema lineal de 2x2 en X e Y, que se resuelve fácilmente. Luego de algunos pasos, quedan dos ecuaciones del tipo:

X = M1 * Y + B1

X = M2 * Y + B2

que tienen la solución en:

X = (B1*M2 - B2*M1)/(M2-M1)

Y = (B1 - B2)/(M2-M1)

El listado que sigue se puede poner en Matlab y da los resultados del enunciado.

A = 182.587;
B = 229.1;
D = 668.689;

L1=1800;
L2=1000;

H = L1/2;
V = L2/2;

M1 = (V/H) *(D-B)/A;
B1 = (D-B) *(D+B-A)/(4*H);
M2 = (V/H) *(2*D-A)/A;
B2 = (V*V-H*H+D*D-D*A)/(2*H);

X = (B1*M2 - B2*M1)/(M2-M1)
Y = (B1 - B2)/(M2-M1)
También probé de seguir reemplazando algebraicamente para obtener la expresión de Y a partir de los datos, y llegué a esto:
A = 182.587;
B = 229.1;
D = 668.689;

L1=1800;
L2=1000;

H = L1/2;
V = L2/2;

Y = ((D-B)/2 - (V*V - H*H + D*(D-A))
Y =Y /(D+B-A))
Y =Y *A/(2*V)
que da el resultado con la misma precisión de la fórmula anterior.

Y ya no me quedaron ganas de repetir para X.

Eduardo: ¿ Podés poner la fuente de dónde sacaste el problema ?

PD: No estoy seguro pero creo que se podría resolver el problema usando la información de solo
tres sensores. Igual se debería tener 4, por la cuestión práctica de abarcar todas las regiones del
rectángulo de manera pareja, y que el resultado no dependa de cuál sensor se dispara primero.
 
Última edición:
Primero veamos una relación conveniente entre las coordenadas de un vértice y sus lados.
Triang.png
En el triángulo de la figura, [latex]L_0[/latex] es un lado conocido y [latex]x[/latex] e [latex]y[/latex] las coordenadas buscadas.

Del teorema del coseno tenemos que [latex]x=\dfrac{L_0^2+L_1^2-L_2^2}{2L_0}[/latex]

pero de la figura vemos que [latex]L_1\cos\theta=x[/latex]

Por lo tanto [latex]x=\dfrac{L_0^2+L_1^2-L_2^2}{2L_0}[/latex]

que puede escribirse de esta manera [latex]x=\dfrac{L_0}{2}\left(1+S\;D\right)[/latex]

con [latex]S=\dfrac{L_1+L_2}{L_0}[/latex] y [latex]S=\dfrac{L_1-L_2}{L_0}[/latex]


Para la coordenada [latex]y[/latex] aplicamos Pitágoras [latex]y^2=L_1^2-x^2[/latex]

y trabajándola un poco llegamos a [latex]y=\dfrac{L_0}{2}\sqrt{(S^2-1)(1-D^2)}[/latex]


Estas relaciones de [latex]x[/latex] e [latex]y[/latex] son el punto de partida ya que conocemos la diferencia de distancias, y si se tienen mas triágulos (por lo tanto mas ecuaciones) se podrá conocer la suma.


-----------------------------------------------

Aplicando esas fórmulas con los 4 sensores en cruz

Sensores d y b
[latex]x=\frac{L_{db}}{2}\left(1+S_{db}\;D_{db}\right)-\frac{L_{db}}{2}=\frac{L_{db}}{2}\left(S_{db}\;D_{db}\right)[/latex]

[latex]y=\frac{L_{db}}{2}\sqrt{(S_{db}^2-1)(1-D_{db}^2)}[/latex]

Sensores a y c
[latex]x=\frac{L_{ac}}{2}\sqrt{(S_{ac}^2-1)(1-D_{ac}^2)}[/latex]

[latex]y=\frac{L_{ac}}{2}\left(1+S_{ac}\;D_{ac}\right)-\frac{L_{ac}}{2}=\frac{L_{ac}}{2}\left(S_{ac}\;D_{ac}\right)[/latex]

Debe cumplirse entonces
[latex]\dfrac{L_{db}^2}{4}({S_{db}}^2\;D_{db}^2)=\dfrac{L_{ac}^2}{4}(S_{ac}^2-1)(1-D_{ac}^2)}[/latex]

[latex]\dfrac{L_{ac}^2}{4}(S_{ac}^2\;D_{ac}^2)=\dfrac{L_{db}^2}{4}(S_{db}^2-1)(1-D_{db}^2)}[/latex]

Resultando un sistema de 2x2 cuyas incógnitas son [latex]S_{ac}^2[/latex] y [latex]S_{db}^2[/latex]

No voy a detallar los pasos correspondientes a la solución del sistema y su posterior reemplazo+simplificación porque no aportan nada.

En la imagen siguiente en Excel está descriptos el procedimiento de cálculo resultante.

Además ya me está pudriendo la tipografía pixelada de este Latex :( . El sentido de escribir fórmulas en Latex es hacerlas más legibles, pero este motor es tan horrible que se entienden mejor en Ascii.
No se donde estará el problema de la espantosa tipografía, porque en otros sitios (como el rinconmatematico) las fórmulas salen como deben: Claras y legibles.

Cuadri1800xls.png


-----------------------------------------------

La otra forma para 4 sensores en cruz es planteando un sistema de ecuaciones partiendo de:

[latex](x_i-x)^2+(y_i-y)^2=(t_i+T)^2[/latex]

y la solución es la que publicó Alejandro.



Hay unos detalles a tener en cuenta:

- Si los sensores están dispuestos de tal manera que exista un punto equidistante de ellos ==> El sistema será singular ==> determinante = 0
Por lo tanto, no es un método apropiado para sensores en cruz o ubicados en una circunferencia.
Algo que no es problema, pues fácilmente se pueden ubicar los sensores de tal manera que nunca los tiempos de todos sean parecidos.

- Son necesarios como mínimo 4 sensores si se quiere "linealizar" el problema.
Si tuviéramos 3 sensores y combináramos entre sí las ecuaciones para eliminar los términos cuadráticos quedaría una matriz singular ==> No way! Aunque el problema igual tiene solución olvidémonos de linealizarlo.


---------------------------------------------------------------------------------------------------

Y ya que estamos, doy un ejemplo en Matlab con 5 sensores aplicando mínimos cuadrados truchos.
¿Por que truchos? Porque en realidad no se está minimizando el error cuadrático, aunque parezca que sí :).


Consideremos esta figura. Igual que antes, se conoce la posicion de los sensores y los tiempos de recepción del pulso pero no el instante de emisión.

Para cada sensor escribimos planteamos: [latex](x_i-x)^2+(y_i-y)^2=(t_i+T)^2[/latex]

que desarrollado queda: [latex]x_ix+y_iy+t_iT=\frac{1}{2}\left((x_i^2+y_i^2-t_i^2)-(T^2-x^2-y^2)\right)[/latex]

El recurso para "linealizar" este sistema como hizo Alejandro es trasladar las coordenadas (posición y tiempos) al baricentro. Ya que respecto del baricentro se cumple que
[latex]\displaystyle\sum_{i=1}^n{x_i}=\displaystyle\sum_{i=1}^n{y_i}=\displaystyle\sum_{i=1}^n{t_i}=0[/latex]

Entonces, al sumar todas las ecuaciones quedará:

[latex]\left(\displaystyle\sum_{i=1}^n{x_i}\right)x+\left(\displaystyle\sum_{i=1}^n{y_i}\right)y + \left( \displaystyle \sum_{i=1}^n{t_i}\right)T = 0 =\frac{1}{2}\left(\displaystyle\sum_{i=1}^n{x_i^2+y_i^2-t_i^2}-N(T^2-x^2-y^2)\right)[/latex]

y de ahí sacamos que debe ser [latex]T^2-x^2-y^2=\dfrac{1}{N}\displaystyle\sum_{i=1}^n{\left(x_i^2+y_i^2-t_i^2\right)}[/latex]

y reemplazando en las ecuaciones nos queda un bonito sistema de ecuaciones lineales :) (con mas ecuaciones que incógnitas) que resolvemos por mínimos cuadrados.

La ampliación del método a 3 dimensiones es evidente.

------------------------

Matlab5p.png

La figura anterior la generé con un CAD, las coordenadas de los sensores son:

A = [ 325.41377769 , 0 ]
B = [ 224.33606904 , 211.33832358 ]
C = [ -31.3004399 , 132.49461234 ]
D = [ -45.0387352 , 55.55330358 ]
E = [ 108.13874084 , -39.60976031 ]

puse el emisor en

x = 58.57614754
y = 84.23639344

y las longitudes-tiempos correspondientes de cada segmento quedan

ta_abs = 279.81796019
tb_abs = 208.88095227
tc_abs = 102.01302202
td_abs = 107.51169039
te_abs = 133.39535394


Para simular, supongo que la emisión del pulso ocurrió a T=100
luego, los tiempos leídos por cada sensor serán:

ta = 179.81796019 ;
tb = 108.88095227 ;
tc = 2.01302202 ;
td = 7.51169039 ;
te = 33.39535394 ;


El programa en Matlab podemos implementarlo así:

Código:
% Coordenadas de los sensores
    A = [ 325.41377769 ,   0          ] ;
    B = [ 224.33606904 , 211.33832358 ] ;
    C = [ -31.3004399  , 132.49461234 ] ;
    D = [ -45.0387352  ,  55.55330358 ] ;
    E = [ 108.13874084 , -39.60976031 ] ;

    u = ones(5,1); v = [1  1 -1];  % Matrices auxiliares

% Tiempo leido en cada sensor
% Como es un test, arbitrariamente le reste 100
% a las distancias originales
    ta = 179.81796019 ;
    tb = 108.88095227 ;
    tc =   2.01302202 ;
    td =   7.51169039 ;
    te =  33.39535394 ;
    Ti = [ta;tb;tc;td;te] ; % Matriz de tiempos leidos

%-------------------------------------------------------

% Resolucion

    P = [[A;B;C;D;E],Ti] ;  % Armo la matriz principal
    Pm = mean(P)  ;    % Matriz con el promedio de la posicion y los tiempos
    Pc = P-u*Pm   ;    % Traslacion de coordenadas
    B  = Pc.^2*v' ;    % Matriz con xi^2 + yi^2 - ti^2
    Bm = mean(B)  ;    % Su promedio
    Bc = B - u*Bm ;    % Sus valores respecto del promedio.

    Xc = Pc\Bc/2  ;    % Resuelve el sistema por LMS
    X = Xc' +v.*Pm     % Traslado para obtener [x,y,T+tm]
    Tabs = Ti + u*X(3) % Tiempos de transito


Ejecutando Matlab devuelve lo que se esperaba que devuelva :)

Matlab5p_prtsc.png


===================================================================

Alejandro: No saqué el problema de ningún lado. Dibujé en un CAD los puntos y anoté las longitudes. El resto es álgebra en el baño.




En cuanto me reponga de escribir, subo la solución para solo 3 sensores...
 
El resto es álgebra en el baño.
Por lo visto últimamente has andado mucho por el baño. Te recomiendo comer un poco de queso de rallar. ;)
Algo que no es problema, pues fácilmente se pueden ubicar los sensores de tal manera que nunca los tiempos de todos sean parecidos.
Esto puede no ser tan fácil de implementar en general, porque por razones de construcción del resto del sistema (las esquinas de una pantalla, o de una habitación, etc.) uno puede verse obligado a ubicar los sensores más o menos regularmente.
Me parece a mí que cuando la geometría es algo sospechosamente complicada lo más práctico sería prever alternativas para los casos particulares dentro mismo de las expresiones que pueden hacer fallar las cuentas.
Por ejemplo controlar que no se anulen los denominadores que se calculan sobre la marcha.

Otro caso crítico es cuando las distancias son muy chicas porque, aunque las expresiones se pueden utilizar, los errores de medición se propagan y distorsionan mucho los resultados.
Por ejemplo: si se mide Nad = 1, resulta igual al error de medición (un pulso), y el tiempo calculado tendrá un 100% de error.

Volviendo al problema original:
En mi planteo, el único caso en que no se pueden aplicar las expresiones es cuando el denominador (M1 - M2) se hace cero. Esto ocurre solamente cuando Ndc+Nbc=Nac (en mis cuentas D+B=A).

El único caso que falla este método es cuando L1 = L2.
Entonces si Nac = 0, se hacen también Nbc = Ndc = 0, con lo que Nbc+Ndc=0.

Por lo tanto, para usar tranquilos el sistema de ecuaciones, sólo es cuestión de hacer que L2 y L1 no sean demasiado parecidos.

Si son parecidos, aunque no sean iguales, se podrán efectuar los cálculos, pero se tendrá el otro problema: de propagación de los errores por resta de cantidades similares (propagación catastrófica).

Tampoco es bueno que L1 sea muy diferente a L2 (por ejemplo L1 > 100 L2 o L2 > 100 L1) porque de ese modo el cálculo de X y de Y pueden tener errores de muy diferente magnitud. Eso puede no ser conveniente si luego se deben usar los números para otras cuentas.

Una buena relación entre ambos es L1/L2 = 1.8 ~ 2 como es el caso del ejemplo.

Y sí: es una lucha !

Les subo un artículo para leer algo de este asunto de los errores numéricos (en inglés).
Lo bajé hace algún tiempo, ahora ya no se consigue gratis! Excepto acá
 

Adjuntos

  • IRENE A. STEGUN, MILTON ABRAMOWITZ - Pitfalls in Computation (1956).pdf
    702.4 KB · Visitas: 8
Última edición:
Estaba pendiente la solución para con sólo tres sensores.

Al final, después de haberlo descartado porque creía que siempre se desembocaba en una ecuación de 4to grado como corresponde a la intersección de dos hipérbolas genéricas, encuentro que mediante la elección apropiada de las incógnitas resulta una ecuación de 2do grado.


Consideremos la siguiente figura, donde P es el emisor y A,B,C son los sensores dispuestos formando un triángulo de lados Lab,Lac y ángulo u.
Triang_3s0.png
Utilizando las fórmulas de mi mensaje anterior, tenemos que:

[LATEX]x1 = \frac{L_{ab}}{2}\left(1+\left(\frac{L_{pa}+L_{pb}}{L_{ab}}\right)\left(\frac{L_{pa}-L_{pb}}{L_{ab}}\right)\right)[/LATEX]

[LATEX]y1 = \frac{L_{ab}}{2}\sqrt{\left(\left(\frac{L_{pa}+L_{pb}}{L_{ab}}\right)^2-1\right)\left(1-\left(\frac{L_{pa}-L_{pb}}{L_{ab}}\right)^2}[/LATEX]

y algo similar para x2,y2


Notar que como [LATEX]L_{pa}+L_{pb} = 2L_{pa}-\left(L_{pa}-L_{pb}\right)[/LATEX]

Llamando [LATEX]L=2L_{pa} \quad , \quad D_1=\frac{L_{pa}-L_{pb}}{L_{ab}}[/LATEX]

las ecuaciones anteriores pueden escribirse como:

(ec.1)[LATEX]\quad x1 = \frac{L_{ab}}{2}\left(1+\left(\frac{L}{L_{ab}}-D_1\right)D_1\right)[/LATEX]

(ec.2)[LATEX]\quad y1 = \frac{L_{ab}}{2}\sqrt{\left(\left(\frac{L}{L_{ab}}-D_1\right)^2-1\right)\left(1-D_1^2\right)}[/LATEX]

y similar para x2,y2


Como x1,y1 y x2,y2 están relacionados por [LATEX] x_1=y_2 \sin(u) + x_2\cos(u) [/LATEX]

hacemos [LATEX]\left(y_2 \sin(u)\right)^2 = \left(x_1-x_2\cos(u)\right)^2[/LATEX]

De esta forma, desaparece la raíz cuadrada y nos queda una bonita ecuación de 2do grado [LATEX]aL^2-2bL-c=0[/LATEX]

con:

[LATEX]a = \sin(u)^2 + 2\cos(u)D_1D_2- D_1^2 - D_2^2 \\
b = L_{ab}(1-D_1^2)(D_1-\cos(u)D_2) + L_{ac}(1-D_2^2)(D_2-\cos(u)D_1) \\
c = \left(L_{ab}(1-D_1^2)\right)^2 + \left(L_{ac}(1-D_2^2)\right)^2 - 2\left(L_{ab}(1- D_1^2)\right)\left(L_{ac}(1-D_2^2)\right)\cos(u)
[/LATEX]

Como solamente interesa la raíz positiva

[LATEX]L = \frac{b+\sqrt{b^2+ac}}{a}[/LATEX]

Reemplazando L en (ec.1) y (ec.2) tenemos los valores de x1 e y1.

------------------------------------------------------------------------------

Un ejemplo usando Matlab.

Tenemos los siguientes datos (el exceso "imposible" de decimales es nada mas que para control):

Triang_3s.png
Código:
%----------------------------
% Datos

Lab = 200    ;
Lac = 230    ;
u   = 50     ;

d1 = 39.7776862   ;
d2 = 23.30912496  ;
%----------------------------

Código:
d1 = d1/Lab      ; % diferencias relativas
d2 = d2/Lac      ;

p = Lab*(1-d1^2) ;
q = Lac*(1-d2^2) ;
se = sin(u*pi/180)  ;
co = cos(u*pi/180)  ;

% Calcula los coef. y resuelve
% la ec. de 2do grado
a = se^2 + 2*co*d1*d2 - d1^2 - d2^2 ;
b = p*(d1-co*d2) + q*(d2-co*d1)     ;
c = p^2 + q^2 - 2*p*q*co            ;
t = (b+sqrt(b^2+a*c))/a             ;

% Coord. x1
x1 = Lab*(1+(t/Lab-d1)*d1)/2

% En Matlab, evaluar y1 de esta forma
% no tiene ninguna ventaja numerica,
% pero si se trabajara con precision
% simple (float) si.
x2 = Lac*(1+(t/Lac-d2)*d2)/2        ;
y1 = (x2-x1*co)/se

Ejecutado devuelve... lo esperado.

Triang_3s_Matlab.png
 
Un comentario adicional.

Luego de la buenisima solucion de Eduardo para tres sensores, todavia me quede pensando en la forma de linearizar por diferencias.

Para linearizar como propuso Asherar, necesito cuatro sensores. Porque si hago ecuaciones diferencias con tres sensores, me queda que una de las ecuaciones diferencia es combinacion lineal de las otras dos y como ya dijo Eduardo, el determinante es cero y no va.

Entonces tomo cuatro sensores y planteo las ecuaciones diferencia.
Para no complicarme mucho, a las tres ecuaciones lineales resultantes las resuelvo mediante su determinante.

La primera ubicacion que viene a la mente es, cuatro sensores en cuatro esquinas. Pero tal ubicacion simetrica hace que el determinante sea cero en el centro.

Para obviar ese problema intente una configuracion asi:

___*___

*__*__*

En esta configuracion, si donde estan los tres sensores es el lado mayor, creo que no se puede producir determinante cero para ningun punto interno del rectangulo.

Pero tiene otro problema, que es un gran error en "y" para los puntos cercanos al lado inferior.

Por ultimo, probe esta configuracion de sensores que da resultados bastante uniformes para todo el area del rectangulo:

___*__*

*__*__


Me queda la duda si hay alguna configuracion mejor. Aleatoria me parece que no es buena idea, ya que muchas configuraciones aleatorias crean determinante cero en algun punto del plano.

Saludos
Claudio
 
Última edición:
Con el planteo que seguí yo se tienen 4 ecuaciones para 3 incógnitas: x, y, TC. Por esto antes dije que me sobraba una ecuación, y eliminar una ecuación equivale a eliminar uno de los sensores !!! Pero no lo comprobé para ver hasta dónde se llegaba. Perdonen la pereza :oops:

Sin hacer muchas cuentas creo que lo que va a pasar es que las ecuaciones van a contener cuadrados y raíces, como le queda a Eduardo.
 
Última edición:
No se si no se entendio... pero si queremos obtener tres ecuaciones lineales, que se pueden resolver por determinantes, se necesitan cuatro sensores. A eso me referia.

Cuando tenga tiempo voy a hacer una comparacion de los errores en las diversas configuraciones.

La causa por la que me "emperre" en conseguir ecuaciones lineales es porque me parece que son mucho mas faciles de resolver que ecuaciones que contienen senos y cosenos, sobre todo si hipoteticamente lo hicieramos en un micro.
 
Bueno, algo de esto ya se sabe, pero ya que viene a cuento, lo cuento.

En la memoria del micro se suelen cargar tablas de valores para seno y coseno.
Pero el resto de la aplicación debe usar algo de memoria también, por eso para ahorrar espacio se pueden cargar valores cada 1º (por ejemplo) y luego interpolar.
Otro método para calcular las funciones trigonométricas es emplear series de potencias (Taylor), que se evalúan en forma iterativa hasta que el nuevo término sea menor que el último dígito de la representacion numérica. Ejemplo: Serie para calculo del sen(x) (fuente)
También hay métodos iterativos muy rápidos para calcular raíz cuadrada. Por ejemplo el algoritmo babilónico (Wiki):
Raíz(x):

  1. Escoja dos números
    92eb5ffee6ae2fec3ad71c777531578f.png
    y
    2510c39011c5be704182423e3a695e91.png
    tales que
    b1a8613ecefbb93cd464a314f08f5215.png
  2. Si
    ca194d86f08ab46dcc8f911e103222ea.png
    vaya al paso 6, si no, vaya al paso 3
  3. Asigne
    67b8a3fe12860b78eca106bc0490aed1.png
  4. Asigne
    46c17e035532eafd5a5b8c1951a8ac27.png
  5. Vaya al paso 2
  6. Escriba "
    60a9086607d644e66369c14d2bf96e1f.png
    "
 
Última edición:
Por supuesto, asherar, para casi todo hay soluciones.

La pregunta es cual es el costo comparado de cada solucion. Para un micro dado, cada cuanto tiempo voy a tener una actualizacion del dato, y con que error.

Yo por ejemplo supuse que la precision de la medida es del orden de 100us para hacer algunos de los calculos. Despues supuse que tenes una incertidumbre adicional de +-100us por ruidos, rebotes y demas. Y ahi ya te saltan unos errores bastante considerables, de alrededor de 5cm para dimensiones del rectangulo de 1m x 2m.

Por ahi te conviene "desperdiciar" dos sensores, en vez de tres, cinco, para poder linealizar y ademas para tener otro set de medidas y despues minimizar error cuadratico o descartar una medida si alguno de los sensores produjo un error considerable o no capto nada directamente.

Lo que si... pienso de vuelta ahora si no sera mucho mas facil usar una camara... mucho mas facil y hasta mucho mas preciso, comparado con sensores ultrasonicos. Hoy por hoy hay disponibles tantas tecnicas de procesamiento que en muchisimos casos, con una camara se hace la observacion y chau pinela. Y tenes la ventaja de que al movil no le tenes que agregar absolutamente nada. Cualquier cosa que le agregues a un movil es un inconveniente por tamanio, pilas, peso, etc. etc.
 
...La causa por la que me "emperre" en conseguir ecuaciones lineales es porque me parece que son mucho mas faciles de resolver que ecuaciones que contienen senos y cosenos, sobre todo si hipoteticamente lo hicieramos en un micro.
Bueno... el tipo de datos, el hardware y el objetivo del cálculo son quienes deciden el algoritmo a utilizar.

En los casos donde se utiliza un micro en general también es importante la velocidad, por lo tanto siempre hay que "tunear" las fórmulas. Y ni hablar si se pretende máximo rendimiento operarando en punto fijo.

Por ejemplo, sin en lugar de las longitudes y el ángulo se tienen las coordenadas cartesianas de los sensores, no se va a andar calculando las longitudes,seno y coseno en cada iteración, pues son constantes.
Tanto esas como las demás constantes derivadas se calculan durante el inicio, una vez ingresadas las coordenadas de los sensores.
Después, en operación, el micro todo lo que deberá hacer son las sumas y productos que involucren los tiempos leídos.

Por ejemplo: Si se ingresaron las coordenadas referidas a uno de los vértices y un lado [LATEX][0,0];[L_1,0];[x_2,y_2][/LATEX] , las longitud al punto 2 serán [LATEX]L_2=\sqrt{x_2^2+y_2^2}[/LATEX]
y el seno y coseno del ángulo formado [LATEX] \sin\theta=\frac{L_1y_2}{L_1L_2}\quad;\quad \cos\theta=\frac{L_1x_2}{L_1L_2}[/LATEX] que se trabajan como constantes, no vamos a calcular el arcoseno para después hacer el seno.

Incluso, trabajando la expresión podés eliminar la evaluación de la raíz cuadrada en las constantes, quedando solamente la correspondiente a la ecuación de 2do grado (de esa no te salvás)

Por el camino de un sistema de ecuaciones también tenés que hacer un acondicionamiento. Pues tienen una considerable cantidad de sumas y productos de los cuales muchos son entre constantes.
 
Última edición:
Siguiendo un poco con esto, me puse a ver como resolverlo el problema planteando un sistema de ecuaciones.
Con un sensor extra el sistema se puede linealizar, pero quise ver como se podía hacer sin linealizar y sin el problema de que si todos los tiempos eran casi iguales quedaba un sistema indeterminado.

Si entrar en detalles porque me estoy por ir a dormir, el siguiente algoritmo en Matlab sirve tanto para 2 como para 3 dimensiones y para la cantidad de sensores que uno quiera. En 2D son 3 como mínimo y en 3D son 4.
Para mas cantidad de sensores que el mínimo hace unos "mínimos cuadrados aritméticos" :)

Código:
function [X,w] = Posicion(Xs,Ws)
% Xs : Matriz con  las coordenadas de los sensores 
% W : Matriz con los tiempos leídos en cada sensor
% X : Matriz con la posicion  [x y] o [x y z]
% w : Instante en que se emitió el pulso

% Traslado de coordenadas al baricentro
Xm = mean(Xs) ;   
wm = mean(Ws) ;
Xc = Xs-ones(length(Xs),1)*Xm  ;
Wc = Ws-wm ;  
% Evaluacion de las matrices Xo y M 
% aplicando la pseudoinversa
B2 = sum(Xc.^2,2)-Wc.^2 ;
bm = mean(B2)   ;
Xo = Xc\B2/2    ;
M = Xc\Wc       ;
% Evaluacion de los coeficientes 
% de la ecuacion de 2do grado
a = 1-M'*M      ;
b = Xo'*M       ;
c = Xo'*Xo + bm ;
w = (b-sqrt(b^2+a*c))/a ;
% Restauracion de coordenadas
X = Xm + Xo' + M'*w ; % Coordenadas del movil
w = wm + w ;          % Instante de emision

Es una rutina que sirve para testeo, ya que para implementar ese algoritmo en un micro habría que retocarlo, ya que varias operaciones solo se deben hacer una vez. Como pasa con la pseudoinversa y lo relacionado a la posición de los sensores, ya que son fijos.


Para probar valores, hice una función cortita que devuelve los tiempos que "deberían" leerse en los sensores.

Código:
function W = Tiempos(Xs,X,we)
% Xs : Matriz con  las coordenadas de los sensores 
% X : Matriz con la posicion  [x y] o [x y z]
% we : Instante de emisión del pulso
% W : Matriz con los tiempos leídos en cada sensor

W = sqrt(sum((Xs-ones(length(Xs),1)*X).^2,2)) + we ;



Esto es una prueba.

- Me invento unas posiciones para los sensores (matriz A) y para el emisor (matriz X)
- Ejecuto la función Tiempos() para que me arme las lecturas que debería tener.
- Verifico el algoritmo Posicion()
Código:
% Coordenadas xyz de los sensores
% Para 3D la cantidad mínima son 4
A = [ 1000 -1000 1000 ;
      1000   900 1200 ;
      -700   700  700 ;
       700   700  100 ;
       300     0  100 ;
       100   100 -700 ;
      -600  -900  800 ]; 

% Coordenadas del emisor
X = [ -10 300 45] ;

% Genero los tiempos que se leeran para un 
% instante emisión en we = 400
W = Tiempos(A,X,400) ;

% Obtengo la posición correspondiente 
% a esos tiempos.
% Debe darme lo que puse al principio
%  X=[-10 300 45]  y  we=400  :)
[X2,we] = Posicion(A,W)
 
El problema de usar Matlab es que hay cosas que hace que no te dice cómo las hace.
Entonces, para pasar eso a un micro ...
Vos acá no usas nada raro, salvo la operación " \ ", que para pocas variables (< 30)
puede reemplazarse por el método de Gauss-Jordan.
(Comento esto, pero no me puse a controlar demasiado a fondo el método propuesto. )
 
Última edición:
El problema de usar Matlab es que hay cosas que hace que no te dice cómo las hace.
Entonces, para pasar eso a un micro ...
Vos acá no usas nada raro, salvo la operación " \ ", que para pocas variables (< 30)
puede reemplazarse por el método de Gauss-Jordan.
(Comento esto, pero no me puse a controlar demasiado e fondo el método propuesto. )

La operación "A\B" , cuando "A" es una matriz cuadrada hace la operación "(A^(-1))*B"
O sea, la inversa de la matriz A por B.
Cuando se trata de matrices rectangulares como en este caso, hace la pseudoinversa de Moore-Penrose.
La evalúa como A+ = ((A'*A)^(-1))*A'
siendo A+ la notación habitual para la pseudoinversa y A' la matriz traspuesta.

Para calcular la inversa de A'*A , como es una matriz de 3x3, lo más eficiente es usar el método de Gauss pero sin programar bucles, ya que terminan siendo pocas operaciones.

De todas formas, esa matriz se calcula solo una vez después de fijados los sensores.
 
Muchachos, muchisimas gracias a todos!!! Al final lo termine resolviendo usando al viejo Pitagoras, nada mas :) ya se puede cerrar este tema, si quieren.
 
:confused: ¿Cómo? ¿Se puede saber? Supongo que al final es al revés: El cerebro esta en el receptor móvil y se sabe exactamente cuando transmiten los transmisores fijos un "beacon" a intervalos regulares.
 
Atrás
Arriba