2016-12-02 90 views
2

我正在開發一個NXT mindstorms集的小型項目。我的目標是建立一個能夠非常順利且儘可能快地遵循一條線的機器人。因此,經過小範圍的研究,我發現了PID算法,並且我能夠理解並將算法實現爲NXC代碼。機器人根據算法正確地做了所有事情,但是當線路中斷(間隙)時,機器人失去了線路並且無法返回。問題是,當差距達到9釐米時,他可以回來但是在10點他就失去了線路。我正在使用一個光傳感器。有什麼方法可以調整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不算什麼,但那些'積分「可積」相似但不完全相同的話... 另外,「廉政錯誤」計算來自兩個浮子。精度因四捨五入或間隔而丟失。 – Ripi2

+1

這不是一個PID問題。 PID只會認爲你在有限的時間內收到有限的錯誤。當你鬆開線時,(理論上)機器人會失明,不知道要採取哪個方向。 解決這個問題的方法之一可能是創建另一個條件循環,在最後的'n'循環沒有獲得線條的情況下,機器人繼續沿着它最後一次移動的方向移動;直到有一行。然而,這將導致機器人無限地繼續前進,除非您也在使用障礙物檢測(如前方的超聲波傳感器)。 –

+1

@AtifAnwer在線路丟失的情況下是更平常的沿着正弦波移動增加幅度不會錯過線後差距.... – Spektre

回答

1

通過一個正弦波圖案,我們的意思是,機器人可以遵循以下路徑來提高再捕捉線的機會失去之後。您可以使用簡單的if-else和定時器/轉速計讀數來編碼路徑。 (感謝@Spektre您的建議!):

enter image description here

+0

謝謝,這有助於很多:) – james