web-dev-qa-db-ja.com

Wifi位置の三角測量

enter image description here

Wifi三角測量の基本的な仕組みを理解する必要があります。シーンは上の図に描かれているとおりです。 Wifi三角測量を実装するには、最低3つのWifiホットスポットとその位置が必要です。セットアップ:
1。簡単にするために、1 sq-Km x 1 sq-Kmエリアがあり、このエリアに3つのWifiホットスポットがあると仮定します。座標系は次のとおりです。正方形領域の1つのコーナーは(0,0,0)であり、対角線上の最も遠いコーナーには座標(1,1,1)があります。すべての位置決定は、この座標系のみに関連して行われます(簡単にするために、グローバルxyz座標は必要ありません)。この中に、(x1、y1、z1)、(x2、y2、z2)、(x3、y3、z3)に3つのwifiホットスポットがあります。
2。 wifi信号を受信し、位置(x、y、z)で信号の強度を計算できるデバイスを持っている人がいます。デバイスは、電話、タブレットなどです。
問題:次の入力があると動き回るので、人の位置(x、y、z)を動的に計算する:
1。各WiFiホットスポットから受信した信号の信号強度
2。以前に変数またはデータベースに保存されたwifiホットスポットの座標。

最初の質問:上記の入力から位置を計算するにはどうすればよいですか?信号強度はルーターからの距離に直接比例すると仮定していますが、正確な関係は何ですか? Skyhook はこれをどのように正確に行うのでしょうか?
2番目の質問:上記の入力で十分だと思います。他に必要なものはありますか?

ありがとう!

19
sanjeev mk

これは非常に簡単です。基本的な数学です。 2つの部分に分けます。

1)水平位置(高さなし)を見つけます。

現在地を見つけるには3つのポイントが必要ですが、2秒間だけ焦点を合わせます。 2点を使用すると、自分で三角形を作成し、2点間の信号強度に基づいて位置を見つけることができます。これにより、2つのルーターの間にいる場所がわかります。たとえば、ルータ3と4の間にいて、3と比較した信号強度が-89で、4への信号強度が-54である場合、4よりも3に近いことがわかります。距離と信号強度の概算を行うと、ルーター3と4の間の位置を非常に正確に読み取ることができます。残っている問題は、3と4の間のどちら側にいるかを判断することです。 、ルーターの上または下で同じ信号強度値(-89、-54)を持つことができるため(図を参照)

           6

   You could be here

3--------------------------4

  You could also be here

            5

次に、別のルーターを見つけて、信号強度に注目してください。 5つのルーターと6つのルーターの間の信号強度の関係を見るだけで、どちらの側にいるのかを簡単に判断できるはずです(図を参照)。

2)同じことを高さで行うことができます。

上記のすべてを行うには、実際には距離と信号強度の近似値、およびルーター間の距離のみが必要です。私のテスト(私自身のWiFi三角測量コードを書いた)から、モバイルデバイス間で信号強度はかなり均一であるため、1つのデバイスはその隣のデバイスと同じ結果になるはずです。

スカイフックは、GPS測位(ハードコーディングされている可能性があります)を介して、または基本的にこれと同じ原理でこれを行うと考えています。 Appleが承認された唯一のサービスはSkyhookであるため、Appleは基本的にこれと同じことを行い、他のアプリがそれを使用できないようにしました。これを行うための機能はアプリストアから拒否されます)。

編集:距離を見つける方法:

いくつかの簡単な近似を行う必要があります。これらの近似値は、環境によってはすべて同じではないため、-89フィートはルーター3から15フィート離れていることを意味し、ルーター4から-89は13フィート離れていることを意味する場合があります。あなたが何をしても、これは100%正確ではありませんが、確かに5フィート以内に到達できるので大丈夫です。

そのため、ルーター3から-89の読み取り値を取得するポイントを見つけ、距離を書き留めます。次に、平均値を取得し、この平均値を使用してデータベースに記録します(ルーター3から-89のときは15フィートだと言います)。次に、-50など、他の値に対してこれを行い、値を書き留めて平均を求めます。ここで、-89が15フィート離れていることを意味し、-50が25フィート離れていることを意味する場合(ほんの一例)、行きたい場合を除き、ルーター3から-75のときに距離を概算する必要があります-75の手動近似。これは非常に多くの値にとって面倒ですが、できるだけ少ないデータポイントでどれだけ正確かを確認するために実験する必要があります。信号強度が対数であることを認識することにより、2つの信号強度の平均を近似できます。したがって、-89は15フィートであるため、-75は対数であると推定できます(基数10または基数2、覚えていないが、ベース10)に傾いて、-89よりも14/100倍離れています。

編集:コードを要求する

私はどこかにコードを持っていますが、それは数年前だったので、それを見つけるために多くのものを掘り下げなければなりませんでした。概念的には、コードなしで簡単に複製できるはずです。テストしていたJavaデバイスのAndroidコードは約50行でした。

基本的に、Android電話を使用して、接続されたwifiデバイスの現在のID、信号強度、他の近くのwifi IDとその信号強度、GPS位置をいつでも表示できるアプリケーションを作成しました。これはすべてAndroidのAPIからアクセスできます。 API 4以上のAndroidデバイスなどが必要だと思います。これは3、4年前のようなものだったので、私はこれを私が覚えているものから捨てているところです。

GPSの位置の部分は、他の方法で施設の設計図を作成するのではなく、物理的な強度と無線LANの強度の間のマッピングを簡単にすることでした。オーバーレイできるので、Googleマップで同時に行うことができました距離マップを作成しながら、マップとGPSは基本的に調整します。ただし、フロアレベルをマッピングするには深度マップが必要です。これは、2台のルーターの真ん中にいるかどうかを手作業で簡単に確認できます。信号強度は同じフロアのwifiハブに最も強いことを知っており、異なるフロアのwifiハブへの信号が弱いことを確認することで、二重にチェックできます。このデプスマップは、本質的にはwifiハブとそれぞれのフロアのリストです。施設を歩き回って特定のハブの信号強度を取得するときに取得したGPS位置に信号強度を最適に適合させることができるため、それらの位置は必要ありません。これは簡単な数学です。したがって、上から見下ろした2Dプレーンの位置には、次のようなオブジェクトがあります。

BestFitObject{
   Tuple<long, long> GPSLocation;
   List<Tuple<WifiDevice, signedInt>> WifiReadings; //WifiDeviceName(through UUID or some other way), tupled with the signalStrength when that bestFit reading was taken
}

WifiDevice{
   UUID ID; //Think a string should work fine, might be an internal type that encompasses UUID which woudl be better.
   int floorNumber;
   Tuple<long, long> GPSLocation; //Not entirely necessary, could provide better accuracy though
}

そして、クライアントデバイスにpingを実行し、最適に適合させたい場合、次のようなオブジェクトを返します。

ClientPosition{
   List<Tuple<UUID, signedIt> NearbySignals; //Tuple of the UUID of the wifi device and the signal strength taken during the time of the ping.  
}

次に、上記の2つのオブジェクトで作成した2DマップにClientPositionを簡単に最適に適合させることができます。

上記は非常に単純で、深度マップはさらに単純です。

理想的には、より正確な結果を得るためだけに、いくつかの異なるワイヤレス技術(一部のデバイス、一部のbデバイス、n、gなど)を含むいくつかの異なるデバイスを試してみてください。しかし、私が見つけたのは、精度はそれほど大したことではなく、5フィートかそこらにいるということです。それは私のニーズにとって十分に正確でした。理想的には、すべてのwifiハブは同じモデルであり、通常は大規模な施設/会社にありますが、それでもそれほど大したことではありません。ばらつきは非常に小さいため、非常に正確な精度が必要ない場合は重要ではありません。

18
Magn3s1um

まあ、それは信号なので、その強度は距離の2乗になります。 逆二乗法を参照

Androidは、 dBm で信号強度を提供します。私はそのユニットに慣れていませんが、それがオーディオデシベルのようなものである場合、それは線形スケールではありません。あなたはそれを考慮したいと思うでしょう。

完璧な世界では、フィールドは距離を与えるための純粋な測定のために十分に均一になりますが、これを金属を通して行うと、物がくなるかもしれません。さらに、デバイスのwifi無線の内部構成により、特定の方向でより敏感になる場合があります。私はエンジニアでも何でもないので、これらが最終結果にどの程度影響するかはわかりません。取るに足らないかもしれません。

最後に、3次元の位置については、4つの基準点が必要だと思います。すべてのWiFiホットスポットが同じ高さにある場合でも、水平位置を見つけることができます。そうでない場合、あなたは彼らがいる飛行機であなたの位置を見つけるでしょう、それはその飛行機がどれほど急勾配であるかによってあなたにとって十分に正確でないかもしれません。

6
Chris Bode

DBmを距離に変換することさえ心配しないでください。無線信号は、光の速度で(ほぼ)移動し、環境要因による減衰を防ぎます。したがって、デバイスを「ping」できる場合、その距離の一般的なアイデアを得ることができます。既知の場所の全方向性アンテナを使用すると、応答を受信するのにかかる時間を使用して、半径をプロットして円を描くことができます。これを複数のデバイスから実行すると、円が交差し、方向がわかります。もちろん、これはすべて2dです。 3Dでも同じことができますが、代わりに球体をプロットすることになります。デバイスの数が多いほど、位置が正確になります。

0
Wjdavis5