пятница, 1 апреля 2011 г.

Проблема: робот не едет прямо

От одного из читателей блога прозвучал такой вопрос:
ставлю два двигателя (схема танковая), с синхронизацией, все-ровно прямо
идеально не едет.
Может это болезнь всех NXT?

Да, похоже каждый из NXT страдает этим. Кто-то больше, кто-то меньше. И поскольку проблема общая, то совет публикуется в отдельном посте.

На такое поведение может влиять много факторов: заряд батареек, версия прошивки, внутренние особенности двигателей.

Есть несколько возможностей уменьшить этот эффект (убрать совсем - вряд ли):
  1. При большом выборе моторов, можно подобрать два таких мотора, погрешность которых при движении прямо минимальна. Методика подбора описана здесь.
  2. На "текстовых" языках программирования есть возможность передать коэфициенты во внутренний PID регулятор двигателей. При "правильно" подобрнанных коэфициентах, разницу в движении моторов можно нивелировать.
  3. Можно попробовать написать свой собственный PID регулятор для движения. Здесь замерямой величиной будет разница во вращении двигателей за единицу времени, а контроллируемой - мощность, подаваемая на каждый мотор.
P.S. А вообще о PID регуляторах, когда-нибудь напишется небольшая статья для блога. Следите за обновлениями.

4 комментария:

  1. У меня такой вопрос: В стандартной среде программирования возможно передать на сервомотор количество оборотов в градусах которые он должен совершить?
    Задача стоит в том чтобы с определённой точки при помощи датчика оборотов двигпателя, измерить сколько оборотов он сделал, чтобы после включив мотор в обратную сторону передать туда эти данные и он проехал тоже расстояние назад.

    ОтветитьУдалить
  2. В стандартной среде программирования NXT-G Это можно сделать с помощью Rotation Sensor.
    А вот в BricxCC пока не нашел как реализовать.
    Если кто богат опытом, напишите код как снять показания сенсора оборотов с двигателя NXT.

    ОтветитьУдалить
    Ответы
    1. Анонимный6 мая 2014 г., 16:09

      Наверно уже давно это не надо. Но снимать показания можно при помощи MotorTachoCount(OUT_A) например. Еще сразу скажу, что счетчик сбрасывается после каждой команды OnFwd.

      Удалить
  3. Вообще есть команда RotateMotor, где в качестве аргумента выступает и угол поворота. Подайте значение, например, 360 для движения вперёд и -360 для движения назад.

    ОтветитьУдалить

Related Posts Plugin for WordPress, Blogger...