Разница между визуальным программированием NXT-G и C-подобным программированием кубиков Lego NXC

Я подхожу к программированию 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);
}

person user1131951    schedule 27.08.2012    source источник
comment
Вероятно, это не связано с вашей проблемой, но почему вы создаете RIF и count внутри main, если после этого вы их больше не используете?   -  person Eregrith    schedule 27.08.2012
comment
Привет, count на самом деле не используется (в предыдущей версии он использовался для отладки). RIF используется в качестве аргумента функции balance(). Кроме того, в предыдущей версии использовалась функция read_light() для получения среднего значения освещенности за секунду. Все это на самом деле не имеет отношения к проблеме :-) Также обратите внимание, что в этой версии я использую константу KO, чтобы уменьшить выходное воздействие на двигатели... но программа все еще не балансирует робота :- (   -  person user1131951    schedule 27.08.2012
comment
Каково значение SENSOR_3 ? Почему #include MotorActions.nbc закомментировано?   -  person Eregrith    schedule 27.08.2012
comment
ДАТЧИК_3 обеспечивает значение отраженного света, обнаруженного точно в момент присвоения актуального = ДАТЧИК_3; выполняется. MotorActions.nbc больше не нужен (в нем были OnFwdSync и OnRevSync).   -  person user1131951    schedule 27.08.2012
comment
НАШЕЛ проблему: нельзя использовать функции OnFwdSync и OnRevSync; вместо этого следует использовать простые функции OnFwd и OnRev. После этого я также нашел правильное сочетание параметров: КП=25, КИ=0,25, КД=40. Комбинация трех параметров зависит, прежде всего, от скорости цикла балансировки, которая в случае языка C (компилятор nbc) быстрее, чем код, сгенерированный визуальной IDE NXT-G. Кажется, они не зависят от конструкции сборки робота.   -  person user1131951    schedule 28.08.2012
comment
Тогда ответь на свой вопрос :)   -  person Eregrith    schedule 28.08.2012


Ответы (1)


Попробуйте изменить константы. Попробуйте поднять КП до большего значения, может 32?

person Joseph Dykstra    schedule 06.10.2012