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

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

Задачи инженерного тура разделены на три категории: программирование (Python, ROS), электроника (Arduino, C++), 3D-моделирование. Участникам необходимо индивидуально выполнить задачи одного из разделов профиля (или нескольких по желанию).

Задания инженерного тура. 3D-моделирование
Задача 1.1.(2 балла)
Калибровочная задача
Тема: 3D-моделирование

Условие

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

  1. Создайте кубик со стороной 30 мм, как представлено на рис. 1.1.
  2. Вычислите объем детали при помощи вашего ПО — должно получиться 27000 \(\textrm{мм}^{3}\).
  3. Каждое ребро кубика скруглите радиусом 3 мм.

    Рис. 1.1. Калибровочный куб

  4. Вычислите объем полученной детали при помощи вашего ПО — должно получиться \(26340{,}849\) \(\text{мм}^3\).
  5. Установите материал кубика — алюминий (\(\rho=2{,}7~\text{г}/\text{см}^3\)).
  6. Вычислите массу полученной детали при помощи вашего ПО. Она должна получиться примерно \(0{,}0712\) кг.
  7. Запишите массу полученной детали в ответ в граммах с точностью до \(0{,}1\) г.

Решение

Ответы получаются автоматически при использовании специального ПО для 3D-моделирования.

Ответ

71,2 \(\pm\) 1 г.

Задача 1.2.(6 баллов)
Задача «Неожиданная поломка»
Тема: 3D-моделирование

Условие

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

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

  1. Сделайте 3D-модель детали (рис. 1.2) согласно чертежу (рис. 1.3), имея ввиду, что размеры указаны в миллиметрах.
  2. Установите материал — алюминий. Плотность \(2{,}7~\text{г}/\text{см}^3\).
  3. Укажите объем полученной детали с точностью \(1\%\) и округлением до 1 \(\text{мм}^3\).

Рис. 1.2. Чертеж детали 1

Рис. 1.3. Деталь 1

Решение

Ответы рассчитываются автоматически при корректном использовании специального ПО для 3D-моделирования.

Ответ

23484 \(\text{мм}^3\).

Задача 1.3.(7 баллов)
Задача о доработке
Тема: 3D-моделирование

Условие

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

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

  1. Сделайте 3D-модель детали согласно чертежу (рис. 1.4), имея ввиду, что размеры указаны в миллиметрах.
  2. Установите материал — латунь. Плотность \(8{,}470~\text{г}/\text{см}^3\).
  3. Запишите вес детали в граммах с точностью \(1\%\) и округлением до 0,1 г.

Рис. 1.4. Чертеж детали

Решение

Ответы получаются автоматически при использовании специального ПО для 3D-моделирования.

Ответ

141,7 г.

Задача 1.4.(9 баллов)
Задача о сборке
Тема: 3D-моделирование

Условие

Наконец, все детали, необходимые для ремонта, спроектированы. Василий будет их собирать, используя винты М4\(\times\)8 (рис. 1.5), правда, деталь из латуни оказалась тяжелой, и космонавт сделал ее из очень секретного космического материала с плотностью \(1{,}345~\text{г}/\text{см}^3\).

Рис. 1.5.

Винты изготовлены в соответствии со стандартом DIN 7985 из стали. Для расчетов переопределите массы винтов, для М4\(\times\)8 — 2 г.

Рассчитайте массу собранной детали. Запишите ответ и округлите до 0,1 г. Допустимая погрешность \(0{,}5\%\).

Решение

Ответы получаются автоматически при использовании специального ПО для 3D-моделирования.

Ответ

93,908 г.

Задача 1.5.(10 баллов)
Задача о расчетах
Тема: 3D-моделирование

Условие

Свершилось! Модифицированное звено манипулятора установлено на робота, и теперь Василий может продолжить работу. Однако с роботами всегда все непросто — управляющая программа рассчитана на работу только с оригинальной деталью, а чтобы она учитывала сборку из двух деталей, которую установил Василий, необходимо внести корректировку — указать смещение центра масс нового звена (сборка из задачи \eqref{aero-first-task-04}) относительно старого (модель задачи \eqref{aero-first-task-02}).

Для расчетов выберите правильную точку начала координат, она совпадает с местом крепления оригинальной детали (рис. 1.6).

Рис. 1.6.

  1. На схеме указано направление координатных осей и место, в котором находится точка начала отсчета.
  2. Рассчитайте координаты \(X\) центра масс оригинальной детали.
  3. Рассчитайте координаты центра масс собранной конструкции.

Найдите смещение, необходимое Василию. Для этого:

  1. Посчитайте разность положений центра масс нового и старого звена по всем трем осям (\(Dx\), \(Dy\), \(Dz\)).
  2. Вычислите расстояние между центрами масс нового и старого звена в миллиметрах.

Решение

Ответы получаются при использовании специального ПО для 3D-моделирования. Необходимо установить начало координат в указанную точку и относительно нее:

  1. рассчитать расположение ЦМ старого звена — (\(X\): 102,679, \(Y\): 0,829, \(Z\): 7,145 мм);
  2. вычислить расположение ЦМ нового звена — (\(X\): 135,647, \(Y\): 0,56, \(Z\): 7,797 мм);
  3. получить разницу: \(Dx\) \(32{,}968\) мм, \(Dy\): \(-0{,}269\) мм, \(Dz\): \(0{,}652\) мм;
  4. определить длину полученного вектора (как корень из суммы квадратов): 32,9755438.

Ответ

Смещение 32,98 мм.

Задания инженерного тура. Arduino
Задача 2.1.(2 балла)
Сопоставление компонентов
Тема: Arduino

Условие

Соотнесите компоненты Arduino с их описанием.

  1. Резистор.
  2. Светодиод (LED).
  3. Потенциометр.
  4. Датчик ультразвука.
  5. Серво.
  1. Изменяет сопротивление и регулирует уровень сигнала.
  2. Излучает свет при подаче на него напряжения.
  3. Используется для измерения расстояния до объекта.
  4. Ограничивает ток в цепи.
  5. Используется для создания вращательного движения на заданный угол.

Ответ

1 — D, 2 — B, 3 — A, 4 — C, 5 — E.

Задача 2.2.(2 балла)
Выбор правильного двигателя
Тема: Arduino

Условие

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

  1. Коллекторный двигатель постоянного тока.
  2. Серво.
  3. Шаговый двигатель.
  4. Генератор.

Ответ

B — Серво, C — Шаговый двигатель.

Задача 2.3.(4 балла)
Функции Arduino
Тема: Arduino

Условие

Соотнесите функции Arduino с их описанием.

  1. pinMode()
  2. digitalRead()
  3. analogWrite()
  4. delay()
  5. serialBegin()
  1. Настраивает пин как вход или выход.
  2. Считывает значение с цифрового пина.
  3. Отправляет аналоговый сигнал на пин.
  4. Приостанавливает выполнение программы на заданное время.
  5. Инициализирует последовательное соединение.

Ответ

1 — A, 2 — B, 3 — C, 4 — D, 5 — E.

Задача 2.4.(4 балла)
Определение функции
Тема: Arduino

Условие

Определите, какие действия выполняют следующие строки кода.

    digitalWrite(LED_BUILTIN, HIGH);
    delay(1000);
    digitalWrite(LED_BUILTIN, LOW);
    delay(1000);
  1. Включает встроенный светодиод на 1 с, затем выключает его на 1 с.
  2. Включает встроенный светодиод на 1000 мс.
  3. Включает внешний светодиод, подключенный к пину 13.
  4. Считывает состояние встроенного светодиода.

Решение

Запустить код в симуляторе или на живой Arduino и проверить.

Ответ

А.

Задача 2.5.(6 баллов)
Подключение кнопки
Тема: Arduino

Условие

С помощью Arduino Uno, резистора на 10 кОм и кнопки собрана следующая схема (рис. 2.1).

Рис. 2.1. Схема с кнопкой

Кнопка имеет следующую схему (рис. 2.2).

Рис. 2.2.

На Arduino IDE загружен и работает код.

C++
const int buttonPin = 4;
int oldValue = HIGH; // default/idle value for pin 4 is high.

void setup()
{
  Serial.begin(115200);
  Serial.println("Press the button.");
  pinMode(buttonPin, INPUT_PULLUP);
}

void loop()
{
  int newValue = digitalRead(buttonPin);
  if(newValue != oldValue)
  {
    if(newValue == HIGH)
    {
      Serial.println("The button is pressed.");
    }
    else
    {
      Serial.println("The button is released.");
    }
    oldValue = newValue;
  }
  delay(100);
}

Для решения данной задачи рекомендуется воспользоваться сервисом: https://wokwi.com.

Задача

Определить, какое состояние будет передаваться в Serial-порт, когда кнопка нажата и зажата:

  1. Press the button.
  2. The button is pressed.
  3. The button is released.

Решение

Собрать схему вживую или через сервис https://wokwi.com и запустить предложенный код.

Ответ

C.

Задача 2.6.(7 баллов)
LCD дисплей
Тема: Arduino

Условие

В наличии у программиста Василия оказался Дисплей LCD 16\(\times\)2 (\(\textrm{I}^2\textrm{C}\)) и Arduino Uno. Он написал код для того, чтобы с помощью этого признаться в любви конструктору Кате. Но вот незадача — он совсем не знает, как подключить этот дисплей, чтобы все нормально функционировало. Помогите Василию подключить дисплей, чтобы его код заработал.

C++
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

void setup() {
  lcd.init();
  lcd.backlight();
  lcd.setCursor(1, 0);
  lcd.print("I Love Kate!");
}

void loop() {
  lcd.setCursor(7, 1);
  lcd.print(millis() / 1000);
}

Для решения данной задачи рекомендуется воспользоваться сервисом: https://wokwi.com.

Сетка сопоставления приведена в таблице 1.

Пины дисплея / Пины Arduino
GND A4 5V D8 D7 A5
SDA
VCC
SCL
GND

Решение

Собрать схему вживую или через сервис https://wokwi.com и запустить предложенный код.

Ответ

Приведен в таблице 2.

Пины дисплея / Пины Arduino
GND A4 5V D8 D7 A5
SDA +
VCC +
SCL +
GND +
Задача 2.7.(8 баллов)
Управление сервоприводом
Тема: Arduino

Условие

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

Рис. 2.3. Схема с серво

Помогите Виталию и найдите номер строки, в которой закралась ошибка.

C++
#include <Servo.h>

Servo myservo;

int potpin = 2;
int val;

void setup() {
  myservo.attach(9);
}

void loop() {
  val = analogRead(potpin);
  val = map(val, 0, 1023, 0, 180);
  myservo.write(val);
  delay(15);
}

Для решения данной задачи рекомендуется воспользоваться сервисом: https://wokwi.com.

Решение

Собрать схему вживую или через сервис https://wokwi.com и запустить предложенный код.

Ответ

5.

Задания инженерного тура. Программирование
Задача 3.1.(5 баллов)
Подсчет ресурсов — сумма цифр идентификатора ресурса
Тема: Python

Условие

Робот должен суммировать цифры идентификатора ресурса, чтобы понять, сколько единиц ресурса необходимо для выполнения задания. Напишите программу на языке Python 3, содержащую функцию resource_sum(identifier), которая принимает числовой идентификатор ресурса и возвращает сумму его цифр.

Решение

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

Python
def resource_sum(identifier):
    total = 0
    while identifier > 0:
        total += identifier % 10
        identifier //= 10
    return total

identifier = int(input())
print(resource_sum(identifier))

Тестовые данные

Номер тестаСтандартный вводСтандартный вывод
1
123
6
2
999999
54
Задача 3.2.(4 балла)
Путь робота
Тема: Python

Условие

Напишите программу, в которой рассчитывается пройденный путь одноколесным роботом, если известны радиус его колеса и число совершенных полных оборотов колеса. Округлите число \(\pi\) до \(3{,}14\).

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

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

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

Выведите одно число, округленное до сотых.

Решение

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

Python
import math
radius, revolutions = map(float, input().split())
pi = 3.14
circumference = 2 * pi * radius
distance = circumference * revolutions
print(distance)

Тестовые данные

Номер тестаСтандартный вводСтандартный вывод
1
2 1
12.56
2
2.2 5
69.08
Задача 3.3.(8 баллов)
Усложненный путь робота
Тема: Python

Условие

Рис. 3.1.

Робот может двигаться только по вертикали (вперед – назад), горизонтали (влево – вправо) и по диагонали шахматного поля (рис. 3.1). Напишите программу, которая определяет, может ли робот попасть с первой заданной клетки на вторую одним ходом.

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

Вводится 2 пары чисел от 1 до 8 каждое (всего 4 числа), задающие положение первоначальной и конечной клеток по горизонтали и вертикали соответственно.

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

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

Решение

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

Python
def can_move_in_one_move(x1, y1, x2, y2):
    if y1 == y2:
        return "YES"
    if x1 == x2:
        return "YES"
    if abs(x2 - x1) == abs(y2 - y1):
        return "YES"
    return "NO"

x1, y1, x2, y2 = map(int, input().split())

print(can_move_in_one_move(x1, y1, x2, y2))

Тестовые данные

Номер тестаСтандартный вводСтандартный вывод
1
1 1 3 3
YES
2
5 5 5 1
YES
3
3 3 6 1
NO
Задача 3.4.(10 баллов)
Руины древних роботов: сокрытый вход
Тема: Python

Условие

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

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

— Где же вход? — спросил Альфа.

— Очевидно, он скрыт, — ответил Бета. — Ты же не думал, что древние роботы оставили бы открытый доступ к своим разработкам. У них всегда были продуманные системы защиты. Но я почти уверен, что где-то среди этих секций есть настоящий вход. Причем во всех известных нам комплексах древних роботов двери всегда были ровно в три такие секции шириной.

— Но как нам их найти? Стена огромная, а сканирование всей поверхности потребует значительных ресурсов и времени, — задумался Альфа.

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

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

В первой строке дано единственное целое число \(n\) — количество секций стены (\(3 \leqslant n \leqslant 100\)). Во второй строке через пробел записаны \(n\) положительных целых чисел \(a_i\) — сила магнитного поля на каждой из секций (\(1 \leqslant a_i \leqslant 100\)).

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

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

Решение

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

Python
n = int(input())
a = list(map(int, input().split()))
max_sum = 0
middle_index = 0
for i in range(1, n-1):
    current_sum = a[i-1] + a[i] + a[i+1] 
    if current_sum > max_sum:
        max_sum = current_sum
        middle_index = i + 1
print(max_sum, middle_index)

Тестовые данные

Номер тестаСтандартный вводСтандартный вывод
1
4
2 4 6 1
12 2
2
6
12 3 56 1 32 12
89 4
3
3
1 4 7
12 2
Задача 3.5.(2 балла)
Сопоставление понятий ROS
Темы: Python, ROS

Условие

Сопоставьте термины используемые в ROS (Robot Operating System) с их описаниями.

Описания / Термины Publisher Subscriber Service Node Topic
Основной элемент, обеспечивающий обмен данными между узлами
Способ синхронного обмена запросами и ответами между узлами
Объект, который отправляет сообщения в ROS
Объект, который получает сообщения из ROS
Основной строительный блок ROS, выполняющий определенную задачу или функцию

Ответ

Приведен в таблице 3.

Описания / Термины Publisher Subscriber Service Node Topic
Основной элемент, обеспечивающий обмен данными между узлами +
Способ синхронного обмена запросами и ответами между узлами +
Объект, который отправляет сообщения в ROS +
Объект, который получает сообщения из ROS +
Основной строительный блок ROS, выполняющий определенную задачу или функцию +
Задача 3.6.(2 балла)
Сопоставление функций и методов ROS
Темы: Python, ROS

Условие

Сопоставьте методы библиотеки rospy с их описаниями.

Описания / Термины rospy.init_node() rospy.Publisher() rospy.Subscriber() rospy.spin() rospy.Service()
Метод для создания и инициализации узла ROS
Метод для создания подписчика на определенную тему
Метод для создания сервиса
Метод для создания издателя сообщений
Метод, который запускает цикл обработки сообщений и обеспечивает работу узла

Ответ

Приведен в таблице 4.

Метод для создания и инициализации узла ROS +
Метод для создания подписчика на определенную тему +
Метод для создания сервиса +
Метод для создания издателя сообщений +
Метод, который запускает цикл обработки сообщений и обеспечивает работу узла +
Задача 3.7.(2 балла)
Сопоставление типов сообщений
Темы: Python, ROS

Условие

Сопоставьте типы сообщений ROS с их примерами использования.

Описания / Термины std_msgs/String geometry_msgs/Twist sensor_msgs/Image nav_msgs/Odometry std_msgs/Float64
Используется для передачи информации о положении и ориентации в пространстве
Используется для передачи изображений с камер
Используется для передачи текстовых данных
Используется для управления движением робота, например, линейной и угловой скоростью
Используется для передачи данных о числовых значениях с плавающей точкой

Ответ

Приведен в таблице 5.

Описания / Термины std_msgs/String geometry_msgs/Twist sensor_msgs/Image nav_msgs/Odometry std_msgs/Float64
Используется для передачи информации о положении и ориентации в пространстве +
Используется для передачи изображений с камер +
Используется для передачи текстовых данных +
Используется для управления движением робота, например, линейной и угловой скоростью +
Используется для передачи данных о числовых значениях с плавающей точкой +
text slider background image text slider background image
text slider background image text slider background image text slider background image text slider background image