search icon search icon ВЕРСИЯ ДЛЯ СЛАБОВИДЯЩИХ

Инженерный тур. 3 этап

Общая информация

В рамках командного тура заключительного этапа профиля Аэрокосмические системы 2025 г. командам необходимо разработать дополнительное оборудование (далее — навесное оборудование (НО)) и программное обеспечение для космического ровера для решения задачи развертывания солнечных панелей на неизвестной местности.

Для управления космической миссией на другой планете участникам следует использовать как элементы автономного управления, так и телеуправление без прямой видимости по внешней сенсорике ровера.

Команда участников должна запрограммировать космический ровер, чтобы аппарат:

  1. произвел выезд из посадочного модуля в автономном режиме;
  2. осуществил полет до местности, заданной координатами, в режиме телеуправления;
  3. произвел развертывание солнечных панелей;
  4. вернулся в посадочный модуль.

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

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

Во второй зоне (зона навигации) следует в режиме телеуправления без прямой видимости совершить проезд от посадочного модуля до зоны развертывания, которая будет задана командам координатами перед стартом миссии. Здесь могут располагаться как статические, так и динамические препятствия, а также искусственные неровности. Для управления ровером в этой зоне команда должна написать программный код для управления перемещениями ровера и НО в режиме телеуправления (управление с клавиатуры).

В третьей зоне (зона развертывания) надо осуществить раскладывание (развертку) загруженных в ровер солнечных батарей с помощью НО в точке, координаты которой будут выданы командам перед стартом миссии. После окончания развертки необходимо вернуться в посадочный модуль. Для управления ровером в этой зоне команда должна написать программный код для управления перемещениями ровера и НО в режиме телеуправления (управление с клавиатуры).

Во время выполнения финальной задачи участники не имеют визуального контакта с ровером.

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

Легенда задачи

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

— Вы уверены, что ровер выдержит дополнительные нагрузки? — голос программиста Севы прозвучал из-за экрана ноутбука. Его лицо отражало смесь усталости и скептицизма. — Я проверил все расчеты, и даже минимальное отклонение от центра масс может... ну, вы поняли.

— Сева, ты слишком переживаешь, — ответил Аркадий, не отрываясь от чертежей. — Я предусмотрел контрбаланс. Если правильно распределим вес, все будет работать идеально.

— Главное, чтобы твое «идеально» не превратилось в «хоть как-то», — вставил электронщик Илья, держа в руках микроконтроллерный модуль VBCore VB32G4. Его привычка поддевать коллег на грани сарказма давно стала неотъемлемой частью работы команды. — Я тут подготовил схему для подключения приводов манипулятора. Но если ваши расчеты окажутся неверными, мне придется чинить обломки прямо на месте.

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

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

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

— Окей, — сказал Сева, глядя на монитор с потоком данных. — Загружаю тестовый сценарий. Первое задание: открыть виртуальный люк и проверить, работает ли механизм захвата. Аркадий, держи пальцы скрещенными.

Манипулятор медленно пришел в движение. Щелчки сервоприводов наполняли помещение. Металлические «пальцы» коснулись панели и аккуратно повернули ее. На экране загорелась надпись: «Доступ открыт».

— Пока что без сюрпризов, — прокомментировал Илья, скрывая улыбку. — Теперь найдите зону развертывания.

Сева активировал следующий этап. Ровер, используя встроенные датчики, начал искать заданные координаты. Через несколько минут экран показал виртуальный ландшафт и отметку, соответствующую зоне развертывания.

— Теперь самое сложное, — сказал Аркадий. — Разворачиваем панель.

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

— Готово, — выдохнул Сева, снимая наушники. — Если этот сценарий работает на тестовом уровне, значит, мы на верном пути.

— На тестовых испытаниях все всегда работает, — пробормотал Илья. — Посмотрим, что будет, когда ровер окажется в реальных условиях.

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

А какую инженерную историю можете написать вы?

Требования к команде и компетенциям участников

Команда состоит из трех участников, обладающих следующими компетенциями:

  • электронщик: отвечает за разработку электрической принципиальной схемы и изготовление электрической «начинки» навесного оборудования; имеет знания в области программирования этой электроники на нижнем уровне;
  • конструктор-моделист: отвечает за разработку и сборку конструкции навесного оборудования, а также за поддержание ее работоспособности;
  • программист: отвечает за разработку программной части работы ровера и навесного оборудования, а также протоколов передачи данных между ноутбуком и роботом.

Предполагается, что участники внутри команды определят для себя роли:

  • капитан команды: обеспечивает общее руководство командой, следит за выполнением этапов работы, ведет переговоры с организаторами;
  • оператор ровера: непосредственно управляет ровером на финальном испытании.
Оборудование и программное обеспечение
Инфраструктура площадки:
  • лабораторная зона с 3D-принтерами и паяльными местами;
  • рабочие места для сборки и программирования;
  • полигон;
  • ноутбук/компьютер.
Базовый набор для каждой команды-участника:
  • ровер под управлением Robot Operating System (ROS);
  • набор электронных модулей;
  • набор крепежа и расходных материалов;
  • набор ручного инструмента;
  • онлайн-документация по соревнованию и оборудованию;
  • облачное хранилище для размещения результатов работы.
Программное обеспечение

Перечислено только специфическое программное обеспечение, предполагается наличие стандартного ПО:

  • Windows 10/11 / Ubuntu 20.04;
  • «Компас-3D»;
  • PDF-ридер;
  • Arduino IDE;
  • STM32CubeProgrammer.
Полигон

Полигон представляет собой пространство размерами примерно \(5 \times 20\) м, ограниченное разметкой по зонам выполнения задач, а также различными элементами препятствий.

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

Для решения задачи финала каждой команде выдается база ровера-планетохода.

Рис. 4.1.

Общие рекомендации по управлению и программированию ровера и его полезной нагрузки: http://learn.voltbro.ru.

При проверке работоспособности, настройке и программировании ровера рекомендуется пользоваться инструкцией: https://manual.turtlebro.ru/.

Набор электронных модулей VBCores

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

Микроконтроллерный модуль VBCore VB32G4 на основе
STM32G474REt

Основной модуль VBCore на базе микроконтроллера STM32G447RE. Предназначен для встраивания в различные устройства в качестве интегрированного решения, имеет односторонний монтаж.

Модуль можно программировать как традиционными средствами от производителя микроконтроллера (STM32 CUBEIDE и другие), так и через среду Arduino IDE (STM32duino), пользуясь всем многообразием готовых библиотек.

Параметры модуля:

  • Актуальная версия 1,3.
  • Рабочее напряжение: 6–50 В.
  • Выходное напряжение: 5 В, 3,3 В: 1,5 А (суммарно), 3,3 В до 600 мА.
  • Микроконтроллер: STM32G474RE (LQFP64).
  • Выводов: 50 (\(14\times 11\)) с шагом 2,54 мм.

Рис. 4.2.

Плата расширения CAN/CAN FD для Raspberry PI

Плата позволяет работать на микрокомпьютере Raspberry PI с шинами CAN и CAN FD. Кроме того, плата содержит преобразователь питания для работы микрокомпьютера от внешних источников напряжением от 6 до 50 вольт. Также существует возможность измерения входного питания (например чтобы контролировать заряд батареи).

Рис. 4.3.

Описание задачи
Общее описание конструкторских задач

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

Следует продумать, какие возможности управления будут у оператора планетохода, и оснастить робота камерой/камерами с подходящими зонами обзора.

Ровер-планетоход, для которого необходимо разработать механизм, представлен на чертеже (рис. 5.1).

Рис. 5.1.

Описание рабочих элементов

Общий вид сцены для работы

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

Рис. 5.2.

Общий вид посадочного модуля

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

Ровер должен полностью помещаться внутри посадочного модуля.

Рис. 5.3.

Образец комплекта солнечных батарей

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

Рис. 5.4.

Доступные компоненты для сборки и моделирования

Список доступных компонентов и крепежа (https://disk.yandex.ru/i/VGr2VNoUPaLQFA):

  • робот (RoverE4-Dummie.stp);
  • сцена действия с посадочным модулем (scene-nto25.stp);
  • посадочный модуль (LandingModule.stp).

Компоненты для проектирования (3D-модели в папке components архива):

  • камера HVB-1315, угол обзора \(60°\) (camera-HBV-1315.stp);
  • концевые выключатели (gg-microswitch.stp);
  • сервопривод микро (MicroServo.stp);
  • сервопривод стандартный \(180°\) (MG995-180.stp);
  • сервопривод постоянного вращения (MG995-360.stp);
  • мотор постоянного тока (gm25-370-65rpm-encoder.stp);
  • шаговый двигатель (28byj-48.stp);
  • ультразвуковой датчик дальности (HC-SR04.stp).

Крепеж:

  • винты DIN 7985 c метрической резьбой M3 и длинами с шагом 2 мм длиной 6, 8, 10, 12, …, 40 мм;
  • винты DIN 7985 c метрической резьбой M4 длиной 8, 10, 80 мм;
  • гайки М3 DIN 934;
  • винт самонарезающий (саморез) DIN 7981 2,2\(\times\)6,5; 2,2\(\times\)9,5; 2,9\(\times\)6,5; 2,9\(\times\)9,5; 2,9\(\times\)13;
  • гайки со стопорным кольцом М3, M4 DIN 985;
  • стойки ММ 8 мм, 12 мм, 22 мм, 30 мм, М3 (3D-модель дана для 12 мм, 20 мм, 30 мм).

Оборудование и материалы:

  • 3D-принтер (не более 20 мин на деталь, команды записываются на печать у организаторов);
  • станок лазерной резки (оргстекло: размер листа \(750 \times 500\) мм, толщина 3 мм).

Все изображения и 3D-модели можно скачать по ссылке: https://disk.yandex.ru/d/eN6uHundnLgRVg/3D-models.

Рабочие зоны

Для работы конструктора и электронщика доступны следующие зоны:

  • Паяльная зона: обеспечена всеми необходимыми расходными элементами.
  • Зона 3D-принтеров. Каждая команда располагает не более, чем пятью подходами к 3D-принтерам в день. Время, отведенное на печать детали, — 30 мин. Предварительно команды записываются на печать у организаторов.
  • Сборочная зона. В сборочной зоне у команд нет ограничений на время нахождения. Возможно использование как инструментов, которые предоставят организаторы, так и собственного инструмента (требования к собственному инструменту описаны в Правилах заключительного этапа).
  • Зона лазерной резки. Лазерная резка недоступна участникам на площадке, но команды могут трижды отправить чертежи на нарезку, поэтому необходимо максимально ответственно подойти к моделированию механизма навесного оборудования. На одну команду выделяется лист оргстекла размером \(750 \times 500\) мм толщиной 3 мм.

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

Требования к навесному оборудованию

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

К разрабатываемому навесному оборудованию предъявляются следующие требования:

  • Изделие должно крепиться на передней или верхней панелях ровера (отсутствуют на 3D-модели, проектируются участниками).
  • Для крепления панелей к раме ровера используются винты DIN7985 M4x8 и Т-гайки. Крепление осуществляется по центру желоба профиля.
  • На ровере не должно оставаться открытых панелей после завершения работы.
  • Механизм не должен пересекаться с блоком электроники (отмечено красным на модели ровера).
  • Все элементы между собой должны скрепляться с использованием предоставленного крепежа — обратите внимание, что клея нет. Можно использовать двухсторонний скотч (в основном для склеивания плоских поверхностей).

Навесное оборудование планетохода должно удовлетворять следующим критериям:

  1. позволять размещать комплект солнечных батарей;
  2. позволять размещаться роверу в посадочном модуле полностью;
  3. позволять осуществлять перемещение с комплектом солнечных батарей;
  4. позволять осуществлять развертывание комплекта солнечных батарей на ровную поверхность;
  5. на ровер должны быть установлены камеры для работы оператора (максимум две); в рабочем режиме у участников нет визуального контакта с ровером;
  6. должен быть обеспечен обзор достаточный для управления перемещением робота;
  7. использовать минимальное возможное число приводов и деталей.

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

Требования к файлам на изготовления деталей

Для 3D-печати необходимо предоставить модель в формате STL. Время печати первой детали не должно превышать 30 мин.

Для лазерной резки необходимо предоставить файл в формате DXF и чертеж с указанием контрольных размеров. В файле DXF не должно быть ничего, кроме контура реза. Файлы с лишними элементами будут возвращаться на доработку. Станок лазерной резки работает на основе программы CorelDraw 2020 — все DXF файлы будут импортироваться в эту программу.

Внимание! Сдача чертежей на изготовление деталей методом лазерной резки происходит четыре раза.

Заранее убедитесь, что модель корректно экспортируется. Наиболее часто проблемы встречаются при экспорте из «Компас-3D».

Обратите внимание:

  • линии должны быть одинарными (иногда одинаковые линии наложены друг на друга много раз);
  • DXF-файл не должен содержать ничего, кроме контура реза — часто остаются рамки, вспомогательные линии и цифры; станок это будет пытаться безуспешно интерпретировать в линию реза;
  • чтобы гарантированно получить правильную деталь, прикладывайте оформленный чертеж в pdf-файл с несколькими контрольными размерами;
  • потеря масштаба — частая проблема.

Конструкторские задачи для прохождения промежуточных тестовых испытаний

Результаты задач сдаются в зависимости от расписания сдачи промежуточных испытаний.

В случае сдачи задачи после установленного дедлайна, она будет оценена не более, чем в 50% установленных за задачу баллов.

Задание 1. Разработка 3D-модели и сборка навесного оборудования

Последовательность действий:

  1. Согласовать с командой стратегию, по которой будет происходить развертывание комплекта солнечных батарей.
  2. Разработать 3D-модель навесного оборудования.
  3. Изготовить навесное оборудование и смонтировать на планетоход.

Требования:: см. требования к навесному оборудованию.

Результаты, которые надо представить:

  • Презентация сборки навесного оборудования (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 3 день \(\rightarrow\) Конструктор \(\rightarrow\) презентация) в составе:

    • скриншот сборки навесного оборудования в CAD на ровере в трех проекциях (спереди, сбоку и сверху) и в изометрической проекции, показывающей модуль наилучшим способом;
    • фотографии в трех проекциях (спереди, сбоку и сверху) и в изометрической проекции, показывающей навесное оборудование наилучшим способом;
    • формат файла — PDF;
    • имя файла: название команды (латинскими буквами); пример: Iskorka.pdf.
  • Продемонстрировать экспертам собранное навесное оборудование на ровере согласно присланной презентации.

Задание 2. Разработка моделей и чертежей для изготовления элементов навесного оборудования

Последовательность действий:

  1. Согласовать с командой стратегию, по которой будет происходить развертывание комплекта солнечных батарей.
  2. Разработать STL-файлы для печати на 3D-принтере (при необходимости) и DFX-чертежи для лазерной резки (при необходимости).
  3. Сдать файлы на изготовление.
  4. Изготовить навесное оборудование и смонтировать на планетоход.

Требования:: см. требования к файлам на изготовление.

Результаты, которые требуется представить

  • Чертежи для лазерной резки в файлах/модели для печати на 3D-принтере (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 3 день \(\rightarrow\) Конструктор \(\rightarrow\) файлы на изготовление).
  • Формат файлов — STL или DFX.
Описание задач на подключение электрических компонентов

Задачи для электронщиков для прохождения промежуточных тестовых испытаний

Задачи сдаются в зависимости от расписания сдачи промежуточных испытаний.

В случае сдачи задачи после установленного дедлайна, она будет оценена не более, чем в 50% установленных за задачу баллов.

Список вспомогательных ссылок, которые понадобятся для решения поставленных задач:

Задание 3. Разработка схемы базовой версии платы управления

Последовательность действий:

  1. Изучить документацию на предоставленную электронику.
  2. Составить схему подключения модуля VBCore VB32G4 к вспомогательной панели в электронном виде.

Требования:

  • Схема должна содержать отображения того, как модуль будет подключен к вспомогательной панели (питание модуля, интерфейс CAN).
  • Схема должна быть цветной и отображать цвета проводов в соответствии с принятыми стандартами:

    • питание: красный цвет;
    • заземление: черный цвет;
    • CAN-L: зеленый цвет;
    • CAN-H: желтый цвет.
  • Рядом с шиной должно быть ее краткое описание.
  • Схема должна быть корректна с точки зрения электротехники.
  • Схема должна включать только доступные компоненты.

Результаты, которые требуется представить:

  • Продемонстрировать экспертам оформленную схему в электронном виде.
  • Оформленную схему подключения в электронном виде (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 0 день \(\rightarrow\) Электронщик). Формат схемы — jpeg/png.

Примеры схем см. на рис. 5.55.6.


Рис. 5.5.

Рис. 5.6.

Примечания

Запрещено приступать к следующим заданиям, пока это задание не принято экспертами!

Задание 4. Изготовление базовой версии платы управления

Последовательность действий:

  1. Изготовить необходимые кабели подключения:

    • кабель питания от вспомогательной панели управления питанием к модулю VBCore VB32G4;
    • кабель CAN от вспомогательной панели управления питанием к модулю VBCore VB32G4.
  2. Разместить электронные компоненты на макетной плате.
  3. Спаять базовую версию платы управления.

Требования:

  • Длина кабеля питания и CAN — 70–80 см.
  • Качественное крепление электрических компонентов на макетной плате.
  • Плата должна быть спаяна согласно предоставленной схеме из предыдущего задания.
  • Кабели должны быть изготовлены аккуратно, необходимой длины с установленными наконечниками.

Результаты, которые требуется представить:

  • Продемонстрировать экспертам изготовленную базовую версию платы управления.
  • Фотографию базовой версии платы управления (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 1 день \(\rightarrow\) Электронщик).

Задание 5. Тестирование базовой версии платы управления

Последовательность действий:

  1. Подключить изготовленную базовую версию платы к панели управления питанием.
  2. Скачать тестовый скетч для отправки и приема данных на модуль can_fd.ino: https://github.com/VBCores/VBCoreG4_examples/tree/main/examples/can/can_fd.
  3. Внести изменения в скетч:

    • отправлять в CAN число 90 и 3 любых байта;
    • добавить функционал декодирования входящих данных от программиста (см. задание № 12).
  4. Загрузить тестовый скетч на модуль.
  5. Совместно с программистом удостовериться, что с модуля и на модуль передаются данные.

Требования:

  • Программный код для приема и передачи данных должен находиться в одном скетче.
  • Сдача задания происходит совместно с заданием № 12 программиста.
  • Снять видео, как электронщик загружает тестовый скетч на модуль, программист запускает программу по приему/передаче данных на ровере и получает в терминал данные с модуля (число 90 и 3 любых байта), затем электронщик показывает получаемые данные в Serial Port (число 180).

Результаты, которые требуется представить:

  • Совместно с программистом продемонстрировать, что с модуля и на модуль передаются тестовые данные.
  • Видео, которое сняла команда (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 1 день \(\rightarrow\) Электронщик).
  • Измененный тестовый скетч в формате txt (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 1 день \(\rightarrow\) Электронщик).

Задание 6. Разработка схемы подключения платы управления

Последовательность действий:

  1. Согласовать с командой необходимое для подключения оборудование.
  2. Изучить доступные комплектующие.
  3. Дополнить схему подключения базовой версии платы управления электронными элементами, которые будут использоваться в навесном оборудовании.

Требования:

  • Схема должна быть корректна с точки зрения электротехники.
  • Схема должна включать только доступные компоненты.
  • Схема должна содержать отображения того, как электроника (сервоприводы, концевые выключатели, моторы и т. д.) будет подключена к модулю VBCore VB32G4 и обеспечена питанием.
  • Схема должна быть цветной и отображать цвета проводов в соответствии с принятыми стандартами:

    • питание — красный цвет;
    • заземление — черный цвет;
    • CAN-L — зеленый цвет;
    • CAN-H — желтый цвет;
    • сигнальный провод — желтый/синий/зеленый.
  • Рядом с шиной должно быть ее краткое описание.

Результаты, которые требуется представить:

  • Продемонстрировать экспертам оформленную схему в электронном виде.
  • Оформленная схема подключения в электронном виде (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 1 день \(\rightarrow\) Электронщик). Формат схемы — jpeg/png.

Примеры схем см. на рис. 5.75.8.


Рис. 5.7.

Рис. 5.8.

Примечания

Перед осуществлением пайки схема должна быть утверждена экспертами!

Задание 7. Изготовление платы управления навесным оборудованием

Последовательность действий:

  1. Разместить электронные компоненты на макетной плате (преобразователи питания, пины для подключения электроники и т. д.).
  2. Спаять плату управления навесным оборудованием.

Требования:

  • Выходное напряжение преобразователей питания должна быть 5 В.
  • Качественное крепление электрических компонентов на макетной плате.
  • Плата должна быть спаяна согласно предоставленной схеме из предыдущего задания.

Результаты, которые требуется представить:

  • Продемонстрировать экспертам изготовленную плату управления навесным оборудованием.
  • Фотографию платы управления навесным оборудованием (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 2 день \(\rightarrow\) Электронщик).

Задание 8. Разработка программы нижнего уровня для управления сервоприводом/мотором

Последовательность действий:

  1. Подключить изготовленную плату управления навесным оборудованием к панели управления питанием.
  2. Подключить к плате управления навесным оборудованием необходимую электронику (мотор или сервопривод).
  3. Написать программу для приема управляющих данных с Raspberry Pi и передачи данных обратной связи на Raspberry Pi (в случае необходимости) по протоколу CAN-FD.
  4. Совместно с программистом удостовериться, что сервопривод/мотор работает корректно.

Требования:

  • Программный код должен находиться в одном скетче.
  • Сдача задания происходит совместно с заданием № 15 программиста.
  • Снять видео работы сервопривода/мотора.

Результаты, которые требуется представить:

  • Совместно с программистом продемонстрировать, что программное обеспечение для управления сервоприводом/мотором работает.
  • Видео, которое сняла команда (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 2 день \(\rightarrow\) Электронщик).
  • Скетч для модуля в формате txt (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 2 день \(\rightarrow\) Электронщик).

Задание 9. Разработка программы нижнего уровня для раскладывания солнечных панелей

Последовательность действий:

  1. Подключить изготовленную плату управления навесным оборудованием к панели управления питанием.
  2. Подключить к плате управления навесным оборудованием необходимую электронику (моторы, сервоприводы, концевики и т. д.).
  3. Написать программу для приема управляющих данных с Raspberry Pi и передачи данных обратной связи на Raspberry Pi по протоколу CAN-FD.
  4. Совместно с программистом убедиться, что ровер корректно выполняет функцию раскладывания солнечных панелей.

Требования:

  • Программный код должен находиться в одном скетче.
  • Сдача задания происходит совместно с заданием № 16 программиста.
  • Снять видео работы навесного оборудования.

Результаты, которые требуется представить:

  • Совместно с программистом продемонстрировать, что ровер корректно выполняет функцию раскладывания солнечных панелей.
  • Видео, которое сняла команда (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 3 день \(\rightarrow\) Электронщик).
  • Фотографию смонтированной платы управления с подключенной электроникой (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 3 день \(\rightarrow\) Электронщик).
  • Скетч для модуля в формате txt (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 3 день \(\rightarrow\) Электронщик).

Описание задач на настройку и программирование

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

Для работы с электроникой рекомендуется использовать следующие материалы:

  1. Инструкция по установке в автозагрузку утилиты can-utils:

    https://voltbro.gitbook.io/vbcores/vbcores-hardware/can-fd-raspberry-pi/nastroika-can-na-rpi.

    Обратите внимание на то, что используется протокол CAN-FD, поэтому внимательно прочитайте весь раздел и отметьте для себя разницу в командах для включения CAN и CAN-FD.

  2. Инструкция по работе с CAN-FD через Python:

    https://voltbro.gitbook.io/vbcores/vbcores-hardware/can-fd-raspberry-pi/rabota-s-can-fd-cherez-python.

    Примеры из этой инструкции можно взять с репозитория GitHub:

    https://github.com/VBCores/VBCoreG4_examples/tree/main/examples/python

  3. Инструкция к плате управления TurtleBoard: https://manual.turtlebro.ru/.
  4. Видеокурс по ROS: https://vkvideo.ru/playlist/-206862623_4.
Задачи для программистов для прохождения промежуточных тестовых испытаний

Результаты задач сдаются в зависимости от расписания сдачи промежуточных испытаний.

В случае сдачи задачи после установленного дедлайна, она будет оценена не более, чем в 50% установленных за задачу баллов.

Задание 10. Настройка CAN-FD на Raspberry Pi

Последовательность действий:

  1. Подключиться к роверу по протоколу SSH.
  2. Установить утилиту CAN-utils.
  3. Настроить автозапуск CAN-utils.
  4. Снять видео (или запись экрана) с запуском утилиты candump сразу после подключения по SSH к роверу.

Требования:

  • Следовать инструкции: https://voltbro.gitbook.io/vbcores/vbcores-hardware/can-fd-raspberry-pi/nastroika-can-na-rpi.
  • На видео, которое команда должна снять для подтверждения решения данной задачи, нужно продемонстрировать подключение к роверу по SSH и ввод команды candump can0, чтобы удостовериться, что CAN-utils установлен в автозапуск.
  • Видео надо снимать в разрешении достаточном для того, чтобы можно было прочитать команды в терминале.

Результаты, которые надо представить:

  • Продемонстрировать экспертам подключение к роверу по SSH и запуск команды candump can0.
  • Видео процесса, которое сняла команда (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 0 день \(\rightarrow\) Программист).

Задание 11. Управление ровером в режиме телеуправления

Последовательность действий:

  1. Разработать программу управления ровером через клавиатуру.
  2. Протестировать программу управления.
  3. Снять видео, как ровер реагирует на управление с клавиатуры с использованием написанной программы

Требования:

  • Запрещено использовать веб-интерфейс ровера.
  • Команда как минимум должна продемонстрировать движение ровера по прямой на расстояние не менее 1 м и поворот на месте или в движении на угол не менее 25°.
  • Видео надо снимать в разрешении достаточном для того, чтобы можно было разобрать, какую программу запускает команда и как происходит управление с клавиатуры.

Результаты, которые надо представить:

  • Продемонстрировать экспертам работу программы для управления ровером в режиме телеуправления;
  • Видео, которое сняла команда (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 1 день \(\rightarrow\) Программист);
  • Программный код в в формате txt (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 1 день \(\rightarrow\) Программист).

Задание 12. Тестирование базовой версии платы управления

Последовательность действий:

  1. Подключить, изготовленную электронщиком, базовую версию платы к панели управления питанием.
  2. Изучить тестовую программу передачи данных на модуль с ровера can_send.py: https://github.com/VBCores/VBCoreG4_examples/blob/main/examples/python/can_send.py.
  3. Изучить тестовую программу получения данных с модуля на ровер can_recv.py: https://github.com/VBCores/VBCoreG4_examples/blob/main/examples/python/can_recv.py.
  4. Внести изменения в скетч can_send.py — отправлять в CAN число 180.
  5. Объединить функционал двух тестовых программ в одну (can_send_recv.py).
  6. Запустить программу can_send_recv.py на ровере.
  7. Совместно с электронщиком удостовериться, что данные принимаются и передаются с ровера на модуль и обратно.

Требования:

  • Программный код для приема и передачи данных должен находиться в одной программе can_send_recv.py.
  • Совместная сдача с заданием № 5 электронщика.
  • Снять видео, как электронщик загружает тестовый скетч на модуль, программист запускает программу по приему/передаче данных на ровере и получает в терминал данные с модуля (число 90 и 3 любых байта), затем электронщик показывает получаемые данные в Serial Port (число 180).

Результаты, которые надо представить:

  • Совместно с электронщиком продемонстрировать, что с модуля и на модуль передаются тестовые данные.
  • Видео, которое сняла команда (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 1 день \(\rightarrow\) Программист);
  • Объединенный программный код can_send_recv.py в формате txt (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 1 день \(\rightarrow\) Программист).

Задание 13. Создание базового графического интерфейса управления ровером

Последовательность действий:

  1. Разработать программу управления перемещением ровера через клавиатуру (см. задание № 11).
  2. Разработать графический интерфейс управления ровером в котором будут:

    • индикаторы направления движения ровера;
    • слайдер регулировки линейной скорости;
    • слайдер регулировки угловой скорости;
    • индикатор текущей линейной скорости;
    • индикатор текущей угловой скорости;
    • индикатор текущей одометрии (\(X\) м, \(Y\) м, \(\theta °\));
    • индикатор нажатой кнопки на клавиатуре (по желанию);
    • отображение изображения с камеры/камер.
  3. Протестировать программу управления ровером совместно с графическим интерфейсом.
  4. Снять видео совместной работы программы управления с клавиатуры и графического интерфейса в связке с ровером.

Требования:

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

Результаты, которые надо представить:

  • Продемонстрировать экспертам работу программ для управления ровером в режиме телеуправления с графическим интерфейсом.
  • Видео, которое сняла команда (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 1 день \(\rightarrow\) Программист).
  • Программный код в в формате txt (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 1 день \(\rightarrow\) Программист).

Задание 14. Автономный выезд из посадочного модуля

Последовательность действий:

  1. Придумать алгоритм, при котором ровер будет реагировать на открывание дверцы модуля по камере.
  2. Разработать программу реагирования на открывание дверцы посадочного модуля.
  3. Разработать программу автономного выезда ровера из посадочного модуля при открытии дверцы.
  4. Протестировать программу автономного выезда ровера.
  5. Снять видео, как ровер автономно выезжает из модуля при открытии дверцы.

Требования:

  • Запрещено использовать телеуправление ровером, только автономный выезд.
  • Команда на видео должна продемонстрировать:

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

Результаты, которые надо представить:

  • Продемонстрировать экспертам работу программы для автономного выезда из модуля.
  • Видео, которое сняла команда (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 2 день \(\rightarrow\) Программист).
  • Программный код в формате txt (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 2 день \(\rightarrow\) Программист).

Задание 15. Разработка программы управления сервоприводом/мотором высокого уровня

Последовательность действий:

  1. Написать программу для отправки значения угла поворота для сервопривода/скорости (длительности) для мотора с Raspberry Pi плату управления навесным оборудованием по протоколу CAN-FD.
  2. Совместно с электронщиком удостовериться, что сервопривод/мотор работает корректно.

Требования:

  • Программный код должен находиться в одном файле.
  • Передача данных на исполняемый механизм должна происходить одним из следующих способов:

    • слайдером их графического интерфейса управлением ровера;
    • клавишами клавиатуры с отображением переданного числа в индикаторе графического интерфейса управлением ровера.
  • Сдача задания происходит совместно с заданием № 8 электронщика.
  • Снять видео о работе сервопривода/мотора.

Результаты, которые надо представить:

  • Совместно с электронщиком продемонстрировать, что программное обеспечение для управления сервоприводом/мотором работает.
  • Видео, которое сняла команда (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 2 день \(\rightarrow\) Программист).
  • Программный код в формате txt (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 2 день \(\rightarrow\) Программист).

Задание 16. Разработка программы верхнего уровня для раскладывания солнечных панелей

Последовательность действий:

  1. Добавить необходимые элементы управления/отображения в графический интерфейс/программу управления с клавиатуры.
  2. Написать программу для отправки управляющих данных с Raspberry Pi и приему данных обратной связи на Raspberry Pi по протоколу CAN-FD.
  3. Совместно с электронщиком удостовериться, что ровер корректно выполняет функцию раскладывания солнечных панелей.

Требования:

  • Программный код может находиться в нескольких файлах;
  • Графический интерфейс управления ровером должен содержать:

    • индикаторы направления движения ровера;
    • слайдер регулировки линейной скорости;
    • слайдер регулировки угловой скорости;
    • индикатор текущей линейной скорости;
    • индикатор текущей угловой скорости;
    • индикатор текущей одометрии (\(X\) м, \(Y\) м, \(\theta °\));
    • индикатор нажатой кнопки на клавиатуре (по желанию);
    • отображение изображения с камеры/камер;
    • элементы управления исполнительными механизмами или индикаторы состояния исполнительных механизмов (если управление исполнительными механизмами происходит с клавиатуры).
  • Сдача задания происходит совместно с заданием № 9 электронщика.
  • Снять видео о работе навесного оборудования и управления ровером.

Результаты, которые надо представить:

  • Совместно с электронщиком продемонстрировать, что ровер корректно выполняет функцию раскладывания солнечных панелей.
  • Видео, которое сняла команда (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 3 день \(\rightarrow\) Программист).
  • Программу/программы в формате txt (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 3 день \(\rightarrow\) Программист).
Финальное испытание. Детальное описание задания

На выполнение финального испытания каждой команде отводится 15 мин. К финальному испытанию допускаются только те команды, которые прошли по критериям прохождения.

Детальное описание задания

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

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

Критерии выполнения

Задание считается выполненным полностью, если:

  • весь заезд длился не более 15 мин;
  • ровер автономно выехал из зоны Посадочного модуля без потери контроля и без вмешательства участника на полигоне;
  • команда участников в режиме телеуправления разложила комплект солнечных батарей в зоне Развертывания;
  • команда участников в режиме телеуправления вернула ровер в зону Посадочного модуля;
  • команда участников ни разу физически не вмешивалась в работу ровера.

Задание считается выполненным частично, если не выполнен хотя бы один из вышеперечисленных критериев.

Задание считается невыполненным, если не выполнен ни один из вышеперечисленных критериев.

Порядок выполнения финального испытания:

  1. Команда выбирает одного человека, который будет находиться с ровером и организаторами на полигоне, остальные участники удаляются в центр управления ровером (ЦУР).
  2. Участник, оставшийся на полигоне, готовит ровер к старту:

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

    После того как ровер подготовлен, участник подает сигнал экспертам, что ровер готов к испытанию.

  3. В это время участники в ЦУР готовят ноутбук/ровера к испытанию: подключаются к роверу, загружают программу и т. д.
  4. Организаторы передают участнику в ЦУР координаты расположения зоны Развертывания относительно точки старта зоны Посадочного модуля.
  5. Как только от участника с полигона приходит команда о готовности ровера, эксперты запускают обратный отсчет времени, а участники в ЦУР запускают работу ровера (автономный выезд из зоны Посадочного модуля).
  6. Открывается дверца Посадочного модуля.

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

    • нажимает кнопку аварийной остановки на ровере.
    • выставляет его в зону старта зоны Навигации.
    • отжимает кнопку аварийной остановки.

    После этого команда имеет право продолжить заезд в режиме телеуправления.

  7. Как только ровер доезжает до конца зоны Посадочного модуля, участники в ЦУР могут загрузить программу для управления вручную/переключиться на управление вручную и выполнять оставшуюся часть задания.
  8. По истечению времени заезда ровер принудительно останавливается на полигоне экспертами.

Во время финального испытания запрещено:

  1. Дописывать программный код во время выполнения задания на полигоне.
  2. Физически вмешиваться в работу ровера на полигоне, не считая команды экспертов или случаев потери контроля над ровером.
  3. Использовать веб-интерфейс ровера.

Количество попыток на сдачу финальных полигонных испытаний ограничено — 2 попытки. При взятии новой попытки количество баллов в ней уменьшается на 10%.

Новая попытка начинается из той зоны, в которой была закончена предыдущая попытка, например:

  1. Ровер застрял в зоне Навигации, и команда решила взять вторую попытку — значит, эта попытка начинается со старта зоны Навигации.
  2. Команда потеряла управление ровером в зоне Развертывания — в таком случае, если комплект солнечных батарей был разложен, то он загружается обратно на ровер. Ровер выставляется в старт зоны Развертывания.
Система оценивания
Предварительные испытания Макс. балл 1-й день испытаний 2-й день испытаний 3-й день испытаний Итоговый балл
Результаты работы первого дня 45,00
Задание № 3. Продемонстрирована оформленная схема подключения компонентов в электронном виде 2,00 2,00
Задание № 3. В файловом хранилище команды представлена оформленная схема подключения компонентов в электронном виде 1,00 1,00
Задание № 10. Продемонстрировано экспертам подключение к роверу по SSH и запуск команды candump can0 2,00 2,00
Задание № 10. Видео представлено в файловом хранилище команды 1,00 1,00
Задание № 4. Продемонстрирована экспертам изготовленная базовая версия платы управления 3,00 3,00
Задание № 4. Фотография изготовленной платы представлена в файловом хранилище команды 1,00 1,00
Задание № 5. Продемонстрировано получение данных (число 180) в Serial Port модуля и отправку на ровер данных (число 90 и 3 любых байта) по протоколу CAN-FD 5,00 5,00
Задание № 5. Видео тестирования модуля представлено в файловом хранилище команды 1,00 1,00
Задание № 5. Файл в формате txt с программным кодом представлен в файловом хранилище 1,00 1,00
Задание № 6. Продемонстрирована оформленная схема подключения компонентов в электронном виде 2,00 2,00
Задание № 6. В файловом хранилище команды представлена оформленная схема подключения компонентов в электронном виде 1,00 1,00
Задание № 11. Продемонстрировано, как ровер реагирует на клавиши проезда вперед/назад и проезжает не менее 1 м 2,00 2,00
Задание № 11. Продемонстрировано, как ровер реагирует на клавиши поворота влево/вправо и поворачивает на угол не менее 25° 2,00 2,00
Задание № 11. Видео представлено в файловом хранилище команды 1,00 1,00
Задание № 11. Файл в формате txt с программным кодом представлен в файловом хранилище 1,00 1,00
Задание № 12. Продемонстрировано экспертам, что с модуля принимаются данные и выводятся в терминал (число 90 и 3 любых байта) и передаются на модуль данные (число 180) по протоколу CAN-FD 5,00 5,00
Задание № 12. Видео представлено в файловом хранилище команды 1,00 1,00
Задание № 12. Файл в формате txt с программным кодом представлен в файловом хранилище 1,00 1,00
Задание № 13. Продемонстрирована экспертам работа программы для управления ровером в режиме телеуправления с графическим интерфейсом 5,00 5,00
Задание № 13. В графическом интерфейсе присутствует не менее шести элементов из списка. 5,00 5,00
Задание № 13. Видео представлено в файловом хранилище команды 1,00 1,00
Задание № 13. Файл в формате txt с программным кодом представлен в файловом хранилище 1,00 1,00
Штрафы 0,00
Итого 45,00 45,00
Результаты работы второго дня 45,00
Задание № 7. Продемонстрирована экспертам изготовленная плата управления навесным оборудованием 5,00 5,00
Задание № 7. Фотография изготовленной платы представлена в файловом хранилище команды 1,00 1,00
Задание № 8. Продемонстрирована экспертам работоспособность программы нижнего уровня для управления сервоприводом/мотором 8,00 8,00
Задание № 8. Видео представлено в файловом хранилище команды 1,00 1,00
Задание № 8. Файл в формате txt с программным кодом представлен в файловом хранилище 1,00 1,00
Задание № 14. Продемонстрирована экспертам работа программы для автономного выезда из модуля 8,00 8,00
Задание № 14. Видео представлено в файловом хранилище команды 1,00 1,00
Задание № 14. Файл в формате txt с программным кодом представлен в файловом хранилище 1,00 1,00
Задание № 15. Продемонстрирована экспертам работоспособность программы в уровня для управления сервоприводом/мотором 7,00 7,00
Задание № 15. Видео представлено в файловом хранилище команды 1,00 1,00
Задание № 15. Файл в формате txt с программным кодом представлен в файловом хранилище 1,00 1,00
Использование дополнительных датчиков при автономном выезде из модуля 10,00 10,00
Штрафы 0,00
Итого 45,00 45,00
Результаты работы третьего дня 60,00
Задание № 1. В файловом хранилище представлена презентация сборки навесного оборудования, включающая в себя: скриншоты сборки (в трех проекциях), фотографии реальной сборки (в трех проекциях) 10,00 10,00
Задание № 1. Продемонстрировано смонтированное на ровер навесное оборудование 10,00 10,00
Задание № 1. В файловом хранилище представлены чертежи для лазерной резки в файлах/модели для печати на 3D-принтере 3,00 3,00
Задание № 9. Продемонстрирована экспертам работоспособность программы нижнего уровня для управления раскладывания солнечных панелей 16,00 16,00
Задание № 9. Фотография смонтированной платы управления с подключенной электроникой представлена в файловом хранилище команды 1,00 1,00
Задание № 9. Видео представлено в файловом хранилище команды 1,00 1,00
Задание № 9. Файл с программным кодом представлен в файловом хранилище 1,00 1,00
Задание № 16. Продемонстрирована экспертам работоспособность программы верхнего уровня для управления раскладывания солнечных панелей 16,00 16,00
Задание № 16. Видео представлено в файловом хранилище команды 1,00 1,00
Задание № 16. Файл с программным кодом представлен в файловом хранилище 1,00 1,00
Штрафы 0,00
Итого 60,00 60,00
Итого за все предварительные испытания 150,00 150,00
Финальные испытания Макс. балл Номер попытки Итоговый балл
1 2
В зоне Посадочного модуля
Ровер начал движение в зоне Посадочного модуля в автономном режиме только после открытия крышки 20,00 20,00
Ровер переместился в зону Навигации 5,00 5,00
Бонус. Ровер использовал дополнительные датчики для определения открытия крышки 10,00 10,00
В зоне Навигации
Ровер начал движение в зоне Навигации в режиме телеуправления 15,00 15,00
Во время проезда по зоне Навигации комплект солнечных батарей не касался пола 5,00 5,00
Ровер переместился в зону Развертывания 10,00 10,00
В зоне Развертывания
Ровер начал движение в зоне Развертывания в режиме телеуправления 5,00 5,00
Ровер произвел развертку комплекта солнечных батарей: 0,00
в правильных координатах 40,00 40,00
в корректном положении (лицевой стороной вверх) 40,00 0,00
без изгибов 50,00 0,00
Количество правильно выгруженных панелей 18,00 14,00
По завершению развертки ровер переместился обратно в зону Посадочного модуля 15,00 0,00
Во время финального заезда от ровера и навесного оборудования не отвалилась ни одна деталь (винты, гайки и прочее) 17,00 17,00
Команда выполнила задание полностью 50,00 0,00
Штраф 0,00
Итого 300,00 141,00
141,00

 

Решение задачи
Презентация разработанного навесного оборудования с фотографиями

Рис. 7.1. 3D-модель. Вид спереди

Рис. 7.2. Фото. Вид спереди

Рис. 7.3. 3D-модель. Вид сбоку

Рис. 7.4. Фото. Вид сбоку

Рис. 7.5. 3D-модель. Вид сверху

Рис. 7.6. Фото. Вид сверху

Видео финального заезда: https://disk.yandex.ru/d/eN6uHundnLgRVg/SpacEnergy.mp4.

Полное решение всех подзадач по дням: https://disk.yandex.ru/d/eN6uHundnLgRVg/SpacEnergy/.

Код для выполнения задачи в зоне посадочного модуля

Python
#!/usr/bin/env python3

import rospy
from geometry_msgs.msg import Twist
import time
import can
import struct

SCANNER_MSG_ID = 0x12
SCANNER_MIN_DIST = 30
TIME_TRAVELING = 6

def tuple_to_twist(t: tuple) -> Twist:
    msg = Twist()

    t = list(t)
    while len(t) < 6:
        t.append(0)

    msg.linear.x = t[0]
    msg.linear.y = t[1]
    msg.linear.z = t[2]
    msg.angular.x = t[3]
    msg.angular.y = t[4]
    msg.angular.z = t[5]

    return msg


rospy.init_node('waiter', anonymous=True)

vel_pub = rospy.Publisher('cmd_vel', Twist, queue_size=1)
can0 = can.interface.Bus(channel = 'can0', interface = 'socketcan', fd=True)

print("START")

while 1:
    msg = can0.recv(timeout=1)
    print('ura')

    if msg and msg.arbitration_id == SCANNER_MSG_ID:
         data = msg.data[0]
         if data >= SCANNER_MIN_DIST:
             print('lego', data)
             break
         print(data)
    else:
        print(msg)

    time.sleep(0.1)

    data = bytearray(struct.pack("f", 2.5))
    msg_to_send = can.Message(arbitration_id=0x42, data = data)
    can0.send(msg_to_send)
    time.sleep(1)
    print("sent", msg_to_send)


can0.shutdown()

time.sleep(3)

#vel_pub.publish(tuple_to_twist((0.3,)))
print("TRAVELING")
time.sleep(TIME_TRAVELING)
#vel_pub.publish(tuple_to_twist((0,)))

print("DONE")

Код для управления ровером и навесным оборудованием в режиме телеуправления для высокого уровня

Python
#!/usr/bin/env python3

import sys
import threading
import termios
import tty
from select import select
from geometry_msgs.msg import Twist
from std_msgs.msg import String, Float64
import rospy
import can
import struct
import time


def tuple_to_twist(t: tuple, lin_vel: float, ang_vel) -> Twist:
    msg = Twist()

    t = list(t)
    while len(t) < 6:
        t.append(0)

    msg.linear.x = t[0] * lin_vel
    msg.linear.y = t[1] * lin_vel
    msg.linear.z = t[2] * lin_vel
    msg.angular.x = t[3] * ang_vel
    msg.angular.y = t[4] * ang_vel
    msg.angular.z = t[5] * ang_vel

    return msg

def servo_to_msg(id, data):
    data = bytearray(struct.pack("<i", data))
    msg_to_send = can.Message(arbitration_id=id, data = data)

    return msg_to_send
   
def getKey(settings, timeout):
    tty.setraw(sys.stdin.fileno())
    # sys.stdin.read() returns a string on Linux
    rlist, _, _ = select([sys.stdin], [], [], timeout)
    if rlist:
        key = sys.stdin.read(1)
    else:
        key = ''
    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)
    return key

def saveTerminalSettings():
    return termios.tcgetattr(sys.stdin)

def restoreTerminalSettings(old_settings):
    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_settings)

MOVING = {
    'u': (),
    'i': (1,),
    'o': (),
    'j': (0,0,0,0,0,1),
    ',': (), # stop
    '': (), # stop
    'l': (0,0,0,0,0,-1),
    'm': (),
    'k': (-1,),
    '.': ()
}

SERVO = {
    'q': (52,+1),
    'w': (52,-1),
    'a': (68,+1),
    's': (68,-1),
    'e': (60,+1),
    'r': (60,-1),
    'd': (20,+1),
    'f': (20,-1),
}

SERVO_360 = {
    'z': (63, +1),
    'x': (63, +2),
    'c': (34, +1),
    'v': (34, +2),
}

class SigmaNode:
    def __init__(self, *args, **kwargs) -> None:
        self.vel_cmd_pub = rospy.Publisher('cmd_vel', Twist, queue_size=1)
        self.key_pressed_pub = rospy.Publisher('key_pressed', String, queue_size=1)
        self.lin_vel_sub = rospy.Subscriber('lin_vel_k', Float64, self.update_lin_vel)
        self.ang_vel_sub = rospy.Subscriber('ang_vel_k', Float64, self.update_ang_vel)
        self.canbus = can.interface.Bus(channel = 'can0', interface = 'socketcan', fd=True)

        self.done = False
        self.lin_vel = 0.1
        self.ang_vel = 0.1
        self.serv_curr = {52:70,68:70,60:70,20:70}
        self.serv_vel = 1
        self.rate = rospy.Rate(10) # 10hz

    def update_lin_vel(self, vel):
        self.lin_vel = vel.data

    def update_ang_vel(self, vel):
        self.ang_vel = vel.data

    def stop(self):
        self.canbus.shutdown()
        self.done = True

    def run(self):
        settings = saveTerminalSettings()

        while not self.done:
            key = getKey(settings, TIMEOUT)

            if key == '-':
                self.stop()

            move = MOVING.get(key, ())
            self.key_pressed_pub.publish(key)
            twist = tuple_to_twist(move, self.lin_vel, self.ang_vel)
            self.vel_cmd_pub.publish(twist)

            if key in SERVO:
                servo_num, speed = SERVO[key]

                new_angle = max(0, min(self.serv_curr[servo_num] + speed * self.serv_vel, 179))
                self.serv_curr[servo_num] = new_angle

                msg = servo_to_msg(servo_num, new_angle)
                #print(msg)
                self.canbus.send(msg)

            move_id, move_val = SERVO_360.get(key, (-1, -1))
            for i in [63, 34]:
                data = bytearray(struct.pack("<i", (move_val if i == move_id else 0)))
                msg = can.Message(arbitration_id=i, data = data)
                #print(msg)
                self.canbus.send(msg)

            #self.rate.sleep()

        self.stop()

TIMEOUT = 1/10
rospy.init_node('telepop')
n = SigmaNode()

n.run()


“Подключение второй камеры”

#!/usr/bin/env python3

from geometry_msgs.msg import Twist
from std_msgs.msg import String, Float64
from sensor_msgs.msg import CompressedImage, Image
import numpy as np
import cv2
import rospy


class LigmaNode:
    def __init__(self, *args, **kwargs) -> None:
        self.cam0pub = rospy.Publisher('cam0', CompressedImage, queue_size=1)
        self.cap0 = cv2.VideoCapture(2)
        self.cap0.set(3,640)
        self.cap0.set(4,480)
        self.rate = rospy.Rate(100)
        self.done = False

    def stop(self):
        self.done = True

    def run(self):
        while not self.done and not rospy.is_shutdown():
            ret0, frame0 = self.cap0.read()

            if not ret0:
                continue

            #frame0 = cv2.rotate(frame0, cv2.ROTATE_180)

            frame_msg = CompressedImage()
            frame_msg.header.stamp = rospy.Time.now()
            frame_msg.format = "jpeg"
            frame_msg.data = np.array(cv2.imencode('.jpg', frame0)[1]).tostring()
            self.cam0pub.publish(frame_msg)

            self.rate.sleep()
       
        self.done = True

        self.stop()

rospy.init_node('camera_cv')
n = LigmaNode()

n.run()

Код для управления навесным оборудованием в режиме телеуправления низкого уровня

Python
/*new*/
#include <VBCoreG4_arduino_system.h>
#include <Servo.h>
#include <NewPing.h>

Servo servo_1;
Servo servo_2;
Servo servo_3;
Servo servo_4;
Servo servo_5;
Servo servo_6;

#define trig PC0
#define echo PC1
#define servo_1_pin PB0
#define servo_2_pin PA7
#define servo_3_pin PA6
#define servo_4_pin PA4
#define servo_5_pin PC3
#define servo_6_pin PC2


uint8_t data[4] = {1, 0, 0, 0};
unsigned long t;

FDCAN_HandleTypeDef*  hfdcan1;
CanFD* canfd;
FDCAN_TxHeaderTypeDef TxHeader;

NewPing sonar(trig, echo, 255);

void setup() {
  Serial.begin(115200);

  /*system_settings*/
  SystemClock_Config();

  /*init pins*/
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);
  servo_1.attach(servo_1_pin);
  servo_2.attach(servo_2_pin);
  servo_3.attach(servo_3_pin);
  servo_4.attach(servo_4_pin);
  servo_5.attach(servo_5_pin);
  servo_6.attach(servo_6_pin);


  /*init canfd*/
  canfd = new CanFD();  
  canfd->init();
  canfd->write_default_params();  
  canfd->apply_config();  
  hfdcan1 = canfd->get_hfdcan();
  canfd->default_start();

  /*header the sender*/
  TxHeader.Identifier = 0x12;
  TxHeader.DataLength = FDCAN_DLC_BYTES_4;
  TxHeader.IdType = FDCAN_EXTENDED_ID;
  Serial.begin(115200);

}

uint8_t servo_n[4] = {70,70,70,0}; //changing

int left = 1000;
int stop = 1500;
int right = 2000;

bool flags[4] = {false, false, false, false}; //5_left, 5_right, 6_left, 6_right

void loop() {
  servo_1.write(servo_n[0]);
  servo_2.write(servo_n[1]);
  servo_3.write(servo_n[2]);
  if (flags[0]){servo_5.writeMicroseconds(left); delay(100);}
  else if (flags[1]){servo_5.writeMicroseconds(right);delay(100);}
  else {servo_5.writeMicroseconds(stop);}
  if (flags[2]){servo_6.writeMicroseconds(left);delay(100);}
  else if (flags[3]){servo_6.writeMicroseconds(right); delay(100);}
  else {servo_6.writeMicroseconds(stop);}
  get_can();
  delay(20);
}


void get_can(){
  while(HAL_FDCAN_GetRxFifoFillLevel(hfdcan1, FDCAN_RX_FIFO0) > 0 ) {
    FDCAN_RxHeaderTypeDef Header;
    uint8_t RxData[1];
    if (HAL_FDCAN_GetRxMessage(hfdcan1, FDCAN_RX_FIFO0, &Header, RxData) != HAL_OK){ Error_Handler(); }  
    else {
      uint8_t ident = Header.Identifier;
      if (ident == 52 || ident==68 || ident==60 || ident==20 || ident==42){
        switch(ident){
          case 52:
            servo_n[0]=RxData[0];
            break;
          case 68:
            servo_n[1]=RxData[0];
            break;
          case 60:
            servo_n[2]=RxData[0];
            break;
          case 20:
            servo_n[3]=RxData[0];
            break;
          case 42:
            data[0] = sonar.ping_cm();
            if (data[0]==0){
              data[0]=50;
            }
            delay(50);
            send_can();
            break;
        }
      } else if (ident==63 || ident==34){
        if (ident==63){
          if (RxData[0]==1){
            flags[0]=true;
          } else if (RxData[0]==2){
            flags[1]=true;
          } else {
            flags[0]=false;
            flags[1]=false;
          }
        }
        if (ident==34){
          if (RxData[0]==1){
            flags[2]=true;
          } else if (RxData[0]==2){
            flags[3]=true;
          } else {
            flags[2]=false;
            flags[3]=false;
          }
        }
      }
    }
  }
}

void send_can(){
  if (HAL_FDCAN_GetTxFifoFreeLevel(hfdcan1) != 0){
    if (HAL_FDCAN_AddMessageToTxFifoQ(hfdcan1, &TxHeader, data) != HAL_OK){Error_Handler();}
  }
}

Схемы/фотографии подключения электрических компонентов к роверу и изготовленной электроники

Рис. 7.7.

Рис. 7.8.

Рис. 7.9.

Материалы для подготовки

Для работы с электроникой рекомендуется использовать следующие материалы:

  1. Инструкция по установке в автозагрузку утилиты can-utils:

    https://voltbro.gitbook.io/vbcores/vbcores-hardware/can-fd-raspberry-pi/nastroika-can-na-rpi.

  2. Инструкция по работе с CAN-FD через Python:

    https://voltbro.gitbook.io/vbcores/vbcores-hardware/can-fd-raspberry-pi/rabota-s-can-fd-cherez-python.

    Примеры из этой инструкции вы можете взять с репозитория GitHub:

    https://github.com/VBCores/VBCoreG4_examples/tree/main/examples/python.

  3. Инструкция к плате управления TurtleBoard:

    https://manual.turtlebro.ru/.

  4. Курс по ROS:

    https://voltbro.gitbook.io/new_bazovyi-kurs-po-ros.

  5. Видеокурс по ROS:

    https://vkvideo.ru/playlist/-206862623_4.

text slider background image text slider background image
text slider background image text slider background image text slider background image text slider background image