Чемпионат ИТ-сферы Ульяновской области по программированию среди школьников

О задачах проекта "Управление транспортными роботами"

Что дают задачи проекта

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

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

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

В-четвертых, проект является простым примером реальной системы автоматизации проектирования (САПР). Объектом проектирования являются наборы данных, определяющие движение робокара. В профессиональных САПР технологических процессов аналогично генерируются наборы данных, управляющие оборудованием – там эти наборы данных называются управляющими программами.

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

В-шестых, задачи проекта тренируют способность разбираться в объемных описаниях объекта управления и постановках задач. Первый раз читать описание идеализированного робокара и механизма управления его движением довольно муторно. Однако, разобравшись с объектом управления и структурами управляющих данных, Вы получаете возможность переходить от замысла движения робокара к программе управления. Во всех других задачах, за исключением 9-й и 10-й, механизм тот же самый, что позволяет сразу сконцентрироваться на математической модели процесса требуемого перемещения робокара.

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

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

В-восьмых, проект является достаточно наглядным примером осуществления широко распространенной технологии проектирования программ – Model-View-Control (MVC). Эта технология предполагает отделение представления (View) объектов на экране и в распечатках от модели обработки данных (Model) и управления этой обработкой (Control).

В проекте "Управление транспортными роботами" компоненты Model – это профили движения и алгоритмы их генерации. Их разрабатывают участники тренировочного турнира – именно они программируют всю требуемую обработку данных. Компоненты View предоставляются участникам в готовом виде – это изображение путей движения и представление перемещаемого робокара.

Только благодаря применению технологии MVC, созданы условия для того, чтобы компоненты Model можно было создавать на различных языках программирования, как это делается в программистских турнирах.

В-девятых, решение задач проекта предоставляет участникам возможность легко отвечать на вопросы близких типа: "А что интересного умеют делать твои программы?". Показывать входные и выходные данные консольных программ обычных турнирных задач непосвященным бесполезно. А показать процесс, содержание которого определяется результатом своей программы – это обычно впечатляет.

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

Физико-математические и технологические аспекты автоматизируемых процессов

Свойства рассматриваемого робокара

В наборе задач проекта "Управление транспортными роботами" рассматривается трехколесная транспортная тележка со следующими свойствами:

Транспортные тележки с такими свойствами очень широко распространены среди учебных робототехнических конструкторов. Управления движением будем рассматривать в порядке усложнения условий и характера движения:

Алгоритмы управление движением предполагают вычисление параметров, задающих скорости и направление вращения двигателей на отрезке времени T. Значит движение можно задать массивом чисел: "T, CL, WL, CR, WR", например: "3 1 100 1 80" – 3 секунды двигаться вперед по дуге, параметры которой определяются значениями WL = 100 и WR = 80, а также расстоянием между колесами и их диаметром. Поскольку расстояние между колесами и их диаметр являются постоянными свойствами платформы, приводить их в векторе смысла не имеет.

Последовательность из подобных векторов будем называть профилем движения. Например, профиль "2 1 100 1 100; 1 1 0 1 0; 4 2 50 2 50" будет задавать прямолинейное движение вперед в течение 2 секунд с кодом ширины импульса W = 100, затем остановку на 1 секунду, а затем возврат в исходную точку со скоростью в два раза ниже исходной при условии, что скорость зависит от ширины импульса W линейно.

Прямолинейное движение в идеальных условиях

В идеальных условиях прямолинейное движение предполагает полностью идентичные приводы и одинаковую скорость вращения колес, поэтому можно записать:

   NL = NR = k * W;
   VL = VR = π*D*N
,

   где NL и NR – скорости вращения соответственно левого и правого колес; VL и VR – линейные скорости движения поверхности колес; D – диаметр колеса.

Для практического использования приведенных формул необходимо их модифицировать с учетом применяемых единиц измерения.

Скорость вращательного движения вала двигателя в технических спецификациях чаще всего задают через обороты в минуту. В транспортных тележках учебного назначения скорость при максимальных значениях W составляет обычно несколько сотен оборотов в минуту.

Диаметр колеса обычно задается в миллиметрах. Широко распространненная величина диаметра – 42 мм. Хотя встречаются робокары со значительно большим деаметром.

Принимая миллиметры за единицу измерения диаметра, получаем следующие три формулы линейной скорости в точке соприкосновения колеса с полом (pi = 3.14159...):

   V_mm_min = pi * D * N миллиметров в минуту;
   V_mm_sec = pi * D * N / 60 миллиметров в секунду;
   V_mm_min = pi * D * N / 60000 миллиметров в миллисекунду.

Единица измерения времени очень важна для формирования профиля движения – от точности задания времени существенно зависит погрешность в пройденном расстоянии. Пусть например, мы имеем платформу с диаметром колеса в 100 мм и скоростю двигателя 600 оборотов в минуту. Тогда за одну секунду будет совершено 10 оборотов двигателя и пройдено больше трех метров. Это исключает использование секунд в условиях движения робокара в комнате. Использование округленного до миллисекунды времени может породить для рассматриваемой платформы ошибку более полутора миллиметров. Казалось бы, нужно задавать время в профиле с точностье до десятых или даже сотых долей миллисекунды. Однако, для большинства платформ робокаров столь высокая точность задания времени либо невозможна, либо нерациональна. В этой связи в задачах проекта фигурирует целочисленное время в миллисекундах.

Использование миллисекунд и миллиметров дает следующие базовые выражения для прямолинейного движения (S – расстояние, T – время):

   V = pi * D * k * W / 60000 мм/мсек;
   S = T * V = T * pi * D * k * W / 60000 мм.
   T = S / V = S / (pi * D * k * W / 60000) мсек.

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

Поворот идеализированного робокара

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

   S = pi * degA * R / 180,
   S = radA * R,
   где R – радиус; degA – угол в градусах; radA – угол в радианах.

В случае, когда центром окружности поворота является точка соприкосновения с полом одного из ведущих колес, радиус равен расстоянию между центрами ведущих колес L, т.е. R = L. Ясно, что то колесо, вокруг которого осуществляется поворот, должно стоять на месте, а противоположное колесо должно двигаться с заданной скоростью в течение T = S / V. Например, если требуется повернуться по часовой стрелке вокруг правого колеса, то профиль движения должен иметь вид: "T 1 W 1 0", где W определяет скорость, а T - время движения.

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

   R = L / 2,
   WL = WR,
   CL = 3 - CR.

В более общем случае колесо с меньшей скоростью движения описывает дугу меньшего радиуса, нежели другое колесо. Радиусом дуги поворота робокара считается расстояние R от центра дуги до центра оси ведущих колес.

Пусть скорость левого колеса меньше скорости правого. Тогда левое колесо за время dT пройдет путь SL = dT * VL по дуге радиусом R - L / 2, а правое – SR = dT * VR по дуге с радиусом R + L / 2.

Оба колеса по отношению к центру дуги поворота за время dT поворачиваются на один и тот же угол dA:

   dA = VL * dT / (R - L/2) = VR * dT / (R + L/2),

что дает базовое уравнение криволинейного движения, возникающего в связи с разницей скоростей вращения колес:

   (VL + VR) * L / 2 = R * (VR - VL).

Из этого уравнения получаем радиус:

   R = L * (VR + VL) / (2 * (VR - VL))

Подставляя формулу радиуса в формулу угла поворота, получаем:

   dA = (VR - VL) * dT / L.

Движение в неидеальных условиях с возможностью контролировать скорости колес

В реальных условиях имеют место следующие обстоятельства: Для компенсации погрешностей управления движением, связанными с перечисленными обстоятельствами, приводы снабжают средствами контроля скорости вращения. Наиболее распространенным для этих целей в настоящее время является энкодер. Энкодер за один оборот двигателя генерирует СPR (Cycles per revolution) импульсов, благодаря подсчету которых можно контролировать угол поворота колеса и пройденное расстояние.

Если за время dT левый энкодер насчитал PL, а правый – PR импульсов, то пути, которые прошли колеса, можно представить формулами:

   SL = pi * D * PL / CPR
   SR = pi * D * PR / CPR.

Из этих путей определяются скорости VL и VR, угол пройденной дуги dA криволинейного движения в радианах и ее радиус R, а также приращения значений координат dX и dY :

   VL = SL / dT,
   VR = SR / dT,
   dA = (VR - VL) * dT / L,
   R = L * (VR + VL) / (2 * (VR - VL)),
   dX = R * (sin(dA + A) - sin(A)),
   dY = - R * (cos(dA + A) - cos(A))

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

Энкодеры позволяют контролировать пройденное расстояние и даже обеспечивать требуемое расстояние S через задание числа импульсов непосредственно в профиле движения: P = CPR * S / (pi * D). Достаточно точное движение с невысокими и не сильно меняющимися скоростями можно организовать, используя профиль движения со следующей структурой записей: "WL PL WR PR". При этом двигатели останавливаются по достижении заданного числа импульсов P. После остановки обоих двигателей в работу вовлекается следующая запись такого профиля.

При достижении целевой точки с достаточно большой скоростью снятие сигнала питания с двигателя не обеспечивает мгновенной остановки из-за инерции. По завершении движения энкодеры в этом случае покажут большее значение, чем рассчитано по длине пути. В этом случае обычно организуется создание профиля либо с пошаговым замедлением перед целевой точкой трассы, либо с медленным возвратом к целевой точке.

Задача 1. Время равномерного движения по прямой

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

Задача 2. В нужном месте в нужное время

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

Задача 3. Определение времени на основе калибровки

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

Задача 4. Вперед-разгрузка-возврат

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

Задача 5. Движение под углом

В отличие от предыдущих задач, в пятой задаче организуется движение не по горизонтали. Если бы изначально робокар позиционировался слево-направо, как в предыдущих задачах, то пришлось бы сначала организовать разворот по направлению движения, а только потом само движение. Однако условие пятой задачи много проще – считается, что изначально робот уже спозиционирован в сторону целевой точки. Остается только рассчитать расстояние и время его прохождения.

Задача 6. Трапецеидальный профиль

Уменьшение погрешностей разгона и торможения обычно строится на основе трехфазного движения: разгон – равномерное движение – торможение. Здесь придется запрограммировать генерацию массива записей профиля движения, предварительно рассчитав расстояния, которые должен пройти робокар в каждой фазе.

Задача 7. Разворот одним колесом

Разворот одним колесом является наиболее простым разворотом, поскольку нужно всего-навсего расчитать время перемещения подвижного колеса. Здесь достаточно знать формулу длины окружности.

Задача 8. Самый крутой разворот

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

Задача 9. Движение по прямой с энкодерами

Самая распространенная задача, связанная с использованием энкодеров, заключается в организации прямолинейного движения. В постановке девятой задачи содержится один из механизмов изменения кодов ширины колес.

Задача 10. Коррекция погрешности инерции робокара

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