私の質問に関連するstackoverflowに関する質問がたくさんあることは知っていますが、RSSIから正確な距離を取得する方法があるかどうか知りたいです。
私は このリンク と他のいくつかの 距離計算のためのgitライブラリメソッド とこれ チュートリアル をフォローしました。しかし、私は正しい解決策を得ることができません。
これは私が距離を測定するために使用しているものです:
protected double calculateDistance(float txPower, double rssi) {
if (rssi == 0) {
return -1.0; // if we cannot determine distance, return -1.
}
double ratio = rssi * 1.0 / txPower;
if (ratio < 1.0) {
return Math.pow(ratio, 10);
} else {
double accuracy = (0.89976) * Math.pow(ratio, 7.7095) + 0.111;
return accuracy;
}
}
このメソッドを呼び出すと、 standard とrssiを渡します。mleScanCallBack()から取得したものです。
private BluetoothAdapter.LeScanCallback mLeScanCallback =
new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord) {
runOnUiThread(new Runnable() {
@Override
public void run() {
BluetoothDeviceModel bluetoothDeviceModel = new BluetoothDeviceModel(device, rssi);
mLeDeviceListAdapter.addDevice(bluetoothDeviceModel, rssi, bluetoothDeviceModel.device.getAddress());
mLeDeviceListAdapter.notifyDataSetChanged();
if (mapBluetooth != null) {
mapBluetooth.put(bluetoothDeviceModel.getDevice().getAddress(), bluetoothDeviceModel);
mLeDeviceListAdapter.refresh(mapBluetooth);
}
}
});
}
};
私が直面している問題は何ですか?
上記のコードに問題はありません。それは私に距離を与えますが、それは正しい距離ではないので私はそれに満足していません。それで、上記の方法で正確な距離を取得することが可能かどうか、または他の方法があるかどうか誰かに教えてもらえますか?
私も同じことに取り組んでいます。この方法を使用すると、距離を計算できますが、その距離は頻繁に変化します。これは、RSSI値も頻繁に変化するためです。
あなたがする必要があるのはあなたの結果を滑らかにすることであり、そのためにあなたはカルマンフィルターまたは(linearを適用しなければなりません二次推定)。カルマンフィルターを使い続けたい場合は、ここから始めてください。 ビーコン追跡
それでも私は自分のプロジェクトのためのカルマンフィルターのより良い実装を探しています。または、RSSI値をスムーズにすることもできます
???????????????????????????????????? h = ???? ∗ ???????????????????? +(1 − ????)∗ ???????????????????? -1
????????????????????最近ですか????????????????値と????????????????????-1は平均ですか????????????????前までの値????????????????。
???? 0から1まで変化します[考慮???? = 0.75]
ソース:- RSSIスムージング