🙆

(iPhone)Nearby Interactionを利用して距離と方向を測定する際の注意点

2024/11/29に公開

はじめに

Nearby Interactionフレームワークを利用すれば高い精度でデバイス間の距離と方向を測定できます。ただし、実機で動作検証したところ期待とは異なる結果となりました。

この記事では特にiPhoneとiPhone間の距離および方向を取得する際の注意点をまとめます。Nearby Interactionが実用に耐えるものか検討されている場合の参考になるかと思います。

サンプルアプリ

動作検証のためにサンプルアプリを作成しました。トークン交換はWebサーバーを経由する方法で実装しています。

https://github.com/moutend/NearbyInteractionWithCustomServer

動作検証に使用したデバイスについて

以下のデバイスで動作検証を行いました。

  • iPhone 15 Pro
  • iPhone 13

どちらのデバイスもAirTagとペアリングを行い、正確に距離と方向が測定できることを確認済みです。従って、ハードウェアに不備はないものと思われます。

実機で気がついた注意点

ここから本題です。注意点は以下の5点です。

  1. 電波が届く範囲が非常に狭い
  2. 測定の頻度を固定することはできない
  3. 測定された距離には10 cm程度の誤差がある
  4. 静止している状態でも測定値が変動する
  5. 距離は得られるが方向の値が欠ける場合がある

1. 電波が届く範囲が非常に狭い

以下の記事によると室内で30 m程度の距離を測定できたと報告されています。

使用するフレームワークはNearby Interactionで、室内でデバイス間30m程度を数cmの精度で50Hzでデータを取得することができました。

引用元:【Swift】Nearby Interactionを用いたiPhone間の距離と方向を取得するアプリ #iOS - Qiita

残念ながら上記の結果が得られるのは極めて限定的な環境に限られます。具体的には、以下の2つの条件を満たす場合に限られます。

  1. iPhoneの背面を向け合う
  2. iPhoneとiPhoneの間には遮蔽物が一切ない

これらの条件が守られなければ精度が低下、あるいは測定不能となります。

測定可能な範囲を知る方法

測定可能な範囲を知るには、iPhoneのフラッシュライトを点灯させましょう。大雑把に言えば、その光が届く範囲が測定可能な範囲です。

従って、Nearby Interactionの測定機能は壁やドア越しには機能しません。また、満員電車のような人混みの中もUWBの電波が吸収されるため機能しない恐れがあります。

さらに、西部劇のガンマンのようにお互いに背中を向けている状況、つまり自分のフラッシュライトが相手に照射されない状況では、どれだけ接近しても測定はできません。

このように、動作する環境次第で測定可能な範囲は大きく変動します。Apple Developerドキュメントに具体的な測定可能範囲が示されていないのはそのためです。

(補足)AirTagはドア越しに機能する

Apple純正の落とし物タグ、AirTagを探す場合もUWBが利用されます。しかし、Nearby Interactionとは挙動が異なります。

屋内で実験してみましょう。まずはiPhoneから半径1 mの範囲内にAirTagを置いてください。その状態で探すアプリを開き、AirTagの距離と方向が表示される状態にします。

そのまま部屋を移動して、ドアを閉めてください。おそらくドア越しにも距離と方向が表示され続けるはずです。

さらに、その状態で探すアプリを閉じてください。その後、再び探すアプリを開きAirTagを選ぶと、距離と方向は表示されません。

仕様が公表されていないため想像ですが、AirTagの場合は距離が離れるほど空中線電力が強くなるのかもしれません。そして、アプリ側から切断要求を受け取ると消費電力の少ない状態に戻るのかもしれません。

一方、Nearby Interactionフレームワークにそのような電力制御のAPIは含まれていません。記事を投稿した2024年11月の時点で、AirTagを探すような挙動をサードパーティーのアプリで実現することは不可能です。

2. 測定の頻度を固定することはできない

Nearby Interactionフレームワークが提供するのはNISessionDelegateによるイベント駆動のAPIのみです。タイマー駆動のAPIは提供されていません。

従って、例えばゲームアプリで30 fpsごとにNearby Interactionの値を測定することは実現できません。ある時刻の値を測定するには、測定値をバッファに蓄えて、値が足りなければ何らかの方法で予測あるいは補完するといった工夫が必要になります。

なお、動作検証したところNISessionDelegateが呼ばれる頻度は最低で1秒間に6回、最高で1秒間に63回でした。

3. 測定された距離には10 cm程度の誤差がある

Apple Developerドキュメントによると、Nearby Interactionは高い精度でデバイス間の距離と方向を測定できると説明されています。しかし、具体的にどの程度の精度で測定できるのかは言及されていません。

実機で動作検証したところ、距離については10 cm程度の誤差が含まれるようでした。ただし、常に10 cmで安定しているのではなく、ハズレ値が含まれることもあります。

Appleの探すアプリのようになめらかな表示を行うには、NISessionDelegateで得られる値をそのまま利用するのではなく、例えばキューに値を蓄えて中央値を表示するといった工夫が必要になります。

4. 静止している状態でも測定値が変動する

例えば机の上にiPhoneを置いても、測定値は常に変動します。デバイスが静止しているか判定する場合はCore Motionフレームワークを利用して加速度や回転方向から判定することをお勧めします。

5. 距離は得られるが方向の値が欠ける場合がある

NINearbyObjectには距離を示すdistanceと方向を示すdirectionが含まれています。通常はどちらも値が入っているのですが、まれにdirectionnilになる場合があります。

動作検証は数日行っただけですので断言はできませんが、distanceは常に得られるようです。distancenildirectionには値が含まれているパターンには一度も遭遇していません。

参考資料

  1. Nearby Interaction - Apple Developer Documentation
  2. Initiating and maintaining a session - Apple Developer Documentation

Discussion