В мире инженерного образования существует много отличных курсов, но зачастую программа обучения, построенная на них, обладает одним серьезным недостатком — отсутствием хорошей связности между различными темами. Можно возразить: как же так?
Когда формируется программа обучения, для каждого курса указываются пререквизиты и четкий порядок, в котором надо изучать дисциплины. К примеру, для того чтобы собрать и запрограммировать примитивного мобильного робота, нужно знать немного механики для создания его физической конструкции; основы электричества на уровне законов Ома/Кирхгофа, представления цифровых и аналоговых сигналов; операции с векторами и матрицами для того, чтобы описать системы координат и перемещения робота в пространстве; основы программирования на уровне представления данных, простейших алгоритмов и конструкций передачи управления и т.п. для описания поведения.
Есть ли все это в университетских курсах? Конечно есть. Однако к законам Ома/Кирхгофа мы получаем термодинамику и теорию поля; помимо операций с матрицами и векторами приходится разбираться с Жордановыми формами; в программировании изучать полиморфизм — темы, которые не всегда нужны для решения простой практической задачи.
Университетское обучение экстенсивно — учащийся идет широким фронтом и зачастую не видит смысла и практической значимости знаний, которые получает. Мы решили перевернуть парадигму университетского обучения STEM (от слов Science, Technology, Engineering, Math) и сделать такую программу, которая опирается на связность знаний, допуская наращивание полноты в будущем, то есть подразумевает интенсивное освоение предметов.
Изучение новой предметной области можно сравнить с изучением некоторой местности. И тут есть два варианта: либо перед нами очень подробная карта с огромным количеством деталей, которые требуется изучить (а это занимает много времени), для того чтобы понять, где находятся основные ориентиры и как они друг с другом соотносятся; или же можно воспользоваться примитивным планом, на котором обозначены лишь главные точки и их взаимное расположение — такой карты достаточно, для того чтобы сразу начать двигаться в нужном направлении, уточняя детали по ходу движения.
Подход интенсивного обучения STEM мы обкатали на зимней школе, которую провели совместно со студентами MIT при поддержке JetBrains Research.
Первой частью программы школы была неделя занятий по основным направлениям, которые включали в себя алгебру, электрические цепи, архитектуру компьютера, программирование на Python и знакомство с ROS (Robot Operating System).
Направления были выбраны не случайно: дополняя друг друга, они должны были помочь студентам увидеть связь между, казалось бы, разными, на первый взгляд, вещами — математикой, электроникой и программированием.
Конечно, основной целью было не прочитать много лекций, а дать возможность студентам самим применить только что полученные знания на практике.
В разделе алгебры студенты могли потренироваться в операциях с матрицами и решении систем уравнений, которые пригодились при изучении электрических цепей. Узнав об устройстве транзистора и логических элементах, построенных на его базе, учащиеся могли увидеть их применение в устройстве процессора, а после изучения основ языка Python, написать на нем программу для реального робота.
Одной из задач школы была минимизация работы с симуляторами там, где это возможно. Поэтому был подготовлен большой набор электронных схем, которые студентам предстояло собрать на макетной плате из реальных компонентов и проверить их на практике, а в качестве базы для проектов был выбран Duckietown.
Duckietown — это открытый проект, включающий в себя небольших автономных роботов, называемых Duckiebot, и сети дорог, по которым они передвигаются. Duckiebot представляет собой колесную платформу, оснащенную микрокомпьютером Raspberry Pi и одной камерой.
На его основе мы подготовили набор возможных задач, таких как построение карты дорог, поиск объектов и остановка рядом с ними и ряд других. Также студенты могли предложить собственную проблему и не только написать программу для ее решения, но и незамедлительно запустить ее на реальном роботе.
Во время лекции преподаватели рассказывали материал, используя заранее подготовленные презентации. Некоторые занятия записывались на видео, таким образом у студентов была возможность посмотреть их дома. Во время лекций студенты использовали материалы на своих компьютерах, задавали вопросы, решали задачи совместно и самостоятельно, иногда у доски. По результатам работы был подсчитан рейтинг каждого студента отдельно по разным предметам.
Рассмотрим проведение занятий по каждому предмету более подробно. Первым предметом была линейная алгебра. Студенты в течение одного дня изучали векторы и матрицы, системы линейных уравнений и т.д. Практические задания были построены в интерактивном режиме: предложенные задачи решались индивидуально, а преподаватель и другие студенты давали комментарии и подсказки.
Второй предмет — электричество и простые схемы. Студенты изучили основы электродинамики: напряжение, ток, сопротивление, закон Ома и законы Кирхгофа. Практические задания частично делались в симуляторе или выполнялись на доске, но больше времени уделялось построению реальных схем, таких как логические схемы, колебательные контуры и т.д.
Следующая тема — Архитектура ЭВМ — в некотором смысле мост, соединяющий физику и программирование. Студенты изучали фундаментальную базу, значение которой скорее теоретическое, нежели практическое. В качестве практики студенты самостоятельно проектировали арифметико-логические схемы в симуляторе, за выполненные задания получили баллы.
Четвертый день — первый день программирования. В качестве языка программирования был выбран Python 2, поскольку именно он используется в программировании под ROS. Этот день был построен следующим образом: преподаватели рассказывали материал, приводили примеры решения задач, в то время как студенты слушали их, сидя за компьютерами, и повторяли написанное преподавателем на доске или слайде. Затем учащиеся решали похожие задачи самостоятельно, впоследствии решения были оценены преподавателями.
Пятый день был посвящен ROS: ребята знакомились с программированием роботов. Весь учебный день студенты сидели за компьютерами, запуская программный код, о котором рассказывал преподаватель. Они смогли самостоятельно запустить основные единицы ROS, а также познакомились с проектом Duckietown. По окончании этого дня студенты были готовы приступить к проектной части школы — решению практических задач.
Студентам предложили объединиться в команды по три человека и выбрать себе тему проекта. В итоге были приняты следующие проекты:
1. Калибровка цветов. Duckiebot нуждается в калибровке камеры при смене условий освещения, поэтому существует задача автоматической калибровки. Проблема в том, что диапазоны цветов очень чувствительны к освещенности. Участники реализовали утилиту, которая выделяла бы на кадре требуемые цвета (красный, белый и желтый) и строила диапазоны для каждого из цветов в формате HSV.
2. Duck Taxi. Идея этого проекта в том, чтобы Duckiebot мог остановиться возле некоторого объекта, подобрать его и проследовать по некоторому маршруту. В качестве объекта была выбрана яркая желтая уточка.
3. Построение графа дорог. Существует задача построения графа дорог и перекрестков. Цель этого проекта — построить граф дорог без предоставления априорных данных об окружении для Duckiebot, опираясь только на данные с камеры.
4. Патрульная машина. Этот проект был придуман самими студентами. Они предложили научить одного Duckiebot, «патрульного», преследовать другого — «нарушителя». Для этого был использован механизм распознавания цели по ArUco-маркеру. Как только распознавание завершится, «нарушителю» посылается сигнал о завершении работы.
Целью проекта Color Calibration была корректировка диапазона распознаваемых цветов разметки под новые условия освещения. Без таких корректировок распознавание стоп-линий, разделителей полос и границ дороги становилось некорректным. Участники предложили решение, основанное на предобработке шаблонов цветов разметки: красного, желтого и белого.
Для каждого из этих цветов задан предварительный диапазон HSV или RGB-значений. С использованием этого диапазона на кадре находятся все области, содержащие подходящие цвета, и из них выбирается наибольшая. Эта область принимается за цвет, который необходимо запомнить. Затем используются статистические формулы, такие как вычисление среднего значения и среднеквадратического отклонения для того, чтобы оценить новый диапазон цвета.
Этот диапазон записывается в файлы конфигурации камеры Duckiebot и может быть использован в дальнейшем. Описанный подход применялся ко всем трем цветам, в итоге формируя диапазоны для каждого из цветов разметки.
Тесты показали почти идеальное распознавание линий разметки, кроме тех случаев, когда в качестве материалов разметки использовалась глянцевая лента, настолько сильно отражающая источники освещения, что под углом обзора камеры разметка казалось белой независимо от ее изначального цвета.
Проект Duck Taxi подразумевал построение алгоритма поиска в городе уточки-пассажира, а затем ее перевозку в необходимую точку. Участники разбили эту задачу на две: детекция и движение по графу.
Студенты осуществили детекцию уточки, сделав допущение, что уточкой называется любая область на кадре, которую можно распознать как желтую, с красным треугольником (клювом) на ней. Как только такая область обнаруживается на очередном кадре, роботу следует приблизиться к ней, а затем остановиться на несколько секунд, имитируя посадку пассажира.
Затем, имея заложенный заранее в памяти граф дорог всего duckietown и положение бота, а также, получив в качестве входных данных пункт назначения, участники строят путь из точки отправления в точку прибытия, используя алгоритм Дейкстры для поиска путей в графе. Выходные данные представляются в виде набора команд — поворотов на каждом из следующих перекрестков.
Целью этого проекта было построение графа — сети дорог в Duckietown. Узлами результирующего графа являются перекрестки, и дугами — дороги. Для этого Duckiebot должен исследовать город и анализировать свой маршрут.
В ходе работы над проектом была рассмотрена, но затем отброшена идея делать взвешенный граф, в котором стоимость ребра определяется расстоянием (временем на преодоление) между перекрестками. Реализация этой идеи оказалась слишком трудоемкой, и на нее не хватило бы времени в рамках школы.
Когда Duckiebot добирается до очередного перекрестка, он выбирает дорогу, выходящую из перекрестка, по которой он еще не двигался. Когда все дороги на всех перекрестках пройдены, в памяти бота остается сформированный список смежности перекрестков, который преобразуется в изображение при помощи библиотеки Graphviz.
Предложенный участниками алгоритм не подходит для произвольного Duckietown, но хорошо работал на небольшом городе, состоящем из четырех перекрестков, используемом в рамках школы. Идея была в том, чтобы дополнить каждый перекресток ArUco-маркером, содержащим идентификатор перекрестка, чтобы отслеживать порядок проезда перекрестков.
Схема работы разработанного участниками алгоритма показана на рисунке.
Цель данного проекта — поиск, преследование и задержание бота-нарушителя в городе Duckietown. Бот-патрульный должен двигаться по внешнему кольцу дороги в городе в поисках заранее известного бота-нарушителя. После обнаружения нарушителя патрульный бот должен следовать за нарушителем и заставить его остановиться.
Работа началась с поиска идеи детекции бота на кадре и распознавания в нем нарушителя. Команда предложила оснастить каждого бота в городе сзади уникальным маркером — так же как реальные автомобили имеют номера государственной регистрации. Для этого были выбрали ArUco-маркеры. Они и ранее использовались в duckietown, так как с ними просто работать и они позволяют определить ориентацию маркера в пространстве и расстояние до него.
Далее потребовалось сделать так, чтобы патрульный бот двигался строго по внешнему кругу без остановок на перекрестках. По умолчанию Duckiebot движется в полосе и останавливается на стоп-линии. Затем с помощью дорожных знаков определяет конфигурацию перекрестка и делает выбор о направлении проезда перекрестка. За каждый из описанных этапов отвечает одно из состояний конечного автомата робота. Для того чтобы избавиться от остановок на перекрестке, команда изменила автомат состояний так, чтобы при подъезде к стоп-линии бот сразу переходил в состояние проезда перекрестка прямо.
Следующим шагом было решение задачи остановки бота-нарушителя. Командой было сделано предположение, что патрульный бот может иметь доступ по SSH к каждому из ботов в городе, то есть иметь некоторую информацию о том, какие данные для авторизации и какой id имеет каждый бот. Таким образом, после обнаружения нарушителя, патрульный бот стал подключаться по SSH к боту-нарушителю и выключать его систему.
После подтверждения того, что команда выключения была выполнена, патрульный бот тоже останавливался.
Алгоритм работы патрульного робота можно представить в виде следующей схемы:
Работа была организована в формате похожем на Scrum: каждое утро студенты планировали задачи на текущий день, а вечером отчитывались о проделанной работе.
В первый и завершающий дни студенты подготовили презентации, описывающие поставленную задачу и способы ее решения. Чтобы помочь студентам следовать выбранным планам, в комнатах, где происходила работа над проектами, постоянно находились преподаватели из России и Америки, которые отвечали на вопросы. Общение происходило преимущественно на английском языке.
Работа над проектами длилась одну неделю, по истечении которой студенты представили свои результаты. Все подготовили презентации, в которых рассказали, чему они научились в этой школе, какие самые важные уроки вынесли, что им понравилось или не понравилось. После этого каждая команда представила свой проект. Все команды справились с поставленными задачами.
Команда, реализующая калибровку цветов, завершила работу над проектом быстрее других, поэтому они успели подготовить и документацию к своей программе. А команда, занимавшаяся графом дорог, даже в последний день перед демонстрацией проекта старалась доработать и исправить свои алгоритмы.
После завершения школы мы попросили студентов оценить прошедшие активности и ответить на вопросы о том, насколько школа соответствовала их ожиданиям, какие навыки они приобрели и т.д. Все студенты отметили, что они научились работать в команде, распределять задачи и планировать свое время.
Студентам также предложили оценить полезность и сложность пройденных курсов. И здесь сформировались две группы оценок: для одних курсы не представляли большой трудности, другие оценили их как максимально сложные.
Это значит, что школа заняла правильную позицию, оставаясь доступной для новичков в той или иной области, но также предоставляя материалы для повторения и закрепления опытным студентам. Следует отметить, что курс по программированию (Python) практически всеми был отмечен как несложный, но полезный. Самым сложным, по мнению студентов, оказался курс «Архитектура ЭВМ».
Когда студентов спросили о недостатках и достоинствах школы, многие ответили, что им понравился выбранный стиль преподавания, в рамках которого преподаватели оперативно и индивидуально предоставляли помощь и отвечали на возникшие вопросы.
Еще учащиеся отметили, что им понравилось работать в режиме ежедневного планирования своих задач и самостоятельно устанавливать дедлайны. В качестве недостатков студенты отметили нехватку предоставленных знаний, которые потребовались при работе с ботом: при подключении, понимании основ и принципов его работы.
Практически все студенты отметили, что школа превзошла их ожидания, и это говорит о правильно выбранном направлении организации школы. Таким образом, следует сохранить общие положения при организации следующей школы, приняв во внимание и по возможности устранив недостатки, которые отметили студенты и преподаватели, возможно, изменив перечень курсов или время их преподавания.
Авторы статьи: команда лаборатории алгоритмов мобильных роботов в JetBrains Research.
P.S. У нашего корпоративного блога новое имя. Теперь он будет посвящён образовательным проектам компании JetBrains.
Когда формируется программа обучения, для каждого курса указываются пререквизиты и четкий порядок, в котором надо изучать дисциплины. К примеру, для того чтобы собрать и запрограммировать примитивного мобильного робота, нужно знать немного механики для создания его физической конструкции; основы электричества на уровне законов Ома/Кирхгофа, представления цифровых и аналоговых сигналов; операции с векторами и матрицами для того, чтобы описать системы координат и перемещения робота в пространстве; основы программирования на уровне представления данных, простейших алгоритмов и конструкций передачи управления и т.п. для описания поведения.
Есть ли все это в университетских курсах? Конечно есть. Однако к законам Ома/Кирхгофа мы получаем термодинамику и теорию поля; помимо операций с матрицами и векторами приходится разбираться с Жордановыми формами; в программировании изучать полиморфизм — темы, которые не всегда нужны для решения простой практической задачи.
Университетское обучение экстенсивно — учащийся идет широким фронтом и зачастую не видит смысла и практической значимости знаний, которые получает. Мы решили перевернуть парадигму университетского обучения STEM (от слов Science, Technology, Engineering, Math) и сделать такую программу, которая опирается на связность знаний, допуская наращивание полноты в будущем, то есть подразумевает интенсивное освоение предметов.
Изучение новой предметной области можно сравнить с изучением некоторой местности. И тут есть два варианта: либо перед нами очень подробная карта с огромным количеством деталей, которые требуется изучить (а это занимает много времени), для того чтобы понять, где находятся основные ориентиры и как они друг с другом соотносятся; или же можно воспользоваться примитивным планом, на котором обозначены лишь главные точки и их взаимное расположение — такой карты достаточно, для того чтобы сразу начать двигаться в нужном направлении, уточняя детали по ходу движения.
Подход интенсивного обучения STEM мы обкатали на зимней школе, которую провели совместно со студентами MIT при поддержке JetBrains Research.
Подготовка материала
Первой частью программы школы была неделя занятий по основным направлениям, которые включали в себя алгебру, электрические цепи, архитектуру компьютера, программирование на Python и знакомство с ROS (Robot Operating System).
Направления были выбраны не случайно: дополняя друг друга, они должны были помочь студентам увидеть связь между, казалось бы, разными, на первый взгляд, вещами — математикой, электроникой и программированием.
Конечно, основной целью было не прочитать много лекций, а дать возможность студентам самим применить только что полученные знания на практике.
В разделе алгебры студенты могли потренироваться в операциях с матрицами и решении систем уравнений, которые пригодились при изучении электрических цепей. Узнав об устройстве транзистора и логических элементах, построенных на его базе, учащиеся могли увидеть их применение в устройстве процессора, а после изучения основ языка Python, написать на нем программу для реального робота.
Duckietown
Одной из задач школы была минимизация работы с симуляторами там, где это возможно. Поэтому был подготовлен большой набор электронных схем, которые студентам предстояло собрать на макетной плате из реальных компонентов и проверить их на практике, а в качестве базы для проектов был выбран Duckietown.
Duckietown — это открытый проект, включающий в себя небольших автономных роботов, называемых Duckiebot, и сети дорог, по которым они передвигаются. Duckiebot представляет собой колесную платформу, оснащенную микрокомпьютером Raspberry Pi и одной камерой.
На его основе мы подготовили набор возможных задач, таких как построение карты дорог, поиск объектов и остановка рядом с ними и ряд других. Также студенты могли предложить собственную проблему и не только написать программу для ее решения, но и незамедлительно запустить ее на реальном роботе.
Преподавание
Во время лекции преподаватели рассказывали материал, используя заранее подготовленные презентации. Некоторые занятия записывались на видео, таким образом у студентов была возможность посмотреть их дома. Во время лекций студенты использовали материалы на своих компьютерах, задавали вопросы, решали задачи совместно и самостоятельно, иногда у доски. По результатам работы был подсчитан рейтинг каждого студента отдельно по разным предметам.
Рассмотрим проведение занятий по каждому предмету более подробно. Первым предметом была линейная алгебра. Студенты в течение одного дня изучали векторы и матрицы, системы линейных уравнений и т.д. Практические задания были построены в интерактивном режиме: предложенные задачи решались индивидуально, а преподаватель и другие студенты давали комментарии и подсказки.
Второй предмет — электричество и простые схемы. Студенты изучили основы электродинамики: напряжение, ток, сопротивление, закон Ома и законы Кирхгофа. Практические задания частично делались в симуляторе или выполнялись на доске, но больше времени уделялось построению реальных схем, таких как логические схемы, колебательные контуры и т.д.
Следующая тема — Архитектура ЭВМ — в некотором смысле мост, соединяющий физику и программирование. Студенты изучали фундаментальную базу, значение которой скорее теоретическое, нежели практическое. В качестве практики студенты самостоятельно проектировали арифметико-логические схемы в симуляторе, за выполненные задания получили баллы.
Четвертый день — первый день программирования. В качестве языка программирования был выбран Python 2, поскольку именно он используется в программировании под ROS. Этот день был построен следующим образом: преподаватели рассказывали материал, приводили примеры решения задач, в то время как студенты слушали их, сидя за компьютерами, и повторяли написанное преподавателем на доске или слайде. Затем учащиеся решали похожие задачи самостоятельно, впоследствии решения были оценены преподавателями.
Пятый день был посвящен ROS: ребята знакомились с программированием роботов. Весь учебный день студенты сидели за компьютерами, запуская программный код, о котором рассказывал преподаватель. Они смогли самостоятельно запустить основные единицы ROS, а также познакомились с проектом Duckietown. По окончании этого дня студенты были готовы приступить к проектной части школы — решению практических задач.
Описание выбранных проектов
Студентам предложили объединиться в команды по три человека и выбрать себе тему проекта. В итоге были приняты следующие проекты:
1. Калибровка цветов. Duckiebot нуждается в калибровке камеры при смене условий освещения, поэтому существует задача автоматической калибровки. Проблема в том, что диапазоны цветов очень чувствительны к освещенности. Участники реализовали утилиту, которая выделяла бы на кадре требуемые цвета (красный, белый и желтый) и строила диапазоны для каждого из цветов в формате HSV.
2. Duck Taxi. Идея этого проекта в том, чтобы Duckiebot мог остановиться возле некоторого объекта, подобрать его и проследовать по некоторому маршруту. В качестве объекта была выбрана яркая желтая уточка.
3. Построение графа дорог. Существует задача построения графа дорог и перекрестков. Цель этого проекта — построить граф дорог без предоставления априорных данных об окружении для Duckiebot, опираясь только на данные с камеры.
4. Патрульная машина. Этот проект был придуман самими студентами. Они предложили научить одного Duckiebot, «патрульного», преследовать другого — «нарушителя». Для этого был использован механизм распознавания цели по ArUco-маркеру. Как только распознавание завершится, «нарушителю» посылается сигнал о завершении работы.
Color Calibration
Целью проекта Color Calibration была корректировка диапазона распознаваемых цветов разметки под новые условия освещения. Без таких корректировок распознавание стоп-линий, разделителей полос и границ дороги становилось некорректным. Участники предложили решение, основанное на предобработке шаблонов цветов разметки: красного, желтого и белого.
Для каждого из этих цветов задан предварительный диапазон HSV или RGB-значений. С использованием этого диапазона на кадре находятся все области, содержащие подходящие цвета, и из них выбирается наибольшая. Эта область принимается за цвет, который необходимо запомнить. Затем используются статистические формулы, такие как вычисление среднего значения и среднеквадратического отклонения для того, чтобы оценить новый диапазон цвета.
Этот диапазон записывается в файлы конфигурации камеры Duckiebot и может быть использован в дальнейшем. Описанный подход применялся ко всем трем цветам, в итоге формируя диапазоны для каждого из цветов разметки.
Тесты показали почти идеальное распознавание линий разметки, кроме тех случаев, когда в качестве материалов разметки использовалась глянцевая лента, настолько сильно отражающая источники освещения, что под углом обзора камеры разметка казалось белой независимо от ее изначального цвета.
Duck Taxi
Проект Duck Taxi подразумевал построение алгоритма поиска в городе уточки-пассажира, а затем ее перевозку в необходимую точку. Участники разбили эту задачу на две: детекция и движение по графу.
Студенты осуществили детекцию уточки, сделав допущение, что уточкой называется любая область на кадре, которую можно распознать как желтую, с красным треугольником (клювом) на ней. Как только такая область обнаруживается на очередном кадре, роботу следует приблизиться к ней, а затем остановиться на несколько секунд, имитируя посадку пассажира.
Затем, имея заложенный заранее в памяти граф дорог всего duckietown и положение бота, а также, получив в качестве входных данных пункт назначения, участники строят путь из точки отправления в точку прибытия, используя алгоритм Дейкстры для поиска путей в графе. Выходные данные представляются в виде набора команд — поворотов на каждом из следующих перекрестков.
Graph of Roads
Целью этого проекта было построение графа — сети дорог в Duckietown. Узлами результирующего графа являются перекрестки, и дугами — дороги. Для этого Duckiebot должен исследовать город и анализировать свой маршрут.
В ходе работы над проектом была рассмотрена, но затем отброшена идея делать взвешенный граф, в котором стоимость ребра определяется расстоянием (временем на преодоление) между перекрестками. Реализация этой идеи оказалась слишком трудоемкой, и на нее не хватило бы времени в рамках школы.
Когда Duckiebot добирается до очередного перекрестка, он выбирает дорогу, выходящую из перекрестка, по которой он еще не двигался. Когда все дороги на всех перекрестках пройдены, в памяти бота остается сформированный список смежности перекрестков, который преобразуется в изображение при помощи библиотеки Graphviz.
Предложенный участниками алгоритм не подходит для произвольного Duckietown, но хорошо работал на небольшом городе, состоящем из четырех перекрестков, используемом в рамках школы. Идея была в том, чтобы дополнить каждый перекресток ArUco-маркером, содержащим идентификатор перекрестка, чтобы отслеживать порядок проезда перекрестков.
Схема работы разработанного участниками алгоритма показана на рисунке.
Patrol Car
Цель данного проекта — поиск, преследование и задержание бота-нарушителя в городе Duckietown. Бот-патрульный должен двигаться по внешнему кольцу дороги в городе в поисках заранее известного бота-нарушителя. После обнаружения нарушителя патрульный бот должен следовать за нарушителем и заставить его остановиться.
Работа началась с поиска идеи детекции бота на кадре и распознавания в нем нарушителя. Команда предложила оснастить каждого бота в городе сзади уникальным маркером — так же как реальные автомобили имеют номера государственной регистрации. Для этого были выбрали ArUco-маркеры. Они и ранее использовались в duckietown, так как с ними просто работать и они позволяют определить ориентацию маркера в пространстве и расстояние до него.
Далее потребовалось сделать так, чтобы патрульный бот двигался строго по внешнему кругу без остановок на перекрестках. По умолчанию Duckiebot движется в полосе и останавливается на стоп-линии. Затем с помощью дорожных знаков определяет конфигурацию перекрестка и делает выбор о направлении проезда перекрестка. За каждый из описанных этапов отвечает одно из состояний конечного автомата робота. Для того чтобы избавиться от остановок на перекрестке, команда изменила автомат состояний так, чтобы при подъезде к стоп-линии бот сразу переходил в состояние проезда перекрестка прямо.
Следующим шагом было решение задачи остановки бота-нарушителя. Командой было сделано предположение, что патрульный бот может иметь доступ по SSH к каждому из ботов в городе, то есть иметь некоторую информацию о том, какие данные для авторизации и какой id имеет каждый бот. Таким образом, после обнаружения нарушителя, патрульный бот стал подключаться по SSH к боту-нарушителю и выключать его систему.
После подтверждения того, что команда выключения была выполнена, патрульный бот тоже останавливался.
Алгоритм работы патрульного робота можно представить в виде следующей схемы:
Работа над проектами
Работа была организована в формате похожем на Scrum: каждое утро студенты планировали задачи на текущий день, а вечером отчитывались о проделанной работе.
В первый и завершающий дни студенты подготовили презентации, описывающие поставленную задачу и способы ее решения. Чтобы помочь студентам следовать выбранным планам, в комнатах, где происходила работа над проектами, постоянно находились преподаватели из России и Америки, которые отвечали на вопросы. Общение происходило преимущественно на английском языке.
Результаты и их демонстрация
Работа над проектами длилась одну неделю, по истечении которой студенты представили свои результаты. Все подготовили презентации, в которых рассказали, чему они научились в этой школе, какие самые важные уроки вынесли, что им понравилось или не понравилось. После этого каждая команда представила свой проект. Все команды справились с поставленными задачами.
Команда, реализующая калибровку цветов, завершила работу над проектом быстрее других, поэтому они успели подготовить и документацию к своей программе. А команда, занимавшаяся графом дорог, даже в последний день перед демонстрацией проекта старалась доработать и исправить свои алгоритмы.
Заключение
После завершения школы мы попросили студентов оценить прошедшие активности и ответить на вопросы о том, насколько школа соответствовала их ожиданиям, какие навыки они приобрели и т.д. Все студенты отметили, что они научились работать в команде, распределять задачи и планировать свое время.
Студентам также предложили оценить полезность и сложность пройденных курсов. И здесь сформировались две группы оценок: для одних курсы не представляли большой трудности, другие оценили их как максимально сложные.
Это значит, что школа заняла правильную позицию, оставаясь доступной для новичков в той или иной области, но также предоставляя материалы для повторения и закрепления опытным студентам. Следует отметить, что курс по программированию (Python) практически всеми был отмечен как несложный, но полезный. Самым сложным, по мнению студентов, оказался курс «Архитектура ЭВМ».
Когда студентов спросили о недостатках и достоинствах школы, многие ответили, что им понравился выбранный стиль преподавания, в рамках которого преподаватели оперативно и индивидуально предоставляли помощь и отвечали на возникшие вопросы.
Еще учащиеся отметили, что им понравилось работать в режиме ежедневного планирования своих задач и самостоятельно устанавливать дедлайны. В качестве недостатков студенты отметили нехватку предоставленных знаний, которые потребовались при работе с ботом: при подключении, понимании основ и принципов его работы.
Практически все студенты отметили, что школа превзошла их ожидания, и это говорит о правильно выбранном направлении организации школы. Таким образом, следует сохранить общие положения при организации следующей школы, приняв во внимание и по возможности устранив недостатки, которые отметили студенты и преподаватели, возможно, изменив перечень курсов или время их преподавания.
Авторы статьи: команда лаборатории алгоритмов мобильных роботов в JetBrains Research.
P.S. У нашего корпоративного блога новое имя. Теперь он будет посвящён образовательным проектам компании JetBrains.