BeaconFence の利用

提供:RAD Studio

BeaconFence への移動


サポート対象プラットフォーム

プラットフォーム サポートされているか?

Windows

10 以上

Mac OS X

iOS

iOS シミュレータ

Android

BeaconFence の設定

BeaconFence の利用を開始するには、BeaconFence パッケージinstalledされていなければなりません。

次に、以下を含めることができます:

  • TBeaconMapFencing コンポーネント。
  • TBeaconZonesFencing コンポーネント。
  • 上記の両方。
メモ: TBeaconZonesFencing コンポーネントは、ビジュアル BeaconFence マップ エディタ を含んでいません。 このコンポーネントは、近接イベントの管理を目的としています。

次に、フェンシング プロセスが開始されるようにコンポーネントを有効にする必要があります:

BeaconMapFencing.Enabled := True;
BeaconZonesFencing.Enabled := True;

次に、マップ プロジェクトのビーコンに関連付けられた TBeaconManagerOptions プロパティに特定の値を設定できます。 [オブジェクト インスペクタ] を使用することをお勧めします。 詳細については、「TBeaconManager properties」および「ビーコンの使用」を参照してください。

位置情報サービスの追加

TBeaconMapFencingTBeaconZonesFencing では、デバイスから位置に基づく情報にアクセスするために、位置情報サービスを有効にする必要があります。 このサービスを有効にするには、「ローカル サービスの追加」でビーコンについて説明されているのと同じ手順を行う必要があります。

メモ: 任意で、iOS アプリケーションのバックグラウンド実行を可能にすることもできます。これにより、BLE デバイスはウェイクアップして、標準モード または 代替モード モードのビーコンに関連付けられた、Bluetooth イベントを処理します。 これを行うには、Core Bluetooth バックグラウンド実行モードのサポートを追加する必要があり、それには、プロジェクトの Info.plist ファイル内の UIBackgroundModes キーに必要な値を入れます:
  1. IDE にて: ファイル > プロジェクト > オプション... > バージョン情報
  2. キー UIBackgroundModes を選択
  3. bluetooth-central を設定

マップの設定

アプリケーションでマップ プロジェクトを設定するには、次のことを行います:

  • PainControl プロパティを、アプリケーションでマップに表示するコントロールに設定。

次に、2 の選択肢より選択できます:

  1. ビジュアル BeaconFence マップ エディタ を使用。
  2. XMLMap のデータを XML 形式で使用し、手動で以下を行う:
  • LoadProjectFromXML でマップ プロジェクトを読み込む
  • SaveProjectToXML でマップ プロジェクトを保存
  • SetXmlData でマップ プロジェクトを設定

マップ プロジェクトの作成後、その情報の監視や、起こりうる変更を管理したい場合には、次を使用します:

  • OnBeforeMapChange イベント: マップが変更される前のカスタム アクションの管理をします。
  • ProjectInformation プロパティ: XMLMap 内の現在の要素に関連する、入手可能な情報すべてにアクセスできます。 このプロパティには、次の情報が含まれています:
    • 監視する領域BeaconMapFencing1.ProjectInformation.RegionsToMonitorize
    • 興味のある点のリスト(BeaconMapFencing1.ProjectInformation.PoiList
    • マップBeaconMapFencing1.ProjectInformation.Maps
      • 各マップのゾーンBeaconMapFencing1.ProjectInformation.Maps[I].Zones[J]
      • マップの各ゾーンの位置
        • BeaconMapFencing1.ProjectInformation.Maps[I].Zones[J].GetGlobalRect.Left
        • BeaconMapFencing1.ProjectInformation.Maps[I].Zones[J].GetGlobalRect.Top
        • BeaconMapFencing1.ProjectInformation.Maps[I].Zones[J].GetGlobalRect.Right
        • BeaconMapFencing1.ProjectInformation.Maps[I].Zones[J].GetGlobalRect.Bottom
      • 各マップのビーコン リストBeaconMapFencing1.ProjectInformation.Maps[I].BeaconList[J]
    • パスとそのノードBeaconMapFencing1.ProjectInformation.GlobalPath[I].Node

たとえば、各マップのビーコン リストと、各ビーコンの情報を取得するには、次のコード スニペットを使用します:

Delphi
var
  LInformation: TFencingProject;
  I: Integer;
  J: Integer;
  LMapCount: Integer;
  LLine: string;
  MmMapsInformation: TMemo;
begin
  LInformation := BeaconMapFencing1.ProjectInformation;
  LMapCount := Length(LInformation.Maps);
  for I := 0 to LMapCount - 1 do
    begin
      LLine := 'Map: ' + LInformation.Maps[I].Map.Name + ' Size: ' + FormatFloat('0.00', LInformation.Maps[I].Map.GetGlobalRect.Width) + '-' +
        FormatFloat('0.00', LInformation.Maps[I].Map.GetGlobalRect.Height);
      MmMapsInformation.Lines.Add(LLine);
      MmMapsInformation.Lines.Add('  Beacon List: ');
      for J := 0 to Length(LInformation.Maps[I].BeaconList) - 1 do
      begin
        LLine := '     ' + LInformation.Maps[I].BeaconList[J].DesignBeacon.Name;
        LLine := LLine  + ' Position : (' + FormatFloat('0.00', LInformation.Maps[I].BeaconList[J].DesignBeacon.CenterInGlobalSpace.X) + '-' +
          FormatFloat('0.00', LInformation.Maps[I].BeaconList[J].DesignBeacon.CenterInGlobalSpace.Y) + ')';
        MmMapsInformation.Lines.Add(LLine);
        LLine := '      BeaconType' + Integer(LInformation.Maps[I].BeaconList[J].DesignBeacon.KindofBeacon).ToString
          + 'GUID' + LInformation.Maps[I].BeaconList[J].DesignBeacon.GUID.ToString
          + ' Major: ' + LInformation.Maps[I].BeaconList[J].DesignBeacon.Major.ToString
          + ' Minor: ' + LInformation.Maps[I].BeaconList[J].DesignBeacon.Minor.ToString
          + ' EddyNamespace: ' + LInformation.Maps[I].BeaconList[J].DesignBeacon.EddyNamespace
          + ' EddyInstance: ' + LInformation.Maps[I].BeaconList[J].DesignBeacon.EddyInstance;
        MmMapsInformation.Lines.Add(LLine);
      end;
    end;
end
C++
TFencingProject LInformation;
Integer I;
Integer J;
Integer LMapCount;
String LLine;
TMemo *MmMapsInformation;

LInformation = BeaconMapFencing1->ProjectInformation;
LMapCount = LInformation.Maps.Length;
for (I = 0; I < LMapCount; I++) {
  LLine = "Map: " + LInformation.Maps[I].Map->Name + " Size: " + FormatFloat("0.00", LInformation.Maps[I].Map->GetGlobalRect().Width()) + "-" +
    FormatFloat("0.00", LInformation.Maps[I].Map->GetGlobalRect().Height());
  MmMapsInformation->Lines->Add(LLine);
  MmMapsInformation->Lines->Add("  Beacon List: ");
  for (J = 0; J < LInformation.Maps[I].BeaconList.Length; J++) {
    LLine = "     " + LInformation.Maps[I].BeaconList[J].DesignBeacon->Name;
    LLine = LLine  + " Position : (" + FormatFloat("0.00", LInformation.Maps[I].BeaconList[J].DesignBeacon->CenterInGlobalSpace.X) + "-" +
      FormatFloat("0.00", LInformation.Maps[I].BeaconList[J].DesignBeacon->CenterInGlobalSpace.Y) + ")";
    MmMapsInformation->Lines->Add(LLine);
    LLine = "      BeaconType" + IntToStr(Integer(LInformation.Maps[I].BeaconList[J].DesignBeacon->KindofBeacon))
      + "GUID" + GUIDToString(LInformation.Maps[I].BeaconList[J].DesignBeacon->GUID)
      + " Major: " + IntToStr(LInformation.Maps[I].BeaconList[J].DesignBeacon->Major)
      + " Minor: " + IntToStr(LInformation.Maps[I].BeaconList[J].DesignBeacon->Minor)
      + " EddyNamespace: " + LInformation.Maps[I].BeaconList[J].DesignBeacon->EddyNamespace
      + " EddyInstance: " + LInformation.Maps[I].BeaconList[J].DesignBeacon->EddyInstance;
    MmMapsInformation->Lines->Add(LLine);
  };
};

ProjectInformation プロパティの詳細については、関数 ShowProjectInformation を参照してください(BeaconFence デモ FencingGeneric サンプル内)。

マップのオプション

BeaconManagerOptions を使用して、実行時に、現在のマップの次の TFencingMapOption ビジュアル オプションを変更することができます:

  • ColorBeaconproximity 値に応じて、異なる色でビーコンを表示します。
レベル
Intermediate
Near 黄色
Far オレンジ
Away
  • HighlightZones: アクティブ ゾーンの不透明度を変更します。
  • ShowPosition: マップ内に BLE デバイスの推定位置を描画します。
  • ShowPositionInPath: 最も近いパスに適合する洗練された推定位置を描画します。
  • ShowBeacons: 設定したビーコンをマップに表示します。
  • ShowBeaconSignal: BLE デバイスまでの現在のdistanceを示すビーコンを中心とした円を描画します。 この距離は、rssi 値から計算されます。
  • ShowZones: 設定したゾーンをマップに表示します。
  • ShowPaths: 設定したパスをマップに表示します。

近接イベント

  • OnBeaconEnter: 新しいビーコンが、到達可能な距離内で検知された場合に発生します。
  • OnBeaconExit: 新しいビーコンが、到達可能な距離内で検知されなくなった場合に発生します。
  • OnBeaconProximityproximity値が変更される度に発生します。

ゾーン イベント

  • OnZoneEnter: 計算された位置が、定義済みゾーンの内部である場合に発生します。
  • OnZoneExit: 計算された位置が、定義済みゾーンの内部から離れた場合に発生します。
  • OnZoneBeaconEnter: 事前にゾーン内部で定義されているビーコンが、そのゾーンに入った場合に発生します。
  • OnZoneBeaconExit: 事前にゾーン内部で定義されているビーコンが、そのゾーンから出た場合に発生します。
  • OnZoneOnBeaconProximity: ゾーンで定義されているビーコンの近接地が変更される度に発生します。
メモ: これらの位置に基づくイベント以外にも、UUIDMajorMinor によって監視する領域も登録できます。 BeaconFence マップ エディタ を使用して、監視するビーコンを追加および設定します。 詳細については、「ビーコンの利用」を参照してください。

位置の計算

BeaconFence の API は、System.Beacon.Fencing.PositionCalculator ユニットを提供します。ここでは、特定のマップ内での BLE デバイスの現在位置を推定するために使用される必要なクラスを見つけることができます。

TPositionCalculator のデフォルトの実装には、位置特定タスク用に最適化された、 パーティクル フィルタ アルゴリズム の主な機能が組み込まれています。 特に、このパーティクル フィルタは、 Monte Carlo Localization アルゴリズムに相当します。

Monte Carlo Localization

Monte Carlo Localization アルゴリズムは TTrilateration で実装されており、BLE デバイスからマップ内のいくつかのビーコンまでの距離の測定値を抽出します。 そして、これらの距離を使用して、BLE デバイスの推定位置を、Trilateration 技術を利用して算出します。

パーティクル フィルタのオプション パラメータを調整するには、次のプロパティを使用します:

  • ParticlesNumber: 統計計算用のガウス分布を表す粒子の数。 粒子の数が多いと、計算に負荷がかかりますが、正確な推定値が算出されます。 デバイスのリソースに基づいてトレードオフを見つけます。
  • UpdateInterval: 連続する位置を推定するために使用される時間間隔(ミリ秒)。
  • MovementStDeviation: 粒子の分布をランダム化するために使用される標準偏差。
  • SignalRelativeStdDev: 標準偏差は、距離の計算を処理するときに信号対エラー比を表すために使用されます。
  • BeaconsToUse: 距離測定値の計算に使用されるビーコンの数。 次に、TTrilateration はこれらの距離を使用して三辺測量を実行し、最終的な推定位置を提供します。
  • OwnsCalcDistancetrue に設定すると、TPositionCalculator のデフォルト実装がビーコンまでの距離を計算できるようになります。
  • AutomaticCalibrationtrue に設定すると、TPositionCalculator のデフォルト実装がビーコンの自動調整を実行できるようになります。
  • MotionThreshold: BLE デバイスが移動する時を決定するしきい値。

推定位置の取得

BLE デバイスの推定位置を取得するには、次のイベントを使用できます:

  • OnEstimatingPosition: 位置が推定された際に発生します。
  • OnCalcPosition: 位置が計算される前に発生します。
  • OnPositionEstimated: 計算された位置が変更された際に発生します。

実装のカスタマイズ

System.Beacon.Fencing.PositionCalculator には、位置計算の独自設計を実装するためにオーバーライドできる、抽象クラスが含まれています。 そのためには、TPositionCalculatorClass 型のオブジェクトでメソッドをオーバーライドする必要があります。

メモ: OnEstimatingPosition プロパティを使用して、実行時に現在位置の推定値を取得してください。

ルートの計算

BeaconFence の API では System.Beacon.Fencing.PathFinder ユニットを提供しており、そこには、マップにおいて、BLE デバイスの現在の推定位置(初期地点)から、希望する関心のある地点(到達点)への最短ルートを計算するための、Dijkstra のアルゴリズムの実装もあります。

ナビゲーション目的でこの機能を利用するには、次のことを行う必要があります:

  1. パスおよびノードを追加および設定して、マップに、利用可能な関心ポイントのすべてをつなぐ、定義済みのパスが含まれるようにします。
  2. TCustomBeaconMapFencing.ShowPathToNodeIndex を呼び出して、到達点への最短ルートを取得します。 利用可能な最短パスがマップ上で選択および表示されます。

関連項目