Apples iBeacon テクノロジを使用して現在の屋内位置を特定する Android スマートフォン アプリケーションを作成しようとしています。利用可能なすべてのビーコンを取得し、rssi 信号を介してビーコンまでの距離を計算することができました。
現在、私はライブラリやアルゴリズムの実装を見つけることができないという問題に直面しています。これは、これらの距離が正確ではないという条件で固定点の 3 つ (またはそれ以上) の距離を使用して 2D で推定位置を計算します (これは、3 つの「三辺測量円」が 1 点で交わらないことを意味します)。
誰かが一般的なプログラミング言語 (Java、C++、Python、PHP、Javascript など) でのリンクまたは実装を投稿してくれれば、深く感謝します。私はすでにそのトピックについてstackoverflowで多くのことを読んでいますが、コードで変換できる答えを見つけることができませんでした(行列を使用した数学的アプローチとそれらの反転、ベクトルなどでの計算のみ)。
編集
私は独自のアプローチを考えました。これは私にとっては非常にうまく機能しますが、それほど効率的でも科学的でもありません。ロケーション グリッドを 1 メートル (または、この例では 0.1 メートル) ごとに反復処理し、そのロケーションからすべてのビーコンまでの距離と、ビーコンで計算した距離を比較して、そのロケーションがハンドセットの実際の位置である可能性を計算します。 rssi信号を受信しました。
コード例:
public Location trilaterate(ArrayList<Beacon> beacons, double maxX, double maxY)
{
for (double x = 0; x <= maxX; x += .1)
{
for (double y = 0; y <= maxY; y += .1)
{
double currentLocationProbability = 0;
for (Beacon beacon : beacons)
{
// distance difference between calculated distance to beacon transmitter
// (rssi-calculated distance) and current location:
// |sqrt(dX^2 + dY^2) - distanceToTransmitter|
double distanceDifference = Math
.abs(Math.sqrt(Math.pow(beacon.getLocation().x - x, 2)
+ Math.pow(beacon.getLocation().y - y, 2))
- beacon.getCurrentDistanceToTransmitter());
// weight the distance difference with the beacon calculated rssi-distance. The
// smaller the calculated rssi-distance is, the more the distance difference
// will be weighted (it is assumed, that nearer beacons measure the distance
// more accurate)
distanceDifference /= Math.pow(beacon.getCurrentDistanceToTransmitter(), 0.9);
// sum up all weighted distance differences for every beacon in
// "currentLocationProbability"
currentLocationProbability += distanceDifference;
}
addToLocationMap(currentLocationProbability, x, y);
// the previous line is my approach, I create a Set of Locations with the 5 most probable locations in it to estimate the accuracy of the measurement afterwards. If that is not necessary, a simple variable assignment for the most probable location would do the job also
}
}
Location bestLocation = getLocationSet().first().location;
bestLocation.accuracy = calculateLocationAccuracy();
Log.w("TRILATERATION", "Location " + bestLocation + " best with accuracy "
+ bestLocation.accuracy);
return bestLocation;
}
もちろん、これのマイナス面は、300m² のフロアに 30,000 の場所があることです。反復して、信号を受信したすべてのビーコンまでの距離を測定する必要がありました (それが 5 の場合、決定するためだけに 150,000 の計算を行います)。単一の場所)。それはたくさんあります-それで、質問を開いて、より効率的にするために、いくつかのさらなる解決策またはこの既存の解決策の優れた改善を期待します.
もちろん、この質問の元のタイトルのように、トライラテレーション アプローチである必要はありません。位置決定のために 3 つ以上のビーコンを含むアルゴリズム (マルチラテレーション) を使用することも良いことです。