Я подхожу к программированию Lego NXT и начал с очень хорошего сайта http://nxtprograms.com . В частности, я следовал инструкциям для простого Segway с датчиком освещенности в качестве датчика балансировки (http://nxtprograms.com/NXT2/segway/index.html). Я изучил его (Дейва Паркера) программу NXT-G и успешно воспроизвел ее на его роботе и на более простой кастомной версии (без "драйвера"). Все работает, и его программа и моя. Я сразу же переключился на программирование NXC, потому что уже знал язык C и хотел использовать более широкие возможности. Я довольно хорошо воспроизвел алгоритм балансировки с теми же константами PID и вычислениями. В результате программа на C просто не работает: робот балансирует 1-2 секунды, колебания больше, чем у NXT-G, и он падает.
Я сравнил базовую логику NXT-G и C, не обнаружив никакой разницы. Поэтому мне интересно, что-то не так в моей программе с управлением двигателем. Я предполагаю, что графический блок NXT-G, управляющий двигателями, делает нечто большее, чем просто вызывает OnFwdSync(...)/OnRevSync(...). Это объясняет, почему моя программа производит большие начальные колебания.
У кого-нибудь есть пример программы NXC, управляющей этим простым сегвеем-лего, или кто-нибудь может объяснить, почему управление двигателем в моей программе не работает? Внизу я прикрепил исходный код своей программы.
благодаря.
#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);
}
RIF
иcount
внутриmain
, если после этого вы их больше не используете? - person Eregrith   schedule 27.08.2012SENSOR_3
? Почему#include MotorActions.nbc
закомментировано? - person Eregrith   schedule 27.08.2012