2016-12-02 8 views
2

NXTマインドストームが設定された小さなプロジェクトに取り組んでいます。私の意図は、ラインを非常にスムーズかつ迅速に追跡できるロボットを構築することでした。したがって、小規模な研究の後、私はPIDアルゴリズムを見つけ、アルゴリズムを理解してNXCコードに実装することができました。ロボットはアルゴリズムに従ってすべてのことをやっただけですが、線が途切れると(ギャップ)、ロボットは線を失い、戻ってきません。事は、ギャップが9cmまでであれば元に戻ることができますが、10で彼はただラインを失うことです。私は1つの光センサーを使用しています。この問題に対応するためにPIDコードを調整できる方法はありますか?ロボットに追従してPIDアルゴリズムを実装しています

マイコード:正弦波パターンで

// kd ,ki kp are also defined 
    task main() 
    { 
    int error = 0; 
    float previous_error = 0; 
    float setpoint = 0; 
    float actual_position = 0; 
    int integral = 0; 
    float derivative = 0; 
    float speed=50; 
    float lasterror = 0 
    float correction = 0 
    float fahrenA = 0 
    float fahrenC = 0 
    SetSensorLight(IN_2); 

    SENSOR_TYPE_LIGHT_ACTIVE; 


while(true) 
    { 
     actual_position = LIGHTSENSOR; 
     error = setpoit - actual_position ; 
     integral = error + intergral ; 
     derivative = error - previous_error; 
     correction = (kp * error)+ (ki * intergral) + (kd * derivative   ); 
     turn = correction/100; 
     fahrenA = Tp + turn; 
     fahrenC = Tp – turn; 
     OnFwd(OUT_A,fahrenA); 
     OnFwd(OUT_C,fahrenC); 
     previous_error = error ; 
+0

私はNCXに何も知らないが、それらの「一体型」「intergral」に類似するが同一ではない言葉... はまた、「int型のエラー」が計算されます2つのフロートから四捨五入されているため精度が失われます。 – Ripi2

+1

これはPIDの問題ではありません。 PIDは、限られた期間にわたって有限のエラーが発生しているとみなします。あなたがラインを緩めると、(理論的に)ロボットは盲目になり、どの方向を取るべきか分からない。 これを解決する1つの方法は、最後の 'n'ループのために取得されたラインがない別の条件付きループを作成することによって、ロボットは最後に移動した方向に移動し続けます。いくつかの行があるまで。 これは、障害物検出(前面の超音波センサーのような)も使用していない限り、無限に進むようにロボットを誘導します。 –

+1

@AtifAnwerのラインが失われた場合は、振幅が増すにつれてsin波に沿って移動するのが普通です。ギャップの後のラインを逃さないように.... – Spektre

答えて

1

、我々はロボットがそれを失った後の再取り込みラインの可能性を高めるために、次のパスに従うことを意味します。シンプルなif-elseとタイマー/タコメーターの読み値を使用してパスをコーディングすることができます。 (提案のため@Spektreのおかげ!):

enter image description here

+0

おかげで多くの:) – james

関連する問題