2012-08-27 20 views
0

我正在接近樂高NXT編程,我從非常好的網站http://nxtprograms.com開始。特別是我遵循簡單的Segway光傳感器作爲平衡傳感器(http://nxtprograms.com/NXT2/segway/index.html)的說明。 我研究了他的(Dave Parker)NXT-G程序,併成功複製了他的機器人和更簡單的定製版本(沒有「驅動程序」)。一切正常,無論是他的節目還是我的。 我很快就轉向了NXC編程,因爲我已經知道了C lang並希望利用更大的潛力。我用相同的PID常數和計算很好地複製了平衡算法。結果是C程序無法工作:機器人平衡自己1或2秒鐘,振盪比使用NXT-G的振盪器大,並且振動下降。NXT-G可視化編程和NXC類似於樂高積木磚編程的區別

我比較了NXT-G和C base邏輯,但沒有發現任何差異。所以我想知道在我的程序中是否有什麼不對,還有電機控制。我想控制電機的NXT-G圖形控制器可以做更多的事,只需調用OnFwdSync(...)/ OnRevSync(...)。這可以解釋爲什麼我的程序產生大的初始振盪。

有沒有人有一個NXC程序驅動那個簡單的segway-lego的例子,或者可以解釋爲什麼我的程序中的電機控制失敗?在底部,我附加了我的程序的源代碼。

謝謝。

#define KP 25 
#define KI 1 
#define KD 10 
#define KO 0.5 
#define LSAMPLE 100 
//#include "MotorActions.nbc" 

int balance(const int RIF) 
{ 
    int output = 0; 
    int previous_error = 0; 
    int error = 0; 
    int I = 0; 
    int D = 0; 
    int counter = 0; 
    int actual; 

    while (true) 
    { 
    actual = SENSOR_3; 
    error = actual - RIF; 
    counter++; 
    I += error; 
    D = (error - previous_error); 
    previous_error = error; 
    /** 
    * Compute de PID compensation 
    */ 
    output = KO * (KP * error + KI * I + KD * D); 
    if ((output > 1000) || (output < -1000)) 
     break; 
    if (output < 0) 
     OnFwdSync(OUT_BC, -output, 0); 
    else 
     OnRevSync(OUT_BC, output, 0); 
    } 
    return (counter); 
} 

int read_light() 
{ 
    int L = 0; 
    int ctr = 0; 

    while (ctr < LSAMPLE) 
    { 
    L += SENSOR_3; 
    ctr++; 
    Wait(10); 
    } 
    return (L/LSAMPLE); 
} 

task main() 
{ 
    int i = 0; 
    int RIF; 
    int count; 

    while (i++ < 3) 
    { 
    //PlaySound(SOUND_LOW_BEEP); 
    Wait(800); 
    } 
    Wait(400); 
    //PlaySound(SOUND_DOUBLE_BEEP); 
    SetSensorColorRed(IN_3); 
    ClearSensor(SENSOR_3); 
    RIF = SENSOR_3; 
    count = balance(RIF); 
    Off(OUT_BC); 
} 
+0

可能與您的問題無關,但您爲什麼在'main'裏面創建'RIF'和'count',因爲在此之後您不再使用它們? – Eregrith

+0

嗨,計數實際上沒有使用(這是爲了在以前的版本調試)。 RIF被用作balance()的參數。另外,prev版本中使用read_light()來獲取光線的平均值超過一秒。所有這些都與問題無關:-) 請注意,在這個版本中,我使用KO常數來減少對電機的輸出效應...但是程序仍然不能平衡機器人:-( – user1131951

+0

'SENSOR_3'的值是什麼?#include MotorActions.nbc'爲什麼被評論? – Eregrith

回答

1

嘗試更改常量。嘗試將KP提高到更大的值,32,也許?

相關問題