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

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

Задача 1.1.(14 баллов)
Подбор аккумулятора
Темы: квадрокоптер, аккумулятор

Условие

Рис. 1.1. Мотор

Необходимо подобрать аккумулятор для квадрокоптера, на котором установлены моторы IFlight Xing (рис. 1.1) с пятью дюймовыми пропеллерами, шаг винта которых 4,3\(^{\prime\prime}\) (дюйма).

Время полета данного коптера должно быть не менее 57 с при полном газе.

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

  1. 4s 850 mAh 80c,
  2. 4s 2200 mAh 75с,
  3. 4s 2600 mAh 45c,
  4. 4s 2300 mAh 80c,
  5. 6s 2400 mAh 120c,
  6. 6s 850 mAh 120c.

Решение

Согласно таблице на рис. 1.1 максимальный ток нагрузки на один мотор с пропеллером 5043 (размер 5\(^{\prime\prime}\), шаг винта 4,3\(^{\prime\prime}\)) составляет: 35,48 А.

Для квадрокоптера (четыре мотора): \(35{,}48 \cdot 4=141{,}92 ~\text{А}\).

Максимальный разрядный ток:

  1. для аккумулятора № 1: \(0{,}85\cdot 80=68~\text{А}\),
  2. для аккумулятора № 2: 165А,
  3. для аккумулятора № 3: 117А,
  4. для аккумулятора № 4: 184А,
  5. для аккумулятора № 5: 288А,
  6. для аккумулятора № 6: 102А.

Вариант № 5 не является верным, так как данные моторы не предназначены для использования с 6S аккумулятором.

Время полета с аккумулятором № 2 равно \((2{,}2/141{,}92)\cdot 60\cdot 60=55{,}81\) с.

Время полета с аккумулятором № 4 равно \((2{,}3/141{,}92)\cdot 60\cdot 60=58{,}34\) с.

Ответ

4.

Задача 1.2.(11 баллов)
Сборка
Темы: регулятор оборотов, полетный контроллер

Условие

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

  1. М1 — пины A,
  2. М2 — пины B,
  3. М4 — пины C,
  4. М3 — пины D.

Рис. 1.2. Подключение сигнальных проводов

Посмотрите внимательно на рис. 1.2 и отметьте, какие сигнальные провода регуляторов оборотов двигателей НЕВЕРНО подключены в пины полетного контроллера COEX PIX.

Отметьте неверные позиции:

  1. M1,
  2. M2,
  3. M3,
  4. M4.

Решение

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

  1. M1 — пины F,
  2. M2 — пины E,
  3. M3 — пины D,
  4. M4 — пины C.

Ответ

M1, M2.

Задача 1.3.(10 баллов)
Полетный контроллер
Темы: Pixracer, полетный контроллер

Условие

На рис. 1.3 изображена распиновка полетного контроллера Pixracer.

Рис. 1.3. Полетный контроллер

Укажите вариант ответа, в котором обозначен разъем для подключения радиоприемника к полетному контроллеру.

Решение

Подключение радиоприемника к полетному контроллеру осуществляется в разъем RC IN.

Ответ

5.

Задача 1.4.(10 баллов)
К полету готовы?
Темы: настройка, пульт радиоуправления

Условие

Во время дистанционной работы напарник-стажер сообщил о том, что справился со сборкой и настройкой квадрокоптера и готов к первому полету.

Не допустил ли он ошибку при сборке?

Проверим готовность по фотографии (рис. 1.4).

Рис. 1.4. Пульт радиоуправления

К полету готов? Отметьте верный вариант.

  1. Потеряна связь с радиоприемником.
  2. Тримы газа и крена сбиты в крайнее правое и верхнее положение соответственно.
  3. Тримы тангажа и рыскания сбиты в крайнее верхнее и правое положение соответственно.
  4. Тримы тангажа и рыскания сбиты в крайнее верхнее и левое положение соответственно.
  5. Разрядился источник питания пульта радиоуправления.
  6. Низкий уровень заряда аккумулятора квадрокоптера.

Решение

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

Ответ

3.

Задача 1.5.(14 баллов)
Подбор оптимальной ВМГ
Темы: сборка дрона, эксплуатация

Условие

Необходимо собрать беспилотник мультироторного типа из деталей, имеющихся на складе (таблица 1).

Техническое задание

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

Также необходимо иметь возможность установки камеры весом 154 г. Время полета на одном аккумуляторе должно быть максимально возможным.

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

Таблица: Имеющееся на складе оборудование
Двигатель ESC LiPo Frame
A XING2 1806 FPV Motor 2500kv Количество: 6 шт. T-motor CINE55A 8S 8IN1 32BIT Количество: 2 шт. Betafpv BT2.0 300mAh 1S 30C Battery Количество: 50 шт.
B Betafpv 7x16mm Brushed Motors Количество: 7 шт. T-motor MINI F45A 6S 4IN1 Количество: 2 шт. Samsung 30Q 18650 3000mah LiIon Количество: 3 шт.
C T-motor U15II KV80 Количество: 14 шт. T-motor AT 115A 14S Количество: 24 шт. GNB 5000mah 11.1 50C Количество: 5 шт.
D T-motor P1604 2850 KV Количество: 3 шт. BLITZ F411 1S Whoop AIO Количество: 2 шт. GNB 3500 mAh 6S 70C Lipo Количество: 9 шт.

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

Пример ответа: ECAB.

Ответ

ABDC.

Задача 1.6.(27 баллов)
Передача данных с датчиков
Темы: Python, сервер

Условие

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

Импровизированный робот оснащен несколькими датчиками, результаты работы которых можно считать из файлов в директории ./sensors/. Каждый файл в этой директории имеет имя <sensor_name>.value.

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

Проверять необходимо формат данных — они должны быть числом (целым или вещественным) и не выходить за пределы \(-1000 \leqslant value \leqslant 1000\). Основной контроллер принимает данные по протоколу HTTP, в формате json.

Формат входных данных

Набор файлов в директории ./sensors/. Каждый файл в этой директории имеет имя <sensor_name>.value, где sensor_name — имя датчика.

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

Пример 1

Рис. 1.5. Структура файлов

Файл light_sensor.value:

\(106.346\)

Файл smoke_sensor.value:

\(-74.937\)

Пример 2

Рис. 1.6. Структура файлов

Файл carbon_monoxide_sensor.value:

\(-183.213\)

Файл flow_sensor.value:

\(-1538.902\)

Файл tilt_sensor.value:

\(94.346\)

Формат выходных данных

Для каждого датчика необходимо сделать HTTP POST-запрос на сервер.

Расположение сервера:

Host: 127.0.0.1
Port: 8000

Формат POST-запроса:

URL: /sensor/<sensor_name>, где sensor_name — имя датчика;

Headers: обязательно 'Content-Type': 'application/json'

Body:

  • в случае успешно пройденной проверки данных {"status": "ok", "value": <sensor_value>}, где sensor_value — значение датчика;
  • в случае НЕ успешно пройденной проверки данных {"status": "error", "message": "invalid fomat"}.

Порядок запросов может быть любым.

Пример 1

POST http://127.0.0.1:8000/sensor/smoke_sensor
Accept-Encoding: gzip, deflate
User-Agent: python-requests/2.11.1
Accept: /
Connection: keep-alive
Content-Length: 34
Content-Type: application/json
{"status": "ok", "value": -74.937}
POST http://127.0.0.1:8000/sensor/light_sensor
Accept-Encoding: gzip, deflate
User-Agent: python-requests/2.11.1
Accept: /
Connection: keep-alive
Content-Length: 34
Content-Type: application/json
{"status": "ok", "value": 106.346}

Пример 2

POST http://127.0.0.1:8000/sensor/tilt_sensor
Accept-Encoding: gzip, deflate
Connection: keep-alive
User-Agent: python-requests/2.11.1
Accept: /
Content-Length: 33
Content-Type: application/json
{"status": "ok", "value": 94.346}
POST http://127.0.0.1:8000/sensor/carbon_monoxide_sensor
Accept-Encoding: gzip, deflate
Connection: keep-alive
User-Agent: python-requests/2.11.1
Accept: /
Content-Length: 35
Content-Type: application/json
{"status": "ok", "value": -183.213}
POST http://127.0.0.1:8000/sensor/flow_sensor
Accept-Encoding: gzip, deflate
Accept: /
Connection: keep-alive
User-Agent: python-requests/2.11.1
Content-Length: 48
Content-Type: application/json
{"status": "error", "message": "invalid format"}

Решение

Ниже представлено решение на языке Python.

Python
from pathlib import Path
import requests

p = Path('sensors')

for file in p.glob('*.value'):
   with file.open() as f:
       value = f.readline()
   try:
       value = float(value)
   except ValueError:
       requests.post(f"http://localhost:5000/sensor/{file.stem}", json={"status": "error", "message": "invalid format"})
       continue

   requests.post(f"http://localhost:5000/sensor/{file.stem}", json={"status": "ok", "value": value})
Задача 1.7.(14 баллов)
You Only Look Once
Темы: Python, YOLO

Условие

В современном мире компьютерного зрения алгоритмы детектирования объектов играют важную роль в различных приложениях: от безопасности до автономного вождения. Одной из наиболее популярных и мощных моделей для детектирования объектов является YOLO (You Only Look Once). Эта модель может быстро и точно определять объекты на изображениях и видеопотоках, классифицируя их по заранее изученным классам.

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

Необходимо извлечь из предоставленного .pt файла YOLO модели, обученной с использованием вышеуказанной библиотеки, список всех классов, которые модель может детектировать. Этот список классов будет использоваться для настройки интерфейса пользователя, отображения результатов детектирования и других задач, связанных с классификацией объектов.

Модель: https://disk.yandex.ru/d/wKOcOdHPgGrccA.

Формат входных данных

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

Пример: human cat dog.

Решение

Ниже представлено решение на языке Python.

Python
from ultralytics import YOLO

model = YOLO("model.pt")
print(",".join(sorted(model.names.values())))
text slider background image text slider background image
text slider background image text slider background image text slider background image text slider background image