Инженерный тур. 3 этап
В рамках командного тура заключительного этапа профиля Аэрокосмические системы 2025 г. командам необходимо разработать дополнительное оборудование (далее — навесное оборудование (НО)) и программное обеспечение для космического ровера для решения задачи развертывания солнечных панелей на неизвестной местности.
Для управления космической миссией на другой планете участникам следует использовать как элементы автономного управления, так и телеуправление без прямой видимости по внешней сенсорике ровера.
Команда участников должна запрограммировать космический ровер, чтобы аппарат:
- произвел выезд из посадочного модуля в автономном режиме;
- осуществил полет до местности, заданной координатами, в режиме телеуправления;
- произвел развертывание солнечных панелей;
- вернулся в посадочный модуль.
На полигоне финального испытания ровер, запрограммированный командой участников, должен пройти через три зоны и в каждой выполнить свою миссию.
В первой зоне (зона посадочного модуля) необходимо в полностью автономном режиме осуществить выезд ровером из закрытого посадочного модуля при открытии дверцы. Для управления ровером в этой зоне команда должна написать соответствующий алгоритм, который в полностью автоматическом режиме без участия человека будет управлять перемещениями ровера.
Во второй зоне (зона навигации) следует в режиме телеуправления без прямой видимости совершить проезд от посадочного модуля до зоны развертывания, которая будет задана командам координатами перед стартом миссии. Здесь могут располагаться как статические, так и динамические препятствия, а также искусственные неровности. Для управления ровером в этой зоне команда должна написать программный код для управления перемещениями ровера и НО в режиме телеуправления (управление с клавиатуры).
В третьей зоне (зона развертывания) надо осуществить раскладывание (развертку) загруженных в ровер солнечных батарей с помощью НО в точке, координаты которой будут выданы командам перед стартом миссии. После окончания развертки необходимо вернуться в посадочный модуль. Для управления ровером в этой зоне команда должна написать программный код для управления перемещениями ровера и НО в режиме телеуправления (управление с клавиатуры).
Во время выполнения финальной задачи участники не имеют визуального контакта с ровером.
Команда получает оценку за совокупность решений различных испытаний и может выбирать любой подход к программированию, настройке ровера и изготовлению полезной нагрузки.
Вечер в лаборатории начинался с тишины, которую нарушало только гудение серверов и негромкое шуршание бумаг в углу, где конструктор Аркадий перебирал чертежи. Просторное помещение, уставленное приборами, паяльниками и компьютерами, было штабом их небольшой группы. Сегодняшняя задача казалась почти невыполнимой: спроектировать и интегрировать манипулятор для ровера, которому вскоре предстоит стать первым шагом человечества к освоению новой планеты.
— Вы уверены, что ровер выдержит дополнительные нагрузки? — голос программиста Севы прозвучал из-за экрана ноутбука. Его лицо отражало смесь усталости и скептицизма. — Я проверил все расчеты, и даже минимальное отклонение от центра масс может... ну, вы поняли.
— Сева, ты слишком переживаешь, — ответил Аркадий, не отрываясь от чертежей. — Я предусмотрел контрбаланс. Если правильно распределим вес, все будет работать идеально.
— Главное, чтобы твое «идеально» не превратилось в «хоть как-то», — вставил электронщик Илья, держа в руках микроконтроллерный модуль VBCore VB32G4. Его привычка поддевать коллег на грани сарказма давно стала неотъемлемой частью работы команды. — Я тут подготовил схему для подключения приводов манипулятора. Но если ваши расчеты окажутся неверными, мне придется чинить обломки прямо на месте.
— У нас нет права на ошибку, — тихо, но твердо сказал Аркадий. — Вы же понимаете, что от этой миссии зависит судьба всей экспедиции. Если ровер не развернет солнечные панели, колонизаторам не хватит энергии для строительства базы.
Все замолчали. Сева вернулся к своему коду, погружаясь в проверку алгоритмов навигации и управления манипулятором. Илья переключился на паяльник, подгоняя контакты для новой платы. Аркадий, наконец, закончил с чертежами и начал собирать прототип из пластиковых деталей.
На следующий день команда собралась вокруг рабочего стола. Прототип манипулятора, похожий на странное механическое щупальце, крепился к уменьшенной копии ровера.
— Окей, — сказал Сева, глядя на монитор с потоком данных. — Загружаю тестовый сценарий. Первое задание: открыть виртуальный люк и проверить, работает ли механизм захвата. Аркадий, держи пальцы скрещенными.
Манипулятор медленно пришел в движение. Щелчки сервоприводов наполняли помещение. Металлические «пальцы» коснулись панели и аккуратно повернули ее. На экране загорелась надпись: «Доступ открыт».
— Пока что без сюрпризов, — прокомментировал Илья, скрывая улыбку. — Теперь найдите зону развертывания.
Сева активировал следующий этап. Ровер, используя встроенные датчики, начал искать заданные координаты. Через несколько минут экран показал виртуальный ландшафт и отметку, соответствующую зоне развертывания.
— Теперь самое сложное, — сказал Аркадий. — Разворачиваем панель.
Манипулятор поднял барабан с солнечными панелями. Медленно, но верно, механизм начал раскладывать конструкцию. Тишину в комнате нарушал только тихий скрип шестеренок. Наконец, панели были установлены.
— Готово, — выдохнул Сева, снимая наушники. — Если этот сценарий работает на тестовом уровне, значит, мы на верном пути.
— На тестовых испытаниях все всегда работает, — пробормотал Илья. — Посмотрим, что будет, когда ровер окажется в реальных условиях.
Они знали, что впереди еще много ночей, полных расчетов, споров и сомнений. Но в этот момент все трое чувствовали: их маленький шаг приблизил человечество к звездам.
А какую инженерную историю можете написать вы?
Команда состоит из трех участников, обладающих следующими компетенциями:
- электронщик: отвечает за разработку электрической принципиальной схемы и изготовление электрической «начинки» навесного оборудования; имеет знания в области программирования этой электроники на нижнем уровне;
- конструктор-моделист: отвечает за разработку и сборку конструкции навесного оборудования, а также за поддержание ее работоспособности;
- программист: отвечает за разработку программной части работы ровера и навесного оборудования, а также протоколов передачи данных между ноутбуком и роботом.
Предполагается, что участники внутри команды определят для себя роли:
- капитан команды: обеспечивает общее руководство командой, следит за выполнением этапов работы, ведет переговоры с организаторами;
- оператор ровера: непосредственно управляет ровером на финальном испытании.
- лабораторная зона с 3D-принтерами и паяльными местами;
- рабочие места для сборки и программирования;
- полигон;
- ноутбук/компьютер.
- ровер под управлением Robot Operating System (ROS);
- набор электронных модулей;
- набор крепежа и расходных материалов;
- набор ручного инструмента;
- онлайн-документация по соревнованию и оборудованию;
- облачное хранилище для размещения результатов работы.
Перечислено только специфическое программное обеспечение, предполагается наличие стандартного ПО:
- Windows 10/11 / Ubuntu 20.04;
- «Компас-3D»;
- PDF-ридер;
- Arduino IDE;
- STM32CubeProgrammer.
Полигон представляет собой пространство размерами примерно \(5 \times 20\) м, ограниченное разметкой по зонам выполнения задач, а также различными элементами препятствий.
- Первая зона или зона посадочного модуля: здесь расположены стартовая зона, интерактивный посадочный модуль и зона въезда во вторую зону; зоны выделены напольной разметкой немногим больше посадочного модуля.
- Вторая зона или зона навигации: здесь расположен лабиринт навигации, искусственные неровности и различные препятствия, которые могут быть как статичными, так и динамическими.
- Третья зона или зона развертывания: здесь необходимо развернуть солнечные батареи.
Для решения задачи финала каждой команде выдается база ровера-планетохода.
Общие рекомендации по управлению и программированию ровера и его полезной нагрузки: http://learn.voltbro.ru.
При проверке работоспособности, настройке и программировании ровера рекомендуется пользоваться инструкцией: https://manual.turtlebro.ru/.
Экосистема электронных модулей VBCores включает в себя микроконтроллерный модуль и ряд функциональных плат. Все платы рассчитаны на рабочее напряжение до 50 В, что позволяет работать с достаточно мощными устройствами.
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 мм.
Плата позволяет работать на микрокомпьютере Raspberry PI с шинами CAN и CAN FD. Кроме того, плата содержит преобразователь питания для работы микрокомпьютера от внешних источников напряжением от 6 до 50 вольт. Также существует возможность измерения входного питания (например чтобы контролировать заряд батареи).
Команде необходимо разработать механизм, позволяющий оператору робота-планетохода осуществлять развертку комплекта солнечных батарей.
Следует продумать, какие возможности управления будут у оператора планетохода, и оснастить робота камерой/камерами с подходящими зонами обзора.
Ровер-планетоход, для которого необходимо разработать механизм, представлен на чертеже (рис. 5.1).
Схематичное изображение ключевых элементов не является изображением полигона. Робот должен уметь определять момент открытия дверцы посадочного модуля, преодолевать препятствия, а также развертывать комплект солнечных батарей. Может быть оценено как полное, так и частичное выполнение задания.
Перед началом сдачи финального задания необходимо поместить космический ровер с навесным оборудованием внутрь посадочного модуля и закрыть дверцу.
Ровер должен полностью помещаться внутри посадочного модуля.
В качестве комплекта солнечных батарей выступают 18 соединенных между собой модулей реальных солнечных батарей. Задача участников: предусмотреть место крепления комплекта солнечных батарей на ровере, так как он должен быть загружен на ровер до начала финального заезда.
Список доступных компонентов и крепежа (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 и Т-гайки. Крепление осуществляется по центру желоба профиля.
- На ровере не должно оставаться открытых панелей после завершения работы.
- Механизм не должен пересекаться с блоком электроники (отмечено красным на модели ровера).
- Все элементы между собой должны скрепляться с использованием предоставленного крепежа — обратите внимание, что клея нет. Можно использовать двухсторонний скотч (в основном для склеивания плоских поверхностей).
Навесное оборудование планетохода должно удовлетворять следующим критериям:
- позволять размещать комплект солнечных батарей;
- позволять размещаться роверу в посадочном модуле полностью;
- позволять осуществлять перемещение с комплектом солнечных батарей;
- позволять осуществлять развертывание комплекта солнечных батарей на ровную поверхность;
- на ровер должны быть установлены камеры для работы оператора (максимум две); в рабочем режиме у участников нет визуального контакта с ровером;
- должен быть обеспечен обзор достаточный для управления перемещением робота;
- использовать минимальное возможное число приводов и деталей.
Разработанная конструкция (модель) должна представлять собой изделие, которое можно собрать на практике, используя перечисленные ниже доступные на площадке компоненты и оборудование.
Для 3D-печати необходимо предоставить модель в формате STL. Время печати первой детали не должно превышать 30 мин.
Для лазерной резки необходимо предоставить файл в формате DXF и чертеж с указанием контрольных размеров. В файле DXF не должно быть ничего, кроме контура реза. Файлы с лишними элементами будут возвращаться на доработку. Станок лазерной резки работает на основе программы CorelDraw 2020 — все DXF файлы будут импортироваться в эту программу.
Внимание! Сдача чертежей на изготовление деталей методом лазерной резки происходит четыре раза.
Заранее убедитесь, что модель корректно экспортируется. Наиболее часто проблемы встречаются при экспорте из «Компас-3D».
Обратите внимание:
- линии должны быть одинарными (иногда одинаковые линии наложены друг на друга много раз);
DXF-файл не должен содержать ничего, кроме контура реза — часто остаются рамки, вспомогательные линии и цифры; станок это будет пытаться безуспешно интерпретировать в линию реза;- чтобы гарантированно получить правильную деталь, прикладывайте оформленный чертеж в
pdf-файл с несколькими контрольными размерами; - потеря масштаба — частая проблема.
Результаты задач сдаются в зависимости от расписания сдачи промежуточных испытаний.
В случае сдачи задачи после установленного дедлайна, она будет оценена не более, чем в 50% установленных за задачу баллов.
Последовательность действий:
- Согласовать с командой стратегию, по которой будет происходить развертывание комплекта солнечных батарей.
- Разработать 3D-модель навесного оборудования.
- Изготовить навесное оборудование и смонтировать на планетоход.
Требования:: см. требования к навесному оборудованию.
Результаты, которые надо представить:
Презентация сборки навесного оборудования (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 3 день \(\rightarrow\) Конструктор \(\rightarrow\) презентация) в составе:
- скриншот сборки навесного оборудования в CAD на ровере в трех проекциях (спереди, сбоку и сверху) и в изометрической проекции, показывающей модуль наилучшим способом;
- фотографии в трех проекциях (спереди, сбоку и сверху) и в изометрической проекции, показывающей навесное оборудование наилучшим способом;
- формат файла —
PDF; - имя файла: название команды (латинскими буквами); пример:
Iskorka.pdf.
- Продемонстрировать экспертам собранное навесное оборудование на ровере согласно присланной презентации.
Последовательность действий:
- Согласовать с командой стратегию, по которой будет происходить развертывание комплекта солнечных батарей.
- Разработать
STL-файлы для печати на 3D-принтере (при необходимости) иDFX-чертежи для лазерной резки (при необходимости). - Сдать файлы на изготовление.
- Изготовить навесное оборудование и смонтировать на планетоход.
Требования:: см. требования к файлам на изготовление.
Результаты, которые требуется представить
- Чертежи для лазерной резки в файлах/модели для печати на 3D-принтере (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 3 день \(\rightarrow\) Конструктор \(\rightarrow\) файлы на изготовление).
- Формат файлов —
STLилиDFX.
Задачи сдаются в зависимости от расписания сдачи промежуточных испытаний.
В случае сдачи задачи после установленного дедлайна, она будет оценена не более, чем в 50% установленных за задачу баллов.
Список вспомогательных ссылок, которые понадобятся для решения поставленных задач:
- Схема модуля VBCore VB32G4: https://voltbro.gitbook.io/vbcores/vbcores-hardware/vbcore-vb32g4.
- Базовые примеры по работе с модулем — чтение кнопки, мигание светодиодом, работа с таймером: https://github.com/VBCores/VBCoreG4_examples/tree/main/examples/basic.
- Пример скетча для Arduino IDE по работе с протоколом CAN-FD: https://github.com/VBCores/VBCoreG4_examples/blob/main/examples/can/can_fd/can_fd.ino.
- Инструкция по работе с CAN и CAN-FD для Arduino IDE (обратите внимание, что нужно работать с протоколом CAN-FD, поэтому внимательно прочитайте весь раздел и отметьте для себя различия): https://voltbro.gitbook.io/vbcores/nastroika-po/arduino-ide/primery/rabota-s-can-i-can-fd-na-arduino.
- Для загрузки на модуль прошивки в среде Arduino IDE надо выбрать определенную плату. Инструкция по выбору необходимой платы: https://voltbro.gitbook.io/vbcores/nastroika-po/arduino-ide/vybor-platy-v-arduino-ide.
Инструкция по установке программного обеспечения для работы с модулем для участников с личными компьютерами (шаг подготовка модуля VBCore пропустите, так как он уже будет подготовлен):
- https://voltbro.gitbook.io/vbcores/nastroika-po/arduino-ide/ustanovka-sredy-programmirovaniya — установка среды программирования Arduino IDE и библиотеки STM32duino, без которой ничего работать не будет.
- https://voltbro.gitbook.io/vbcores/nastroika-po/arduino-ide/ustanovka-bazovoi-biblioteki — базовая библиотека для корректной работы программ на плате VBCore VB32G4.
Последовательность действий:
- Изучить документацию на предоставленную электронику.
- Составить схему подключения модуля VBCore VB32G4 к вспомогательной панели в электронном виде.
Требования:
- Схема должна содержать отображения того, как модуль будет подключен к вспомогательной панели (питание модуля, интерфейс CAN).
Схема должна быть цветной и отображать цвета проводов в соответствии с принятыми стандартами:
- питание: красный цвет;
- заземление: черный цвет;
- CAN-L: зеленый цвет;
- CAN-H: желтый цвет.
- Рядом с шиной должно быть ее краткое описание.
- Схема должна быть корректна с точки зрения электротехники.
- Схема должна включать только доступные компоненты.
Результаты, которые требуется представить:
- Продемонстрировать экспертам оформленную схему в электронном виде.
- Оформленную схему подключения в электронном виде (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 0 день \(\rightarrow\) Электронщик). Формат схемы —
jpeg/png.
Примеры схем см. на рис. 5.5–5.6.
Примечания
Запрещено приступать к следующим заданиям, пока это задание не принято экспертами!
Последовательность действий:
Изготовить необходимые кабели подключения:
- кабель питания от вспомогательной панели управления питанием к модулю VBCore VB32G4;
- кабель CAN от вспомогательной панели управления питанием к модулю VBCore VB32G4.
- Разместить электронные компоненты на макетной плате.
- Спаять базовую версию платы управления.
Требования:
- Длина кабеля питания и CAN — 70–80 см.
- Качественное крепление электрических компонентов на макетной плате.
- Плата должна быть спаяна согласно предоставленной схеме из предыдущего задания.
- Кабели должны быть изготовлены аккуратно, необходимой длины с установленными наконечниками.
Результаты, которые требуется представить:
- Продемонстрировать экспертам изготовленную базовую версию платы управления.
- Фотографию базовой версии платы управления (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 1 день \(\rightarrow\) Электронщик).
Последовательность действий:
- Подключить изготовленную базовую версию платы к панели управления питанием.
- Скачать тестовый скетч для отправки и приема данных на модуль
can_fd.ino: https://github.com/VBCores/VBCoreG4_examples/tree/main/examples/can/can_fd. Внести изменения в скетч:
- отправлять в CAN число 90 и 3 любых байта;
- добавить функционал декодирования входящих данных от программиста (см. задание № 12).
- Загрузить тестовый скетч на модуль.
- Совместно с программистом удостовериться, что с модуля и на модуль передаются данные.
Требования:
- Программный код для приема и передачи данных должен находиться в одном скетче.
- Сдача задания происходит совместно с заданием № 12 программиста.
- Снять видео, как электронщик загружает тестовый скетч на модуль, программист запускает программу по приему/передаче данных на ровере и получает в терминал данные с модуля (число 90 и 3 любых байта), затем электронщик показывает получаемые данные в Serial Port (число 180).
Результаты, которые требуется представить:
- Совместно с программистом продемонстрировать, что с модуля и на модуль передаются тестовые данные.
- Видео, которое сняла команда (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 1 день \(\rightarrow\) Электронщик).
- Измененный тестовый скетч в формате
txt(в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 1 день \(\rightarrow\) Электронщик).
Последовательность действий:
- Согласовать с командой необходимое для подключения оборудование.
- Изучить доступные комплектующие.
- Дополнить схему подключения базовой версии платы управления электронными элементами, которые будут использоваться в навесном оборудовании.
Требования:
- Схема должна быть корректна с точки зрения электротехники.
- Схема должна включать только доступные компоненты.
- Схема должна содержать отображения того, как электроника (сервоприводы, концевые выключатели, моторы и т. д.) будет подключена к модулю VBCore VB32G4 и обеспечена питанием.
Схема должна быть цветной и отображать цвета проводов в соответствии с принятыми стандартами:
- питание — красный цвет;
- заземление — черный цвет;
- CAN-L — зеленый цвет;
- CAN-H — желтый цвет;
- сигнальный провод — желтый/синий/зеленый.
- Рядом с шиной должно быть ее краткое описание.
Результаты, которые требуется представить:
- Продемонстрировать экспертам оформленную схему в электронном виде.
- Оформленная схема подключения в электронном виде (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 1 день \(\rightarrow\) Электронщик). Формат схемы —
jpeg/png.
Примеры схем см. на рис. 5.7–5.8.
Примечания
Перед осуществлением пайки схема должна быть утверждена экспертами!
Последовательность действий:
- Разместить электронные компоненты на макетной плате (преобразователи питания, пины для подключения электроники и т. д.).
- Спаять плату управления навесным оборудованием.
Требования:
- Выходное напряжение преобразователей питания должна быть 5 В.
- Качественное крепление электрических компонентов на макетной плате.
- Плата должна быть спаяна согласно предоставленной схеме из предыдущего задания.
Результаты, которые требуется представить:
- Продемонстрировать экспертам изготовленную плату управления навесным оборудованием.
- Фотографию платы управления навесным оборудованием (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 2 день \(\rightarrow\) Электронщик).
Последовательность действий:
- Подключить изготовленную плату управления навесным оборудованием к панели управления питанием.
- Подключить к плате управления навесным оборудованием необходимую электронику (мотор или сервопривод).
- Написать программу для приема управляющих данных с Raspberry Pi и передачи данных обратной связи на Raspberry Pi (в случае необходимости) по протоколу CAN-FD.
- Совместно с программистом удостовериться, что сервопривод/мотор работает корректно.
Требования:
- Программный код должен находиться в одном скетче.
- Сдача задания происходит совместно с заданием № 15 программиста.
- Снять видео работы сервопривода/мотора.
Результаты, которые требуется представить:
- Совместно с программистом продемонстрировать, что программное обеспечение для управления сервоприводом/мотором работает.
- Видео, которое сняла команда (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 2 день \(\rightarrow\) Электронщик).
- Скетч для модуля в формате
txt(в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 2 день \(\rightarrow\) Электронщик).
Последовательность действий:
- Подключить изготовленную плату управления навесным оборудованием к панели управления питанием.
- Подключить к плате управления навесным оборудованием необходимую электронику (моторы, сервоприводы, концевики и т. д.).
- Написать программу для приема управляющих данных с Raspberry Pi и передачи данных обратной связи на Raspberry Pi по протоколу CAN-FD.
- Совместно с программистом убедиться, что ровер корректно выполняет функцию раскладывания солнечных панелей.
Требования:
- Программный код должен находиться в одном скетче.
- Сдача задания происходит совместно с заданием № 16 программиста.
- Снять видео работы навесного оборудования.
Результаты, которые требуется представить:
- Совместно с программистом продемонстрировать, что ровер корректно выполняет функцию раскладывания солнечных панелей.
- Видео, которое сняла команда (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 3 день \(\rightarrow\) Электронщик).
- Фотографию смонтированной платы управления с подключенной электроникой (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 3 день \(\rightarrow\) Электронщик).
- Скетч для модуля в формате
txt(в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 3 день \(\rightarrow\) Электронщик).
В то время как конструктор воплощает свои безумные идеи по созданию навесного оборудования, программисту необходимо решить несколько важных задач, без которых собранное навесное оборудование будет абсолютно бесполезно.
Для работы с электроникой рекомендуется использовать следующие материалы:
Инструкция по установке в автозагрузку утилиты
can-utils:https://voltbro.gitbook.io/vbcores/vbcores-hardware/can-fd-raspberry-pi/nastroika-can-na-rpi.
Обратите внимание на то, что используется протокол CAN-FD, поэтому внимательно прочитайте весь раздел и отметьте для себя разницу в командах для включения CAN и CAN-FD.
Инструкция по работе с CAN-FD через Python:
Примеры из этой инструкции можно взять с репозитория GitHub:
https://github.com/VBCores/VBCoreG4_examples/tree/main/examples/python
- Инструкция к плате управления TurtleBoard: https://manual.turtlebro.ru/.
- Видеокурс по ROS: https://vkvideo.ru/playlist/-206862623_4.
Результаты задач сдаются в зависимости от расписания сдачи промежуточных испытаний.
В случае сдачи задачи после установленного дедлайна, она будет оценена не более, чем в 50% установленных за задачу баллов.
Последовательность действий:
- Подключиться к роверу по протоколу SSH.
- Установить утилиту CAN-utils.
- Настроить автозапуск CAN-utils.
- Снять видео (или запись экрана) с запуском утилиты
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\) Программист).
Последовательность действий:
- Разработать программу управления ровером через клавиатуру.
- Протестировать программу управления.
- Снять видео, как ровер реагирует на управление с клавиатуры с использованием написанной программы
Требования:
- Запрещено использовать веб-интерфейс ровера.
- Команда как минимум должна продемонстрировать движение ровера по прямой на расстояние не менее 1 м и поворот на месте или в движении на угол не менее 25°.
- Видео надо снимать в разрешении достаточном для того, чтобы можно было разобрать, какую программу запускает команда и как происходит управление с клавиатуры.
Результаты, которые надо представить:
- Продемонстрировать экспертам работу программы для управления ровером в режиме телеуправления;
- Видео, которое сняла команда (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 1 день \(\rightarrow\) Программист);
- Программный код в в формате
txt(в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 1 день \(\rightarrow\) Программист).
Последовательность действий:
- Подключить, изготовленную электронщиком, базовую версию платы к панели управления питанием.
- Изучить тестовую программу передачи данных на модуль с ровера
can_send.py: https://github.com/VBCores/VBCoreG4_examples/blob/main/examples/python/can_send.py. - Изучить тестовую программу получения данных с модуля на ровер
can_recv.py: https://github.com/VBCores/VBCoreG4_examples/blob/main/examples/python/can_recv.py. - Внести изменения в скетч
can_send.py— отправлять в CAN число 180. - Объединить функционал двух тестовых программ в одну (
can_send_recv.py). - Запустить программу
can_send_recv.pyна ровере. - Совместно с электронщиком удостовериться, что данные принимаются и передаются с ровера на модуль и обратно.
Требования:
- Программный код для приема и передачи данных должен находиться в одной программе
can_send_recv.py. - Совместная сдача с заданием № 5 электронщика.
- Снять видео, как электронщик загружает тестовый скетч на модуль, программист запускает программу по приему/передаче данных на ровере и получает в терминал данные с модуля (число 90 и 3 любых байта), затем электронщик показывает получаемые данные в Serial Port (число 180).
Результаты, которые надо представить:
- Совместно с электронщиком продемонстрировать, что с модуля и на модуль передаются тестовые данные.
- Видео, которое сняла команда (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 1 день \(\rightarrow\) Программист);
- Объединенный программный код
can_send_recv.pyв форматеtxt(в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 1 день \(\rightarrow\) Программист).
Последовательность действий:
- Разработать программу управления перемещением ровера через клавиатуру (см. задание № 11).
Разработать графический интерфейс управления ровером в котором будут:
- индикаторы направления движения ровера;
- слайдер регулировки линейной скорости;
- слайдер регулировки угловой скорости;
- индикатор текущей линейной скорости;
- индикатор текущей угловой скорости;
- индикатор текущей одометрии (\(X\) м, \(Y\) м, \(\theta °\));
- индикатор нажатой кнопки на клавиатуре (по желанию);
- отображение изображения с камеры/камер.
- Протестировать программу управления ровером совместно с графическим интерфейсом.
- Снять видео совместной работы программы управления с клавиатуры и графического интерфейса в связке с ровером.
Требования:
- Запрещено использовать веб-интерфейс ровера.
- Команда должна продемонстрировать, что при разных направлениях движения ровера корректно меняется значение индикатора направления движения ровера.
- Команда должна продемонстрировать, что при изменении линейной и угловой скорости на слайдерах скорость ровера действительно меняется.
- Команда должна продемонстрировать, что в графическом интерфейсе выводится видео с камеры ровера в режиме реального времени.
- Видео надо снимать в разрешении достаточном для того чтобы можно было разобрать какую программу запускает команда, элементы графического интерфейса и как происходит управление с клавиатуры.
Результаты, которые надо представить:
- Продемонстрировать экспертам работу программ для управления ровером в режиме телеуправления с графическим интерфейсом.
- Видео, которое сняла команда (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 1 день \(\rightarrow\) Программист).
- Программный код в в формате
txt(в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 1 день \(\rightarrow\) Программист).
Последовательность действий:
- Придумать алгоритм, при котором ровер будет реагировать на открывание дверцы модуля по камере.
- Разработать программу реагирования на открывание дверцы посадочного модуля.
- Разработать программу автономного выезда ровера из посадочного модуля при открытии дверцы.
- Протестировать программу автономного выезда ровера.
- Снять видео, как ровер автономно выезжает из модуля при открытии дверцы.
Требования:
- Запрещено использовать телеуправление ровером, только автономный выезд.
Команда на видео должна продемонстрировать:
- установку ровера в модуль;
- закрытие дверцы;
- запуск программы;
- открытие дверцы;
- автономный выезд;
- остановку рядом с модулем.
- Видео надо снимать в разрешении достаточном для того, чтобы можно было разобрать какую программу запускает команда.
Результаты, которые надо представить:
- Продемонстрировать экспертам работу программы для автономного выезда из модуля.
- Видео, которое сняла команда (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 2 день \(\rightarrow\) Программист).
- Программный код в формате
txt(в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 2 день \(\rightarrow\) Программист).
Последовательность действий:
- Написать программу для отправки значения угла поворота для сервопривода/скорости (длительности) для мотора с Raspberry Pi плату управления навесным оборудованием по протоколу CAN-FD.
- Совместно с электронщиком удостовериться, что сервопривод/мотор работает корректно.
Требования:
- Программный код должен находиться в одном файле.
Передача данных на исполняемый механизм должна происходить одним из следующих способов:
- слайдером их графического интерфейса управлением ровера;
- клавишами клавиатуры с отображением переданного числа в индикаторе графического интерфейса управлением ровера.
- Сдача задания происходит совместно с заданием № 8 электронщика.
- Снять видео о работе сервопривода/мотора.
Результаты, которые надо представить:
- Совместно с электронщиком продемонстрировать, что программное обеспечение для управления сервоприводом/мотором работает.
- Видео, которое сняла команда (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 2 день \(\rightarrow\) Программист).
- Программный код в формате
txt(в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 2 день \(\rightarrow\) Программист).
Последовательность действий:
- Добавить необходимые элементы управления/отображения в графический интерфейс/программу управления с клавиатуры.
- Написать программу для отправки управляющих данных с Raspberry Pi и приему данных обратной связи на Raspberry Pi по протоколу CAN-FD.
- Совместно с электронщиком удостовериться, что ровер корректно выполняет функцию раскладывания солнечных панелей.
Требования:
- Программный код может находиться в нескольких файлах;
Графический интерфейс управления ровером должен содержать:
- индикаторы направления движения ровера;
- слайдер регулировки линейной скорости;
- слайдер регулировки угловой скорости;
- индикатор текущей линейной скорости;
- индикатор текущей угловой скорости;
- индикатор текущей одометрии (\(X\) м, \(Y\) м, \(\theta °\));
- индикатор нажатой кнопки на клавиатуре (по желанию);
- отображение изображения с камеры/камер;
- элементы управления исполнительными механизмами или индикаторы состояния исполнительных механизмов (если управление исполнительными механизмами происходит с клавиатуры).
- Сдача задания происходит совместно с заданием № 9 электронщика.
- Снять видео о работе навесного оборудования и управления ровером.
Результаты, которые надо представить:
- Совместно с электронщиком продемонстрировать, что ровер корректно выполняет функцию раскладывания солнечных панелей.
- Видео, которое сняла команда (в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 3 день \(\rightarrow\) Программист).
- Программу/программы в формате
txt(в файловом хранилище команды в папку: «название команды» \(\rightarrow\) 3 день \(\rightarrow\) Программист).
На выполнение финального испытания каждой команде отводится 15 мин. К финальному испытанию допускаются только те команды, которые прошли по критериям прохождения.
Для выполнения финального испытания необходимо, чтобы ровер в автономном режиме при открытии дверцы переместился из зоны старта Посадочного модуля в зону старта Навигации. Далее в режиме телеуправления необходимо обнаружить в зоне Навигации зону Развертывания, исходя из координат, переданных команде до старта финального испытания. В зоне Развертывания необходимо разместить заранее загруженный комплект солнечных батарей так, чтобы он был полностью разложен. Затем необходимо вернуться в зону Посадочного модуля.
Все финальное задание сдается единым блоком без перерывов. Единственное, что разрешается сделать участникам — это после завершения ровером выезда из зоны Посадочного модуля удаленно загрузить на ровер программу для телеуправления.
Задание считается выполненным полностью, если:
- весь заезд длился не более 15 мин;
- ровер автономно выехал из зоны Посадочного модуля без потери контроля и без вмешательства участника на полигоне;
- команда участников в режиме телеуправления разложила комплект солнечных батарей в зоне Развертывания;
- команда участников в режиме телеуправления вернула ровер в зону Посадочного модуля;
- команда участников ни разу физически не вмешивалась в работу ровера.
Задание считается выполненным частично, если не выполнен хотя бы один из вышеперечисленных критериев.
Задание считается невыполненным, если не выполнен ни один из вышеперечисленных критериев.
- Команда выбирает одного человека, который будет находиться с ровером и организаторами на полигоне, остальные участники удаляются в центр управления ровером (ЦУР).
Участник, оставшийся на полигоне, готовит ровер к старту:
- загружает в ровер комплект солнечных батарей;
- выставляет ровер в посадочный модуль;
- включает ровер;
- выполняет другие необходимые операции.
После того как ровер подготовлен, участник подает сигнал экспертам, что ровер готов к испытанию.
- В это время участники в ЦУР готовят ноутбук/ровера к испытанию: подключаются к роверу, загружают программу и т. д.
- Организаторы передают участнику в ЦУР координаты расположения зоны Развертывания относительно точки старта зоны Посадочного модуля.
- Как только от участника с полигона приходит команда о готовности ровера, эксперты запускают обратный отсчет времени, а участники в ЦУР запускают работу ровера (автономный выезд из зоны Посадочного модуля).
Открывается дверца Посадочного модуля.
В случае, если ровер в автономном режиме не выезжает из зоны Посадочного модуля или начинает ехать до того, как дверца была открыта или начинает вести себя неадекватно, то участник на полигоне по команде экспертов:
- нажимает кнопку аварийной остановки на ровере.
- выставляет его в зону старта зоны Навигации.
- отжимает кнопку аварийной остановки.
После этого команда имеет право продолжить заезд в режиме телеуправления.
- Как только ровер доезжает до конца зоны Посадочного модуля, участники в ЦУР могут загрузить программу для управления вручную/переключиться на управление вручную и выполнять оставшуюся часть задания.
- По истечению времени заезда ровер принудительно останавливается на полигоне экспертами.
- Дописывать программный код во время выполнения задания на полигоне.
- Физически вмешиваться в работу ровера на полигоне, не считая команды экспертов или случаев потери контроля над ровером.
- Использовать веб-интерфейс ровера.
Количество попыток на сдачу финальных полигонных испытаний ограничено — 2 попытки. При взятии новой попытки количество баллов в ней уменьшается на 10%.
Новая попытка начинается из той зоны, в которой была закончена предыдущая попытка, например:
- Ровер застрял в зоне Навигации, и команда решила взять вторую попытку — значит, эта попытка начинается со старта зоны Навигации.
- Команда потеряла управление ровером в зоне Развертывания — в таком случае, если комплект солнечных батарей был разложен, то он загружается обратно на ровер. Ровер выставляется в старт зоны Развертывания.
| Предварительные испытания | Макс. балл | 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 | ||||
Видео финального заезда: https://disk.yandex.ru/d/eN6uHundnLgRVg/SpacEnergy.mp4.
Полное решение всех подзадач по дням: https://disk.yandex.ru/d/eN6uHundnLgRVg/SpacEnergy/.
#!/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")
#!/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()
/*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();}
}
}
Для работы с электроникой рекомендуется использовать следующие материалы:
Инструкция по установке в автозагрузку утилиты can-utils:
https://voltbro.gitbook.io/vbcores/vbcores-hardware/can-fd-raspberry-pi/nastroika-can-na-rpi.
Инструкция по работе с CAN-FD через Python:
Примеры из этой инструкции вы можете взять с репозитория GitHub:
https://github.com/VBCores/VBCoreG4_examples/tree/main/examples/python.
Инструкция к плате управления TurtleBoard:
Курс по ROS:
Видеокурс по ROS:


















