вторник, 30 октября 2012 г.

Алгоритмы: черно-белое движение. Часть VI

Продолжение. В этот раз не будет сложных формул и замудренных графиков - данная заметка посвящена именно тому для чего и предназначались роботы, а именно нудной и повторяющейся деятельности.
Но прежде нужно понять, где же в предыдущих заметках была эта нудная и повторяющаяся работа. Для этого взглянем еще раз на формулы.
Первая вычисляет коэффициент пропорциональной составляющей.
А вторая позволяет рассчитать мощность для каждого мотора.
Где, LA - предполагаемая освещенность на границе линии, которую можно определить по следующей, третьей формуле.
Можно заметить, что и KP и LA использующиеся в формуле для мощностей, зависят от уровней освещенности: на белой - Lmax и черной - Lmin частях поля. А это значит, что каждый раз когда робот попадает в другие условия освещенности, или у него изменяется датчик или его расположение относительно поверхности поля, то и KP, и LA придется рассчитывать заново, подставлять в программу и перекомпилировать ее. Поэтому вот это очень и хочется возложить на плечи робота - пусть он делает вычисления вместо человека.

Как бы тогда хотелось, чтобы устройство функционировало?

Можно предположить, что оно должно помогать определить самый светлый участок на поле (Lmax), а потом и самый темный (Lmin). Как только эти данные известны, то можно рассчитать и KP и LA, которые будут затем использованы в пропорциональном регуляторе при движении робота вдоль линии.
Итак, первый шаг - определить самый светлый участок. Не будем слишком усложнять программу, а воспользуемся традиционным способом, который используется в том числе и на робототехнических состязаниях - ручная калибровка, при которой оператор робота сам выбирает светлый участок поля и отдает роботу команду зафиксировать изменения.
Здесь, в цикле опрашивается датчик и его показания для удобства оператора выводятся на экран, как только фиксируется нажатие оранжевой кнопки на NXT блоке, обозначающее, что оператор сделал свой выбор, завершается цикл и текущее показание датчика еще раз считывается для дальнейшего использования.

Абсолютно такая же структура получиться для определения освещенности на темном участке.
Если попробовать сейчас запустить этот кусок программы, то будет видно, что ожидание второго нажатия почему-то не происходит. На самом деле, второй цикл тоже работает, но в нем исполняется только одна итерация. Связано это с тем что у NXT блока быстродействие лучше, чем у человека. После нажатия на кнопку и выхода из первого цикла, программа сразу же заходит во второй - время перехода очень маленькое - оператор еще не успевает убрать руку с кнопки после нажатия, поэтому второй цикл определяет опять, что кнопка нажата и завершает свою работу.

Решить эту небольшую проблему можно двумя способами:
  • изменить событие завершения цикла с "Pressed" (нажато) на "Bumped" (нажато и отжато), либо
  • добавить между двумя циклами небольшую паузу, достаточную для того, чтобы оператор отжал кнопку перед вторым циклом
Поскольку два цикла получились идентичные, то существенно сократить программу позволит использование собственных блоков (MyBlock).
Что же, значения Lmax и Lmin получены - все готово к тому, чтобы рассчитать коэффициент пропорциональной составляющей регулятора и освещенность на границе линии.
Теперь остается передать результаты вычислений внутрь цикла, выполняющего движение вдоль линии. Вместо жестко вбитых чисел в цикле будут использованы автоматически рассчитываемые значения.
Практика показывает, что в ходе составления программы случаются всякие досадные ошибки при получении минимальной и максимальной яркостей, а равно и при вычислении коэффициента и "средней" освещенности. Поэтому имеет смысл в программе заранее предусмотреть вывод этих значений на экран - это позволит лучше понять как и почему ведет себя робот в ходе движения вдоль линии.
Финальная программа тогда выглядит следующим образом:

Данная программа позволяет перед запуском робота произвести измерения освещенностей на поле, которые затем использует для вычисления KP и LA, использующихся пропорциональной составляющей линейного регулятора в основном цикле движения вдоль линии.

В качестве альтернативного подхода можно рассмотреть алгоритм автокалибровки, предложенный одним из преподавателей Нижегородского Института Информационных Технологий. В этом подходе не существует предварительного замера освещенностей. Вместо этого коэффициент пропорциональной составляющей и освещенность на границе линии вычисляются и подстраиваются автоматически по ходу движения робота.

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

  1. До сих пор Вы работаете (или считаете, что должны работать) с положительными значениями скоростей. Но если робот "увидит" освещение светлее "самого светлого" или теменее "самого темного" (например, тень от самого робота легла под датчик или вспышка фотоаппарата), то на один из двигателей "придет" отрицательное число. Обращаю Ваше внимание на то, что в NXT-G отрицательные значения на входе мощности двигателя запускают двигатель вращаться ВПЕРЕД.
    Как добиться, чтобы робот ехал назад при отрицательной скорости я описал здесь: http://rostovrobot.ru/?q=motors_wire_NXT-G
    В данном примере это не так критично (хотя, иногда из-за этого робот неожиданно сбивается на поворотах), но мне подобные программы "режут глаз" - я своих учеников сразу учу, что "как только в программе идет управление двигателем по шинам данных, сразу необходимо добавлять блок сравнения".

    ОтветитьУдалить
    Ответы
    1. Алексей, если Вы думаете, что я это забыл, то нет. Это не правда. У меня методика такая - от простого сложного. Сначала добиться маленьких результатов, пусть неправильных, но главное результатов, без забивания лишними деталями голову. Как только эта информация усвоилась - переходим к следующему "усложнению" в программе.
      Иначе, я мог бы и на первом занятии давать PID регулятор. Но тогда бы ребята запомнили это как странный набор формул, не более.
      То что Вы говорите я собирался объяснять на следующем занятии - там как раз будет рассказываться от чего еще зависит коэф. пропорциональности. Там-то и введется понятие, что мощность вычисляемая может быть больше или меньше рамок, в которых работает мотор.

      Удалить
  2. Я ни в коей мере не собирался обидеть Вас, Александр, или подвергнуть сомнению Вашу методику преподавания. Прошу меня извинить, если мое замечание показалось для Вас обидным или неуместным.
    С нетерпением жду следующего занятия!

    ОтветитьУдалить
  3. Этот комментарий был удален администратором блога.

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

Related Posts Plugin for WordPress, Blogger...