2016-05-16 165 views
-1

我有一個帶有wifi屏蔽的arduino uno,我希望它能夠去信號源。使用rssi跟蹤WiFi信號的來源

我得到的rssi通常是-40 dBm以上-80 dBm我假設機器人已經找到了源。

因此,機器人會直行並每隔2秒檢查一次rssi,如果新信號比它向前旋轉90度並向前直行並持續這樣做,直到它找到源爲止。

無效循環()是機器人的邏輯。

int angle = 90; 
char ssid[]="AndroidAP"; 
bool sourceFound = false; 
long rssi = -100; 
long prevRssi = 0; 

void setup() { 
    Serial.begin(9600); 
    updateRSSI(); 
    servoLeft.attach(8); 
    servoRight.attach(9); 
    goStraight(); 
} 

void loop() { 
    if(!sourceFound){ 
    updateRSSI(); 
    if(prevRssi>rssi){ 
     turnRight(); 
     goStraight(); 
     delay(2500); 
    } 
    if(rssi>-41){ 
     stayStill(); 
     detachServos(); 
     sourceFound = true; 
     Serial.print("Source found."); 
     Serial.println(); 
    } 
    } 
} 

/*MOVEMENT CONTROLS*/ 
void turnLeft(){ 
    servoLeft.writeMicroseconds(1300); 
    servoRight.writeMicroseconds(1300); 
    delay(angle*10.6); 
} 
void turnRight(){ 
    servoLeft.writeMicroseconds(1700); 
    servoRight.writeMicroseconds(1700); 
    delay(angle*10.6); 
} 
void turnAround(){ 
    if((double)rand()/(double)RAND_MAX==0){ 
    turnLeft(); 
    turnLeft(); 
    }else{ 
    turnRight(); 
    turnRight(); 
    } 
} 
void stayStill(){ 
    servoLeft.writeMicroseconds(1500); 
    servoRight.writeMicroseconds(1500); 
} 
void goStraight(){ 
    servoLeft.writeMicroseconds(1600); 
    servoRight.writeMicroseconds(1444); 
} 
void detachServos(){ 
    servoLeft.detach(); 
    servoRight.detach(); 
} 
/*MOVEMENT CONTROLS*/ 
/*WIFI SHIELD CONTROLS*/ 
void updateRSSI(){ 
    prevRssi = rssi; 
    uint8_t available_networks = WiFi.scanNetworks(); 
    for (uint8_t net = 0; net < available_networks; ++net) 
    { 
    if (strcmp(WiFi.SSID(net), ssid) == 0) 
    { 
    // ssidFound = true; 
     rssi = WiFi.RSSI(net); 

     if(rssi-prevRssi<-10){ //disregard the measurement and try again 
     rssi = prevRssi; 
     updateRSSI(); 
     } 

     Serial.print("Old: "); 
     Serial.print(prevRssi); 
     Serial.print(" dBm "); 
     Serial.print("New: "); 
     Serial.print(rssi); 
     Serial.print(" dBm"); 
     Serial.println(); 
     break; 
    } 
    } 
} 

的問題是信號變化很大,這將有時會導致機器人的權利,即使把當它是非常接近的來源和總是正確的是沒有得到到路由器它的最有效的方法是相當隨機的。有沒有更簡單的方法或更有效的方法來查找並獲取源代碼?

+0

-40對於這樣的假設似乎有點低。我希望信號比路由器附近的信號強得多。 –

+0

@MartinJames我使用手機熱點,所以它基本上只是爲了測試而接觸它。我現在主要關心的是爲機器人獲取最準確/高效的算法,以便在不進行大量猜測的情況下獲得源代碼。 – Higeath

回答

0

基本上你的機器人正在做一個叫做「wardriving」的常見任務的本地化部分(聽起來是非法的,但事實並非如此)。我最近正在做一些研究,幾乎完全是你在做什麼,雖然一些論文發現WiFi站的信號強度基本上弱於使用不一致。這個研究發現,使用典型的戰爭駕駛方法,他們只能夠檢測到所有WiFi節點的40%到60%,並且平均來自實際發射機的誤差約爲30-40m。

Another study(第4頁)在這裏您可以看到3個基站的信號強度在一個恆定的距離處被採樣。你會注意到一個鐘形曲線,它的標準偏差至少爲5(可惜沒有數據表)。但是,這很清楚地顯示了你應該期待的信號有多嘈雜。

我並不是說你的目標是不可能的但我要說的是,你需要做很多過濾並且移動速度非常緩慢(我的項目無法完成)。與本能相反,WiFi信號強度令人難以置信的嘈雜,無需極其龐大的數據集就可以實現準確的監護難度。希望這些論文至少有助於曲線您的期望。