ردیابی RSSI و Triangulation چیست؟ (مبتدی)
هر دستگاه RF (LoRa، WiFi، BLE) در هنگام ارسال، RSSI (Received Signal Strength Indicator) را ایجاد میکند. هرچه دستگاه دورتر باشد، RSSI منفیتر (ضعیفتر) است. با سه گیرنده در مکانهای مختلف، میتوان موقعیت فرستنده را با Triangulation (مثلثسازی) تخمین زد.
این سیستم میتواند پهپادهایی که سیگنال LoRa ارسال میکنند (مثل ردیابهای پرواز) را ردیابی کند. دقت معمولاً ±۱۰-۵۰ متر در شرایط باز است. سه نود ESP32+LoRa در مکانهای مختلف قرار میگیرند و RSSI را به یک سرور مرکزی ارسال میکنند.
محصولی که میسازید
سه نود LoRa + سرور مرکزی برای تخمین موقعیت دستگاه RF در محوطه.
- هزینه: ۳ × ۱۵ دلار = ۴۵ دلار
- دقت: ±۱۰-۵۰ متر (RSSI)
- محدوده: تا ۵۰۰ متر شعاع
کد گیرنده نود (ESP32+LoRa)
#include <LoRa.h>
#include <WiFi.h>
#include <HTTPClient.h>
const int NODE_ID = 1; // شناسه نود (1, 2, 3)
const char* SERVER = "http://192.168.1.100:8080/rssi";
void setup() {
WiFi.begin("SSID", "pass");
while(WiFi.status()!=WL_CONNECTED) delay(500);
LoRa.begin(433.175E6);
LoRa.setSpreadingFactor(7);
}
void loop() {
int sz = LoRa.parsePacket();
if(sz > 0) {
String data = "";
while(LoRa.available()) data += char(LoRa.read());
int rssi = LoRa.packetRssi();
float snr = LoRa.packetSnr();
// ارسال به سرور
HTTPClient http;
http.begin(SERVER);
http.addHeader("Content-Type","application/json");
String body = "{\"node\":"+String(NODE_ID)+
",\"rssi\":"+String(rssi)+
",\"snr\":"+String(snr,1)+
",\"data\":\""+data+"\"}";
http.POST(body);
http.end();
}
}
الگوریتم Triangulation (Python)
import numpy as np
# مختصات نودها (متر از مبدأ)
nodes = {1: (0, 0), 2: (460, 0), 3: (230, 350)}
def rssi_to_distance(rssi, tx_power=-20, path_loss=2.7):
return 10 ** ((tx_power - rssi) / (10 * path_loss))
def triangulate(rssi_data):
# rssi_data = {1: -85, 2: -78, 3: -92}
dists = {n: rssi_to_distance(r) for n, r in rssi_data.items()}
# حل سیستم معادلات دایرهای (Least Squares)
A, b = [], []
n_list = list(nodes.keys())
x0,y0 = nodes[n_list[0]]
d0 = dists[n_list[0]]
for n in n_list[1:]:
xi,yi = nodes[n]; di = dists[n]
A.append([2*(xi-x0), 2*(yi-y0)])
b.append(di**2 - xi**2 - yi**2 - d0**2 + x0**2 + y0**2)
pos = np.linalg.lstsq(A, b, rcond=None)[0]
return pos[0], pos[1]
print(triangulate({1:-85, 2:-78, 3:-92}))
چکلیست
| بررسی | نتیجه |
|---|---|
| هر ۳ نود RSSI را به سرور میفرستند؟ | ☐ |
| مختصات نودها دقیق است؟ | ☐ GPS یا متر |
| خطا در میدان باز زیر ۵۰ متر؟ | ☐ |
| RSSI calibration با فاصله معلوم؟ | ☐ |