Un Bluetooth beacon es tonto por diseño: se despierta, transmite una pequeña carga y vuelve a dormir. La posición del receptor se calcula en otro lado, mediante software que convierte mediciones de radio en coordenadas. Este artículo recorre las tres capas que importan de verdad — convertir la intensidad de señal en distancia, resolver la posición y suavizar el resultado — con los números que un ingeniero necesita para fijar expectativas.
De RSSI a distancia: el modelo de distancia logarítmica
La entrada más común es el Indicador de Intensidad de Señal Recibida (RSSI). Bajo el modelo de pérdida de trayecto logarítmica, la potencia cae aproximadamente con el cuadrado de la distancia, modulada por un factor de entorno:
RSSI(d) = RSSI0 - 10 * n * log10(d / d0) + X_sigma
- `RSSI0` — potencia medida a distancia de referencia `d0` (típicamente 1 m)
- `n` — exponente de pérdida de trayecto (2.0 en espacio libre, 2.5–4.0 en interior)
- `X_sigma` — desvanecimiento por sombra gaussiano, desv. típica 3–8 dB en interior
Invirtiéndolo se estima la distancia:
d = d0 * 10^((RSSI0 - RSSI) / (10 * n))
Ejemplo: RSSI0 = -59 dBm, n = 2.0, medido RSSI = -75 dBm, d0 = 1 m:
d = 10^(( -59 - (-75) ) / 20) = 10^(16/20) = 10^0.8 ≈ 3.98 m
La trampa es X_sigma. Una oscilación de ±6 dB con n = 3 mueve la estimación por un factor de 10^(6/30) ≈ 1.58. Así que una sola muestra RSSI solo es buena para ~±50% de distancia. Por eso la distancia en bruto nunca es la respuesta final.
Trilateración: resolver la intersección
Con tres o más anclas Beacon en coordenadas conocidas, trilatera el receptor. Cada ancla da un radio ruidoso; el mínimo de cuadrados encuentra el punto que minimiza los residuos al cuadrado:
<h1>anclas: lista de (x_i, y_i, r_i)</h1>
<h1>minimizar sum_i ( sqrt((x-x_i)^2 + (y-y_i)^2) - r_i )^2</h1>
<h1>resolver con Gauss-Newton / Levenberg-Marquardt</h1>
def trilaterate(anclas):
p = centroide(anclas)
for _ in range(20):
J, f = jacobiano_residual(p, anclas)
dp = solve(J.T @ J + lam*I, J.T @ f)
p = p - dp
if norm(dp) < 1e-3: break
return p
La geometría importa: la Dilución de Precisión (GDOP) explota cuando las anclas son colineales o el receptor queda fuera del casco de anclas. Mantén las anclas extendidas en 2D (ideal 3+) y cubre el área desde varios lados. Una altura de montaje de 2.5–3.5 m con anclas en paredes distintas da típicamente 1–3 m de error en interior abierto.
Huella digital: saltarse la física
En lugar de modelar la propagación, la huella digital aprende el espacio. Fase offline: recorre una rejilla y registra el vector RSSI en cada punto de referencia (RP). Fase online: empareja el vector en vivo con el RP más cercano:
<h1>kNN / Weighted-kNN</h1>
def localizar(vector_vivo, bd_rp):
dists = [euclidea(vector_vivo, rp.vector) for rp in bd_rp]
k_cercanos = argsort(dists)[:k]
w = 1 / (dists[k_cercanos] + eps)
x = sum(w * bd_rp[i].x for i in k_cercanos) / sum(w)
y = sum(w * bd_rp[i].y for i in k_cercanos) / sum(w)
return x, y
La huella digital es robusta a multitrayecto y a no-línea-de-vista (NLOS) porque hornea esos efectos en el relevamiento. Costo: el relevamiento offline es laborioso (~1 RP/m² para buena resolución) y hay que repetirlo si cambia la distribución. Error típico: 0.5–2 m.
Suavizado: matar el temblor
Una trayectoria en bruto salta de fotograma a fotograma. Aplica un filtro de Kalman 1-D por eje, o un filtro de partículas si tienes restricciones de movimiento:
<h1>Kalman de velocidad constante 1-D, por coordenada</h1>
x_hat = A @ x; P = A @ P @ A.T + Q
K = P @ H.T @ inv(H @ P @ H.T + R)
x = x_hat + K @ (z - H @ x_hat); P = (I - K @ H) @ P
<h1>R: ruido de medición (de la desv. típica RSSI); Q: ruido de proceso (de la velocidad)</h1>
Pon R alto (confía en el modelo) cuando RSSI es ruidoso; baja Q para movimientos lentos. Para etiquetas portátiles, un filtro de partículas que rechaza movimientos imposibles (a través de paredes) supera al promedio simple.
Comparación de métodos
| Método | Entrada | Error típico | Costo relev. | Mejor para |
|---|---|---|---|---|
| Trilateración | 3+ anclas, RSSI→dist | 1–3 m | Bajo | Distribuciones estables, pocas anclas |
| Huella digital | Vectores RSSI | 0.5–2 m | Alto | Multitrayecto, NLOS, rejillas finas |
| Fusión (RSSI+IMU) | RSSI + acelerómetro | 0.3–1 m | Medio | Wearables, deriva muerta |
Reglas de despliegue práctico
- Calibra `RSSI0` y `n` por sitio; no confíes en valores de fábrica.
- Usa 4+ anclas por zona, montadas a 2.5–3.5 m, en paredes distintas.
- Reporta la incertidumbre de distancia (desv. típica), no solo un punto — la lógica aguas abajo debe filtrar con ella.
- Suaviza antes de decidir; un filtro de mediana de 3 muestras captura picos RF baratos.
- Combina con el escalado y la planificación RF de artículos previos: la densidad de anclas y la colocación de gateways fijan el techo de precisión.
El valor de un sistema Beacon no es la difusión — es el solucionador detrás. Acierta el modelo, la geometría y el filtro, y conviertes radio ruidosa en una trayectoria que un almacén o un hospital pueden usar.