ДО курс по робототехнике

5 апреля 2013 г.

NXC: повороты - практика программирования моторов

(C)
При задании сложных траекторий движения робота развороты и повороты - неотъемлемая часть программы. В этой статье будут рассматриваться способы, как программируются эти элементы движения с помощью функций и команд языка Not eXactly C рассмотренных ранее здесь и здесь.
Пример 1. Поворот одним двигателем
На самом деле в этом примере рассматриваются два способа поворота одним двигателем.
В качестве входных данных для обоих способов, задается необходимость выполнения разворота вправо.


Итак, первый способ.
Поворот одним двигателем вправо. Ось вращения - правое колесо.
task main() {
    /*
    Робот крутится вправо до тех пор, пока расстояние до препятствия не
    станет меньше 20 см. Вращение происходит за счет того, что правый мотор
    (OUT_A) не двигается, а левый мотор (OUT_B) двигается вперед. Поэтому
    робот, как бы крутится вокруг правого колеса.
    */

    SetSensorLowspeed(S1);
    Wait(100);

    //Вместо двух моторов, указываем только один.
    OnFwd(OUT_B, 50);
    until (SensorUS(S1) < 20);

    Off(OUT_AB);
}

Второй способ – 
Поворот вправо "задним ходом". Вращение вокруг левого колеса.
task main() {
    /*
    Робот крутится вправо до тех пор, пока расстояние до препятствия не
    станет меньше 20 см. Вращение происходит за счет движения правого мотора
    (OUT_А) назад, в то время как левый мотор (OUT_B) остается неподвижным.
    Поэтому робот, как бы пятится назад вокруг левого колеса.
    */

    SetSensorLowspeed(S1);
    Wait(100);

    //Вместо двух моторов, указываем только один.
    //Мотор двигается назад.
    OnRev(OUT_A, 50);
    until (SensorUS(S1) < 20);

    Off(OUT_AB);
}

Пример 2. Поворот двумя двигателями
Основной недостаток поворота одним двигателем - небольшая скорость: усилия одного двигателя направлены и на перемещение тележки и на преодоление силы сопротивления оказываемой неподвижным колесом. Поэтому, популярностью пользуется быстрый поворот вокруг своей оси (точнее ось вращения проходит между колесами).

В данном примере рассматривается поворот робота двумя двигателями влево.
task main() {
    /*
    Робот крутится влево до тех пор, пока расстояние до преграды не станет
    меньше 20 см. Вращение происходит за счет движения обеими моторами – 
    правый мотор двигается вперед, левый мотор двигается назад. За такое
    распределение движения между моторами отвечает третий параметр в 
    OnFwdSync().
    */

    SetSensorLowspeed(S1);
    Wait(100);

    //        Двигатели
    //           |    мощность
    //           |    |   распределение нагрузки между моторами
    //           |    |   |
    OnFwdSync(OUT_AB, 50, -100);
    until (SensorUS(S1) < 20);

    Off(OUT_AB);
}

Пример 3. Распределение мощности при управлении двумя двигателями
В прошлом примере вместе с функцией OnFwdSync() использовался параметр "распределение нагрузки между моторами". Этот параметр имеет смысл только тогда, когда происходит управление двумя двигателями. Он позволяет в одном числе выразить не только, насколько быстро будет крутиться один мотор относительно другого, но также и направление вращения. 
task main() {

    SetSensorLowspeed(S1);
    Wait(100);

    /*
    Первым действием робот вращается влево, правое колесо крутится медленней
    левого.
    */

    //          Двигатели
    //             |      мощность
    //             |      |   угол поворота оси мотора в градусах
    //             |      |   |    распределение движения между моторами
    //             |      |   |    |  синхронизация моторов
    //             |      |   |    |  |     включать торможение после
    //             |      |   |    |  |     |  окончания движения или
    //             |      |   |    |  |     |  останавливаться своим ходом
    RotateMotorEx(OUT_AB, 50, 360, -60, true, true);

    Wait(1000);

    /*
    Сейчас, робот вращается влево, правый мотор стоит, левый мотор двигается
    назад.
    */

    RotateMotorEx(OUT_AB, 50, -360, -50, true, true);

    Wait(1000);

    /*
    Робот вращается влево двигаясь, правый мотор двигается быстрее левого.
    */

    RotateMotorEx(OUT_AB, 50, 360, -25, true, true);

    Wait(1000);

    /*
    Робот двигается без поворотов, оба колеса двигаются одинаково назад.
    */

    RotateMotorEx(OUT_AB, 50, -360, 0, true, true);
}

Пример 4. Альтернативный поворот двумя двигателями
Предыдущий пример показал, что движение при использовании параметра "распределение нагрузки между моторами" по сути – работа двух двигателей с разной скоростью и разным направлением. Следовательно, его можно запрограммировать и без использования этого параметра.
task main() {
    /*
    Робот крутится влево до тех пор, пока расстояние до преграды не станет
    меньше 20 см.
    Вращение вокруг своей оси происходит без использования команд, которые
    принимают парамерт распределения движения между моторами.
    Заместо этого, используется знание того, что команды OnFwd/OnRev отдают
    управление следующим командам сразу после запуска моторов.
    Таким образом, сначала запускается один двигатель, потом сразу же
    запускается второй двигатель. Направление движения каждого двигателя и
    мощность, подаваемая на каждый из них, задают направление и форму
    поворота.
    */

    SetSensorLowspeed(S1);
    Wait(100);

    //Правый мотор двигается вперед
    OnFwd(OUT_A, 50);
    //Левый мотор двигается назад с такой же мощностью как и правый.
    OnRev(OUT_B, 50);
    until (SensorUS(S1) < 20);

    Off(OUT_AB);
}

Комментариев нет:

Отправить комментарий