BeaconFence の利用
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」および「ビーコンの使用」を参照してください。
位置情報サービスの追加
TBeaconMapFencing と TBeaconZonesFencing では、デバイスから位置に基づく情報にアクセスするために、位置情報サービスを有効にする必要があります。 このサービスを有効にするには、「ローカル サービスの追加」でビーコンについて説明されているのと同じ手順を行う必要があります。
Info.plist ファイル内の UIBackgroundModes キーに必要な値を入れます:
- IDE にて: ファイル > プロジェクト > オプション... > バージョン情報
- キー
UIBackgroundModesを選択 - 値
bluetooth-centralを設定
マップの設定
アプリケーションでマップ プロジェクトを設定するには、次のことを行います:
- PainControl プロパティを、アプリケーションでマップに表示するコントロールに設定。
次に、2 の選択肢より選択できます:
- ビジュアル BeaconFence マップ エディタ を使用。
- 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.LeftBeaconMapFencing1.ProjectInformation.Maps[I].Zones[J].GetGlobalRect.TopBeaconMapFencing1.ProjectInformation.Maps[I].Zones[J].GetGlobalRect.RightBeaconMapFencing1.ProjectInformation.Maps[I].Zones[J].GetGlobalRect.Bottom
- 各マップのビーコン リスト(
BeaconMapFencing1.ProjectInformation.Maps[I].BeaconList[J])
- 各マップのゾーン(
- パスとそのノード(
BeaconMapFencing1.ProjectInformation.GlobalPath[I].Node)
- 監視する領域(
たとえば、各マップのビーコン リストと、各ビーコンの情報を取得するには、次のコード スニペットを使用します:
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
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 ビジュアル オプションを変更することができます:
- ColorBeacon: proximity 値に応じて、異なる色でビーコンを表示します。
| レベル | 色 |
|---|---|
Intermediate
|
緑 |
Near
|
黄色 |
Far
|
オレンジ |
Away
|
赤 |
- HighlightZones: アクティブ ゾーンの不透明度を変更します。
- ShowPosition: マップ内に BLE デバイスの推定位置を描画します。
- ShowPositionInPath: 最も近いパスに適合する洗練された推定位置を描画します。
- ShowBeacons: 設定したビーコンをマップに表示します。
- ShowBeaconSignal: BLE デバイスまでの現在のdistanceを示すビーコンを中心とした円を描画します。 この距離は、rssi 値から計算されます。
- ShowZones: 設定したゾーンをマップに表示します。
- ShowPaths: 設定したパスをマップに表示します。
近接イベント
- OnBeaconEnter: 新しいビーコンが、到達可能な距離内で検知された場合に発生します。
- OnBeaconExit: 新しいビーコンが、到達可能な距離内で検知されなくなった場合に発生します。
- OnBeaconProximity: proximity値が変更される度に発生します。
ゾーン イベント
- OnZoneEnter: 計算された位置が、定義済みゾーンの内部である場合に発生します。
- OnZoneExit: 計算された位置が、定義済みゾーンの内部から離れた場合に発生します。
- OnZoneBeaconEnter: 事前にゾーン内部で定義されているビーコンが、そのゾーンに入った場合に発生します。
- OnZoneBeaconExit: 事前にゾーン内部で定義されているビーコンが、そのゾーンから出た場合に発生します。
- OnZoneOnBeaconProximity: ゾーンで定義されているビーコンの近接地が変更される度に発生します。
位置の計算
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 はこれらの距離を使用して三辺測量を実行し、最終的な推定位置を提供します。
- OwnsCalcDistance: true に設定すると、TPositionCalculator のデフォルト実装がビーコンまでの距離を計算できるようになります。
- AutomaticCalibration: true に設定すると、TPositionCalculator のデフォルト実装がビーコンの自動調整を実行できるようになります。
- MotionThreshold: BLE デバイスが移動する時を決定するしきい値。
推定位置の取得
BLE デバイスの推定位置を取得するには、次のイベントを使用できます:
- OnEstimatingPosition: 位置が推定された際に発生します。
- OnCalcPosition: 位置が計算される前に発生します。
- OnPositionEstimated: 計算された位置が変更された際に発生します。
実装のカスタマイズ
System.Beacon.Fencing.PositionCalculator には、位置計算の独自設計を実装するためにオーバーライドできる、抽象クラスが含まれています。 そのためには、TPositionCalculatorClass 型のオブジェクトでメソッドをオーバーライドする必要があります。
- メモ: OnEstimatingPosition プロパティを使用して、実行時に現在位置の推定値を取得してください。
ルートの計算
BeaconFence の API では System.Beacon.Fencing.PathFinder ユニットを提供しており、そこには、マップにおいて、BLE デバイスの現在の推定位置(初期地点)から、希望する関心のある地点(到達点)への最短ルートを計算するための、Dijkstra のアルゴリズムの実装もあります。
ナビゲーション目的でこの機能を利用するには、次のことを行う必要があります:
- パスおよびノードを追加および設定して、マップに、利用可能な関心ポイントのすべてをつなぐ、定義済みのパスが含まれるようにします。
- TCustomBeaconMapFencing.ShowPathToNodeIndex を呼び出して、到達点への最短ルートを取得します。 利用可能な最短パスがマップ上で選択および表示されます。