我正在接近樂高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);
}
可能與您的問題無關,但您爲什麼在'main'裏面創建'RIF'和'count',因爲在此之後您不再使用它們? – Eregrith
嗨,計數實際上沒有使用(這是爲了在以前的版本調試)。 RIF被用作balance()的參數。另外,prev版本中使用read_light()來獲取光線的平均值超過一秒。所有這些都與問題無關:-) 請注意,在這個版本中,我使用KO常數來減少對電機的輸出效應...但是程序仍然不能平衡機器人:-( – user1131951
'SENSOR_3'的值是什麼?#include MotorActions.nbc'爲什麼被評論? – Eregrith