Инженерный тур. 1 этап
Задачи инженерного тура разделены на три категории: программирование (Python, ROS), электроника (Arduino, C++), 3D-моделирование. Участникам необходимо индивидуально выполнить задачи одного из разделов профиля (или нескольких по желанию).
Первое задание предназначено для проверки настроек вашего программного обеспечения. Ответ содержится в тексте задачи, убедитесь, что вы получаете его правильно.
- Создайте кубик со стороной 30 мм, как представлено на рис. 1.1.
- Вычислите объем детали при помощи вашего ПО — должно получиться 27000 \(\textrm{мм}^{3}\).
Каждое ребро кубика скруглите радиусом 3 мм.
Рис. 1.1. Калибровочный куб- Вычислите объем полученной детали при помощи вашего ПО — должно получиться \(26340{,}849\) \(\text{мм}^3\).
- Установите материал кубика — алюминий (\(\rho=2{,}7~\text{г}/\text{см}^3\)).
- Вычислите массу полученной детали при помощи вашего ПО. Она должна получиться примерно \(0{,}0712\) кг.
- Запишите массу полученной детали в ответ в граммах с точностью до \(0{,}1\) г.
Ответы получаются автоматически при использовании специального ПО для 3D-моделирования.
71,2 \(\pm\) 1 г.
Однажды при исследовании поверхности Луны с помощью робота космонавт Василий по неосторожности сломал последнему манипулятор, неудачно попытавшись протиснуть захват между камнями. Исследования нужно было продолжать, поэтому Василий решил починить робота и изготовить сломанную деталь. Помогите космонавту разработать ее 3D-модель по чертежу.
Последовательность действий:
- Сделайте 3D-модель детали (рис. 1.2) согласно чертежу (рис. 1.3), имея ввиду, что размеры указаны в миллиметрах.
- Установите материал — алюминий. Плотность \(2{,}7~\text{г}/\text{см}^3\).
- Укажите объем полученной детали с точностью \(1\%\) и округлением до 1 \(\text{мм}^3\).

Ответы рассчитываются автоматически при корректном использовании специального ПО для 3D-моделирования.
23484 \(\text{мм}^3\).
Теперь, когда сломанная деталь починена и можно продолжать исследования, Василий задумался о том, что во избежание повторения ситуации с поломкой, ему необходимо немного доработать захват робота. Василий придумал нарастить звено дополнительной деталью.
Последовательность действий:
- Сделайте 3D-модель детали согласно чертежу (рис. 1.4), имея ввиду, что размеры указаны в миллиметрах.
- Установите материал — латунь. Плотность \(8{,}470~\text{г}/\text{см}^3\).
- Запишите вес детали в граммах с точностью \(1\%\) и округлением до 0,1 г.
Ответы получаются автоматически при использовании специального ПО для 3D-моделирования.
141,7 г.
Наконец, все детали, необходимые для ремонта, спроектированы. Василий будет их собирать, используя винты М4\(\times\)8 (рис. 1.5), правда, деталь из латуни оказалась тяжелой, и космонавт сделал ее из очень секретного космического материала с плотностью \(1{,}345~\text{г}/\text{см}^3\).
Винты изготовлены в соответствии со стандартом DIN 7985 из стали. Для расчетов переопределите массы винтов, для М4\(\times\)8 — 2 г.
Рассчитайте массу собранной детали. Запишите ответ и округлите до 0,1 г. Допустимая погрешность \(0{,}5\%\).
Ответы получаются автоматически при использовании специального ПО для 3D-моделирования.
93,908 г.
Свершилось! Модифицированное звено манипулятора установлено на робота, и теперь Василий может продолжить работу. Однако с роботами всегда все непросто — управляющая программа рассчитана на работу только с оригинальной деталью, а чтобы она учитывала сборку из двух деталей, которую установил Василий, необходимо внести корректировку — указать смещение центра масс нового звена (сборка из задачи \eqref{aero-first-task-04}) относительно старого (модель задачи \eqref{aero-first-task-02}).
Для расчетов выберите правильную точку начала координат, она совпадает с местом крепления оригинальной детали (рис. 1.6).
- На схеме указано направление координатных осей и место, в котором находится точка начала отсчета.
- Рассчитайте координаты \(X\) центра масс оригинальной детали.
- Рассчитайте координаты центра масс собранной конструкции.
Найдите смещение, необходимое Василию. Для этого:
- Посчитайте разность положений центра масс нового и старого звена по всем трем осям (\(Dx\), \(Dy\), \(Dz\)).
- Вычислите расстояние между центрами масс нового и старого звена в миллиметрах.
Ответы получаются при использовании специального ПО для 3D-моделирования. Необходимо установить начало координат в указанную точку и относительно нее:
- рассчитать расположение ЦМ старого звена — (\(X\): 102,679, \(Y\): 0,829, \(Z\): 7,145 мм);
- вычислить расположение ЦМ нового звена — (\(X\): 135,647, \(Y\): 0,56, \(Z\): 7,797 мм);
- получить разницу: \(Dx\) \(32{,}968\) мм, \(Dy\): \(-0{,}269\) мм, \(Dz\): \(0{,}652\) мм;
- определить длину полученного вектора (как корень из суммы квадратов): 32,9755438.
Смещение 32,98 мм.
Соотнесите компоненты Arduino с их описанием.
- Резистор.
- Светодиод (LED).
- Потенциометр.
- Датчик ультразвука.
- Серво.
- Изменяет сопротивление и регулирует уровень сигнала.
- Излучает свет при подаче на него напряжения.
- Используется для измерения расстояния до объекта.
- Ограничивает ток в цепи.
- Используется для создания вращательного движения на заданный угол.
1 — D, 2 — B, 3 — A, 4 — C, 5 — E.
Какой из следующих типов двигателей может использоваться с платой Arduino для создания робота, который может точно управлять своим положением?
- Коллекторный двигатель постоянного тока.
- Серво.
- Шаговый двигатель.
- Генератор.
B — Серво, C — Шаговый двигатель.
Соотнесите функции Arduino с их описанием.
pinMode()digitalRead()analogWrite()delay()serialBegin()
- Настраивает пин как вход или выход.
- Считывает значение с цифрового пина.
- Отправляет аналоговый сигнал на пин.
- Приостанавливает выполнение программы на заданное время.
- Инициализирует последовательное соединение.
1 — A, 2 — B, 3 — C, 4 — D, 5 — E.
Определите, какие действия выполняют следующие строки кода.
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
- Включает встроенный светодиод на 1 с, затем выключает его на 1 с.
- Включает встроенный светодиод на 1000 мс.
- Включает внешний светодиод, подключенный к пину 13.
- Считывает состояние встроенного светодиода.
Запустить код в симуляторе или на живой Arduino и проверить.
А.
С помощью Arduino Uno, резистора на 10 кОм и кнопки собрана следующая схема (рис. 2.1).

Кнопка имеет следующую схему (рис. 2.2).
На Arduino IDE загружен и работает код.
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-порт, когда кнопка нажата и зажата:
- Press the button.
- The button is pressed.
- The button is released.
Собрать схему вживую или через сервис https://wokwi.com и запустить предложенный код.
C.
В наличии у программиста Василия оказался Дисплей LCD 16\(\times\)2 (\(\textrm{I}^2\textrm{C}\)) и Arduino Uno. Он написал код для того, чтобы с помощью этого признаться в любви конструктору Кате. Но вот незадача — он совсем не знает, как подключить этот дисплей, чтобы все нормально функционировало. Помогите Василию подключить дисплей, чтобы его код заработал.
#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.3), написал код, но что-то пошло не так, и ничего не работает.
Помогите Виталию и найдите номер строки, в которой закралась ошибка.
#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.
Робот должен суммировать цифры идентификатора ресурса, чтобы понять, сколько единиц ресурса необходимо для выполнения задания. Напишите программу на языке Python 3, содержащую функцию resource_sum(identifier), которая принимает числовой идентификатор ресурса и возвращает сумму его цифр.
Ниже представлено решение на языке 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 |
Напишите программу, в которой рассчитывается пройденный путь одноколесным роботом, если известны радиус его колеса и число совершенных полных оборотов колеса. Округлите число \(\pi\) до \(3{,}14\).
Формат входных данных
Вводятся два положительных числа в одну строку через пробел: радиус колеса и количество полных оборотов.
Формат выходных данных
Выведите одно число, округленное до сотых.
Ниже представлено решение на языке 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.1). Напишите программу, которая определяет, может ли робот попасть с первой заданной клетки на вторую одним ходом.
Формат входных данных
Вводится 2 пары чисел от 1 до 8 каждое (всего 4 числа), задающие положение первоначальной и конечной клеток по горизонтали и вертикали соответственно.
Формат выходных данных
Выведите YES, если из первой клетки одним ходом робот можно попасть во вторую, или NO в противном случае.
Ниже представлено решение на языке 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 |
Два робота, Альфа и Бета, — ведущие специалисты в области робототехники и искусственного интеллекта. Когда-то они основали крупнейший научный центр по разработке роботов, который объединил инженеров и программистов со всего мира. Даже спустя годы Альфа и Бета остаются активными участниками всех значимых проектов. Когда исследователи обнаружили остатки древнего робототехнического комплекса, построенного неизвестной цивилизацией, Альфа и Бета первыми отправились на место находки. Ведь древние роботы были невероятно продвинутыми, и любое их изучение могло значительно подтолкнуть современные разработки.
Добравшись до комплекса, роботы увидели лишь слегка выступающую из скалы металлическую стену, разделенную на небольшие одинаковые секции.
— Где же вход? — спросил Альфа.
— Очевидно, он скрыт, — ответил Бета. — Ты же не думал, что древние роботы оставили бы открытый доступ к своим разработкам. У них всегда были продуманные системы защиты. Но я почти уверен, что где-то среди этих секций есть настоящий вход. Причем во всех известных нам комплексах древних роботов двери всегда были ровно в три такие секции шириной.
— Но как нам их найти? Стена огромная, а сканирование всей поверхности потребует значительных ресурсов и времени, — задумался Альфа.
— Я чувствую, что хоть на всей стене действует система маскировки, ее интенсивность разная. И скорее всего, она сильнее всего там, где находится дверь. Я уже запустил программу анализа магнитных полей, и скоро у нас будет информация о том, с какой силой поле действует на каждой из секций. Нам останется лишь выбрать три подряд идущие секции с максимальной суммарной силой поля и сосредоточить на них ресурсы для открытия двери.
Формат входных данных
В первой строке дано единственное целое число \(n\) — количество секций стены (\(3 \leqslant n \leqslant 100\)). Во второй строке через пробел записаны \(n\) положительных целых чисел \(a_i\) — сила магнитного поля на каждой из секций (\(1 \leqslant a_i \leqslant 100\)).
Формат выходных данных
Выдайте через пробел два числа — максимальную суммарную силу поля возле трех подряд идущих секций стены и номер средней из них.
Ниже представлено решение на языке 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 |
Сопоставьте термины используемые в ROS (Robot Operating System) с их описаниями.
| Описания / Термины | Publisher | Subscriber | Service | Node | Topic |
|---|---|---|---|---|---|
| Основной элемент, обеспечивающий обмен данными между узлами | |||||
| Способ синхронного обмена запросами и ответами между узлами | |||||
| Объект, который отправляет сообщения в ROS | |||||
| Объект, который получает сообщения из ROS | |||||
| Основной строительный блок ROS, выполняющий определенную задачу или функцию |
Приведен в таблице 3.
| Описания / Термины | Publisher | Subscriber | Service | Node | Topic |
|---|---|---|---|---|---|
| Основной элемент, обеспечивающий обмен данными между узлами | + | ||||
| Способ синхронного обмена запросами и ответами между узлами | + | ||||
| Объект, который отправляет сообщения в ROS | + | ||||
| Объект, который получает сообщения из ROS | + | ||||
| Основной строительный блок ROS, выполняющий определенную задачу или функцию | + |
Сопоставьте методы библиотеки rospy с их описаниями.
| Описания / Термины | rospy.init_node() |
rospy.Publisher() |
rospy.Subscriber() |
rospy.spin() |
rospy.Service() |
|---|---|---|---|---|---|
| Метод для создания и инициализации узла ROS | |||||
| Метод для создания подписчика на определенную тему | |||||
| Метод для создания сервиса | |||||
| Метод для создания издателя сообщений | |||||
| Метод, который запускает цикл обработки сообщений и обеспечивает работу узла |
Приведен в таблице 4.
| Метод для создания и инициализации узла 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 |
|---|---|---|---|---|---|
| Используется для передачи информации о положении и ориентации в пространстве | + | ||||
| Используется для передачи изображений с камер | + | ||||
| Используется для передачи текстовых данных | + | ||||
| Используется для управления движением робота, например, линейной и угловой скоростью | + | ||||
| Используется для передачи данных о числовых значениях с плавающей точкой | + |







