研究開発部の堤と申します。6月からマネージャーからエンジニアに戻り、今は毎日コードを書いております。
現在弊社では「タッチ名刺交換」の開発を行っています。この機能では BLE (Bluetooth Low Energy) を利用するのですが、コアライブラリも含めて開発メンバーの誰でもメンテできるよう、Eight iOSチームを対象にBLE勉強会を開催しました。
勉強会は以下の3本立てで行ったのですが、
- 第1回: 「BLE / Core Bluetooth基礎」編
- 第2回: 「RSSIを用いた距離推定」編
- 第3回: 「Core BluetoothにおけるL2CAP実装」編
第1回は 拙著 と GitHubで公開しているサンプル をベースに解説したので割愛し、本記事では第2回の内容について書きたいと思います。 なお、第3回のL2CAP編についても別記事にて書く予定です。(追記: 書きました)
(目次)
- 「タッチ名刺交換」と距離推定
- RSSI, TxPowerとは
- RSSIとTxPowerから距離を推定する
- Core Bluetoothにおける距離推定の実装
- RSSIベースの距離推定の課題
- UWBを用いた距離推定
- まとめ
「タッチ名刺交換」と距離推定
タッチ名刺交換とは、スマホを近づけるだけで名刺交換を行えるようにする機能です。WWDC23で発表されたiOS 17のNameDropのような体験を想像していただくと良いかもしれません 1。
このタッチの判定のために、BLEのRSSIを用いた距離推定を行っています。スマホ間の推定距離が一定のしきい値以下となった場合に「タッチした」と判定しています。
(タッチ名刺交換プロトタイプにおける距離推定の様子)
RSSI, TxPowerとは
RSSI
- Received Signal Strength Indication の略
- 受信機(ここでは iOS デバイス)が受信した電波の強度を示す
- 単位は dBm
TxPower
- 送信機が発する電波の強さを示す
- 単位は dBm
- 1m 離れた地点での受信信号強度を利用する
RSSIとTxPowerから距離を推定する
8年前に書いた記事になりますが、下記記事に詳しく書いてあります。
タイトルにはビーコンとありますが、iOSデバイスであれAndroidデバイスであれ「RSSIベースで距離を推定する」ための理論は同じです。
自由空間では受信信号強度は距離の二乗に反比例して減衰していく(フリスの伝達公式)
ので、RSSI と TxPower と距離(d)の関係は次のようになります。
RSSI = TxPower - 20 * lg(d)
(lg は底を 10 とする常用対数)
というわけで、距離 d の計算式は以下のようになります。
d = 10 ^ ((TxPower - RSSI) / 20)
Swiftコードは次のようになります。
let d = pow(10.0, (TxPower - RSSI) / 20.0)
自由空間というのは「障害物のない理想空間」を意味していて、実際には障害物の有無などで電波の受信強度というのは変わってきます。
これを考慮したい場合には次のように距離に係る部分を変数にします。
RSSI = TxPower - 10 * n * lg(d)
この係数は
- n = 2.0 : 障害物のない理想空間
- n < 2.0 : 電波が反射しながら伝搬する空間
- n > 2.0 : 障害物に吸収され減衰しながら伝搬する空間
という意味になります。
Core Bluetoothにおける距離推定の実装
- RSSIは
CBCentralManagerDelegate
のcentralManager(_:didDiscover:advertisementData:rssi:)
メソッドのRSSI
引数より取得できる- つまりセントラル側においてアドバタイズパケット受信時に取得可能
- 同じペリフェラルのRSSIの更新を受け続けるために、スキャン実行時に
CBCentralManagerScanOptionAllowDuplicatesKey
にtrue
を指定する 2。
- TxPowerは?
- 実際にはデバイスごとに計測すべき
- iPhoneの場合は「とりあえずの固定値」として
-50
を使用しておけばだいたいいい感じになる(堤の過去の経験則より)
デバイスごとのTxPowerを利用する実装はいくつか考えられますが、何が最適かは要件によります。タッチ名刺交換で具体的にどのように実現しているかは、また機会があれば別記事にて書きたいと思います。
RSSIベースの距離推定の課題
RSSIのブレの影響
TxPower を -50
とした場合、各RSSI値における推定距離は次の表の通り:
RSSI | 距離 [m] |
---|---|
-50 | 1.00 |
-49 | 0.89 |
-48 | 0.79 |
-47 | 0.71 |
-46 | 0.63 |
-45 | 0.56 |
-44 | 0.50 |
-43 | 0.45 |
-42 | 0.40 |
-41 | 0.35 |
-40 | 0.32 |
-39 | 0.28 |
-38 | 0.25 |
-37 | 0.22 |
-36 | 0.20 |
RSSIが少し変動するだけでも、推定距離が大きく変わってくることがわかります。
そして実際にRSSIは容易に変動します。
- デバイス間に遮蔽物がなくても、デバイスを動かさなくてもどんどん動く
- デバイスを動かせばめちゃくちゃ動く
- ましてや遮蔽物があればさらに大きく動く
一定時間内におけるRSSIの最大値を使用する
- RSSIの移動平均を利用する?
- 「連続性をもって変動する」ので、平均値を取っても変動は抑えられない
- 標準偏差を用いても同様
- 同様の理由で中央値を用いても変動を抑える効果はない
- 一定時間内の最大値( ⇒ RSSIが大きい)を使用する ≒ 電波強度が強い値を信頼する
UWBを用いた距離推定
UWBとは
- UWB (Ultra-Wide Band) : 超広帯域無線通信
- Apple U1チップ
- iPhone, Apple Watch, AirPods Pro, AirTagに搭載
- Apple U1チップ
- 通信範囲はごく近距離だが、高精度な位置検出が可能
- Apple 「リビングルームほどの空間で機能するGPS」
- Nearby Interactionフレームワーク
BLEのRSSIベースの距離推定より、UWBによる距離推定の方が安定している理由
- RSSI:これは環境要因により大きく変動するため、距離推定の精度が低い
- 特に、周囲の物体や壁による電波の反射、吸収、干渉などにより信号強度が変動し、これによって推定距離も変動する
- UWB: 電波の到達時間(Time of Arrival:ToA)や、出発から到着までの時間(Time Difference of Arrival:TDoA)を測定して距離を推定
- UWBの距離推定精度はBLEと比較して大幅に高い
- UWBは非常に広い帯域を使用するため、電波干渉による影響が少ないという利点もある。
- これにより、UWBは複雑な環境でも安定した通信が可能
まとめ
社内のiOSアプリ開発メンバー向けに行った勉強会の内容について書きました。今回はタッチ名刺交換機能におけるタッチ判定の肝となる「RSSIを用いた距離推定」の話でした。
タッチ判定後のデータのやり取りはL2CAPを用いて行っています。またそちらについても別記事にて書きたいと思います。
- タッチ名刺交換のプロトタイプを私が開発したのは今年の3月でした。NameDropが発表されたのは6月です。↩
-
スキャンオプションは
CBCentralManager
のscanForPeripherals(withServices serviceUUIDs:options:)
メソッドの第2引数に指定します。↩