Bluetooth Beacon は設計上単純だ。起動して小さなペイロードを送信し、また眠る。受信機の位置は別の場所、つまり電波測定を座標に変換するソフトウェアによって計算される。本稿では実際に重要な 3 層 — 信号強度から距離への変換、位置の求解、結果の平滑化 — を、エンジニアが期待値を設定するために必要な数値とともに解説する。

RSSI から距離へ:対数距離モデル

最も一般的な入力は受信信号強度指示(RSSI)である。対数距離経路損失モデルでは、電力は距離の 2 乗に概ね比例して減衰し、環境要因で変調される。

RSSI(d) = RSSI0 - 10 * n * log10(d / d0) + X_sigma
  • `RSSI0` — 基準距離 `d0`(通常 1 m)での測定電力
  • `n` — 経路損失指数(自由空間 2.0、屋内 2.5–4.0)
  • `X_sigma` — ガウス影落ちふらつき、屋内では標準偏差 3–8 dB

これを逆に解いて距離を推定する。

d = d0 * 10^((RSSI0 - RSSI) / (10 * n))

実例:RSSI0 = -59 dBmn = 2.0、測定 RSSI = -75 dBmd0 = 1 m

d = 10^(( -59 - (-75) ) / 20) = 10^(16/20) = 10^0.8 ≈ 3.98 m

落とし穴は X_sigma だ。n = 3 で ±6 dB 変動すると、推定は 10^(6/30) ≈ 1.58 倍動く。つまり単一 RSSI サンプルは距離で ~±50% しか正しくない。だから生距離が最終答えになることはない。

三次測位:交点を解く

既知の座標を持つ 3 つ以上の Beacon アンカーがあれば、受信機を三次測位する。各アンカーはノイズを含む半径を与え、最小二乗法が二乗残差を最小化する点を見つける。

<h1>anchors: (x_i, y_i, r_i) のリスト</h1>
<h1>sum_i ( sqrt((x-x_i)^2 + (y-y_i)^2) - r_i )^2 を最小化</h1>
<h1>Gauss-Newton / Levenberg-Marquardt で求解</h1>

def trilaterate(anchors):
p = centroid(anchors)
for _ in range(20):
J, f = jacobian_residual(p, anchors)
dp = solve(J.T @ J + lam*I, J.T @ f)
p = p - dp
if norm(dp) < 1e-3: break
return p

幾何が重要だ。アンカーが一直線上だったり、受信機がアンカーの包絡外にあると GDOP(精度劣化)が爆発する。アンカーは 2D に広げ(理想は 3 つ以上)、エリアを複数方向からカバーする。2.5–3.5 m の高さで異なる壁にアンカーを置けば、開けた屋内で典型的に 1–3 m の誤差になる。

フィンガープリンティング:物理を飛ばす

伝播をモデル化する代わりに、空間を学習する。オフライン段階:グリッドを歩き、各基準点(RP)で RSSI ベクトルを記録。オンライン段階:生ベクトルを最も近い RP にマッチングする。

<h1>kNN / Weighted-kNN</h1>

def locate(live_vec, rp_db):
dists = [euclidean(live_vec, rp.vec) for rp in rp_db]
k_nearest = argsort(dists)[:k]
w = 1 / (dists[k_nearest] + eps)
x = sum(w * rp_db[i].x for i in k_nearest) / sum(w)
y = sum(w * rp_db[i].y for i in k_nearest) / sum(w)
return x, y

フィンガープリンティングは、こうした効果をサーベイに織り込むため、マルチパスや非視線(NLOS)に強い。コスト:オフライン サーベイが骨が折れる(良解像度なら ~1 RP/m²)しかもレイアウト変更時にやり直しが必要。典型的誤差:0.5–2 m。

平滑化:ジャイターを殺す

生トラックはフレームごとに飛ぶ。各軸に 1 次元カルマンフィルタ、または運動制約がある場合はパーティクルフィルタを適用する。

<h1>各座標の 1 次元一定速度カルマン</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: 測定ノイズ(RSSI の標準偏差から); Q: プロセスノイズ(歩行速度から)</h1>

RSSI がノイズなら R を大きく(モデルを信じる)、動きが遅いなら Q を小さく。携帯用タグには、壁を通り抜けるような不正な動きを棄却するパーティクルフィルタが単純平均より勝る。

手法比較

手法 入力 典型誤差 サーベイ費用 向くもの
三次測位 アンカー 3+、RSSI→距離 1–3 m 安定レイアウト、少アンカー
フィンガープリント RSSI ベクトル 0.5–2 m マルチパス、NLOS、細かい格子
融合法(RSSI+IMU) RSSI + 加速度 0.3–1 m ウェアラブル、デッドレコニング

実装の鉄則

  • `RSSI0` と `n` は現場で較正せよ。工場値を信じるな。
  • ゾーンごとにアンカー 4+ 個、2.5–3.5 m に異なる壁へ取付。
  • 距離の不確かさ(標準偏差)を点だけでなく報告せよ。下流はそれでゲートすべき。
  • 決定前に平滑化。3 サンプル中央値フィルタで RF スパイクを安価に拾う。
  • 過去記事のスケジューリングと RF 計画と組み合わせよ。アンカー密度とゲートウェイ配置が精度の上限を決める。

Beacon システムの価値は放送そのものではない。その裏にあるソルバだ。モデル・幾何・フィルタを正しく作れば、ノイズの多い電波が、倉庫や病院が動ける軌跡になる。