Алгоритмы: черно-белое движение. Часть VI Следы NiNoXT в Галактике / 09.11.2012 Продолжение. В этот раз не будет сложных формул и замудренных графиков - данная заметка посвящена именно тому, для чего и предназначались роботы, а именно - нудной и повторяющейся деятельности. Но прежде нужно понять, где же в предыдущих заметках была эта нудная и повторяющаяся работа.Для этого взглянем еще раз на формулы. Первая вычисляет коэффициент пропорциональной составляющей.Вторая - позволяет рассчитать мощность для каждого мотора.Где, LA - предполагаемая освещенность на границе линии, которую можно определить по следующей, третьей формуле.Можно заметить, что и KP и LA использующиеся в формуле для мощностей, зависят от уровней освещенности: на белой - Lmax и черной - Lmin частях поля. А это значит, что каждый раз, когда робот попадает в другие условия освещенности, или у него изменяется датчик или его расположение относительно поверхности поля, то и KP, и LA придется рассчитывать заново, подставлять в программу и перекомпилировать ее. Поэтому вот это очень и хочется возложить на плечи робота - пусть он делает вычисления вместо человека.Как бы тогда хотелось, чтобы устройство функционировало?Можно предположить, что оно должно помогать определить самый светлый участок на поле (Lmax), а потом и самый темный (Lmin). Как только эти данные известны, то можно рассчитать и KP и LA, которые будут затем использованы в пропорциональном регуляторе при движении робота вдоль линии. Итак, первый шаг - определить самый светлый участок. Не будем слишком усложнять программу, а воспользуемся традиционным способом, который используется, в том числе, и на робототехнических состязаниях - ручная калибровка, при которой оператор робота сам выбирает светлый участок поля и отдает роботу команду зафиксировать изменения.Здесь, в цикле опрашивается датчик и его показания для удобства оператора выводятся на экран, как только фиксируется нажатие оранжевой кнопки на NXT блоке, обозначающее, что оператор сделал свой выбор, завершается цикл и текущее показание датчика еще раз считывается для дальнейшего использования.Абсолютно такая же структура получиться для определения освещенности на темном участке.Если попробовать сейчас запустить этот кусок программы, то будет видно, что ожидание второго нажатия почему-то не происходит. На самом деле, второй цикл тоже работает, но в нем исполняется только одна итерация. Связано это с тем, что у NXT блока быстродействие лучше, чем у человека. После нажатия на кнопку и выхода из первого цикла, программа сразу же заходит во второй - время перехода очень маленькое - оператор еще не успевает убрать руку с кнопки после нажатия, поэтому второй цикл определяет опять, что кнопка нажата и завершает свою работу.Решить эту небольшую проблему можно двумя способами: изменить событие завершения цикла с "Pressed" (нажато) на "Bumped" (нажато и отжато), либо добавить между двумя циклами небольшую паузу, достаточную для того, чтобы оператор отжал кнопку перед вторым циклом Поскольку два цикла получились идентичные, то существенно сократить программу позволит использование собственных блоков (MyBlock).Что же, значения Lmax и Lmin получены - все готово к тому, чтобы рассчитать коэффициент пропорциональной составляющей регулятора и освещенность на границе линии.Теперь остается передать результаты вычислений внутрь цикла, выполняющего движение вдоль линии. Вместо жестко вбитых чисел в цикле будут использованы автоматически рассчитываемые значения.Практика показывает, что в ходе составления программы случаются всякие досадные ошибки при получении минимальной и максимальной яркостей, а равно и при вычислении коэффициента и "средней" освещенности. Поэтому имеет смысл в программе заранее предусмотреть вывод этих значений на экран - это позволит лучше понять как и почему ведет себя робот в ходе движения вдоль линии.Как выглядит финальная программа, можно посмотреть в оригинальной статье на блоге NiNoXT (в эту заметку картинки больше на влезают из-за ограничений на edugalaxy.intel.ru).Данная программа позволяет перед запуском робота произвести измерения освещенностей на поле, которые затем использует для вычисления KP и LA, использующихся пропорциональной составляющей линейного регулятора в основном цикле движения вдоль линии.В качестве альтернативного подхода можно рассмотреть алгоритм автокалибровки, предложенный одним из преподавателей Нижегородского Института Информационных Технологий. В этом подходе не существует предварительного замера освещенностей. Вместо этого коэффициент пропорциональной составляющей и освещенность на границе линии вычисляются и подстраиваются автоматически по ходу движения робота.Посмотреть блок-схему в оригинальной статье на блоге NiNoXT алгоритмы датчики робототехника