Я работаю над проектом, который будет рассматривать локализацию в помещении на основе сигналов WiFi, и в настоящее время я немного беспокоюсь о том, чтобы начать работу с правильным методом 2D трилатерации.
У меня есть приложение, которое сканирует точки доступа и работает только с точками доступа, которые подключены к сети:
BroadcastReceiver wifiReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
results = wifiManager.getScanResults();
unregisterReceiver(this);
String checker = wifiManager.getConnectionInfo().getSSID();
for (ScanResult scanResult : results) {
if(checker.equals('"'+scanResult.SSID+'"'))
{
DecimalFormat df = new DecimalFormat("#.##");
arrayList.add(scanResult.SSID + "/"+ scanResult.BSSID + " - " +
df.format(calculateDistance((double)scanResult.level,
scanResult.frequency)) + "m"); //Output for testing
adapter.notifyDataSetChanged();
}
}
};
};
Я также использую потерю пути в свободном пространстве длярассчитать расстояние от уровня сигнала и частоты.Это можно увидеть в этой функции:
public double calculateDistance(double signalLevelInDb, double freqInMHz) {
double exp = (27.55 - (20 * Math.log10(freqInMHz)) + Math.abs(signalLevelInDb)) / 20.0;
return Math.pow(10.0, exp);
}
Основная проблема у меня возникает из-за того, что расстояние FSPL от трех отдельных точек доступа в одной сети может использоваться для триангуляции позиции.В основном это связано с моим ограниченным пониманием математики и я надеялся, что в Java есть библиотеки, которые могут помочь с этим, кроме стандартного набора математических библиотек.
2D-область, в которой я пытаюсь расположиться, похожа на следующую: