2016-05-16 4 views
-1

私はwifiシールド付きarduino unoを持っており、信号源に行くことができるようにしたい。rssiを使用してWiFi信号のソースに続いて

私が得るrssiは、通常、-40dBmを超える-80dBmです。ロボットがソースを見つけたと仮定します。

ロボットが真っ直ぐに進み、新しい信号が右に90度回転する前よりも悪い場合はrssiを2秒ごとにチェックし、ソースが見つかるまでそれを続けます。

ボイドループ()は、ロボットのロジックです。

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

基本的に、あなたのロボットは、「ワードドライブ」と呼ばれる共通のタスクのローカライゼーション部分を実行しています(違法ですが、そうではありません)。私は最近、あなたがやっていたことをかなり正確に研究していましたが、いくつかの論文では、基本的にWiFiステーションの信号強度が弱く、使用には一貫性がないことが判明しました。

Dartmouth study(Page 14)この調査では、典型的な戦争運転方法を使用して、すべてのWiFiノードの40〜60%しか検出できず、平均で実際の送信機から約30〜40mの誤差があることがわかりました。

Another study(4ページ)ここでは、3つの基地局の信号強度を一定距離でサンプリングしてプロットしています。あなたは少なくとも5の標準偏差を持つように見えるベルカーブに気づくでしょう(悲しいことに、データのテーブルはありません)。しかし、それはあなたが期待しなければならない信号のどのように騒々しいかをかなり明確に示しています。

あなたの目標は不可能だと言っているわけではありませんが、フィルタリングをたくさん行う必要があり、非常にゆっくりと移動する必要があります(私のプロジェクトではできないこと)。本能とは対照的に、WiFiの信号強度は信じられないほど騒々しく、非常に大きなデータセットなしでは正確なワーピングを困難にしています。これらの論文を持っていれば、期待通りのカーブを作ることができます。

関連する問題