Глава 20 из 27

Бесплатно

5: Творческие проекты

⏱️ 70-85 минут
📊 intermediate

Глава 20: "Программируем роботов"

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

— Доброе утро, Профессор! Что это у вас? — спросила Алиса с любопытством.

Профессор обернулся и улыбнулся:
— А, Алиса! Рад тебя видеть. Это наша сегодняшняя тема — робототехника!

Байт подъехал ближе, явно заинтересованный:
— Вот это да! Моя дальняя родня!

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

Железо, схемы, взгляд сенсора —
Не просто ящик на колёсах.
Ему даём мы роль актёра
В театре улиц, цехов, космоса.

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

Код — это воля и задача,
Сенсор — глаза, мотор — шаги.
Робот послушен, если чётко
Ему прописаны пути.

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

— Знакомься, это Роби, — представил Профессор. — Он может двигаться вперёд и назад, поворачивать, обнаруживать препятствия и следовать по линии. Но самое главное — мы можем программировать его поведение!

Роби в лаборатории: блоки Scratch и программирование робота

— Как именно мы программируем роботов? — спросила Алиса, присаживаясь рядом с Роби.

— Есть разные способы, — ответил Профессор. — Для простых роботов, как Роби, мы можем использовать визуальное программирование с блоками, похожими на Scratch. Для более сложных — специализированные языки, такие как ROS (Robot Operating System) или стандартные языки программирования, такие как Python и C++.

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

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

На экране компьютера появился редактор блочного программирования. Профессор перетащил несколько блоков в рабочую область:


Copy
ПОКА Истина:
ЕСЛИ датчик_расстояния() > 10:
двигаться_вперед(50)
ИНАЧЕ:
остановиться()
повернуть_направо(90)

— Эта программа создаёт бесконечный цикл, — объяснил Профессор. — Внутри цикла робот проверяет показания датчика расстояния. Если до препятствия больше 10 сантиметров, робот движется вперёд со скоростью 50 единиц. Если препятствие ближе, робот останавливается и поворачивает на 90 градусов вправо.

— А можно загрузить программу в Роби? — с нетерпением спросила Алиса.

— Конечно! — Профессор нажал кнопку "Загрузить", и маленькие огоньки на панели Роби замигали. — Теперь поставим его на пол и посмотрим, как он справится.

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

— Он работает! — восхитилась Алиса. — Но что, если мы хотим, чтобы он выполнил определённый маршрут?

— Хороший вопрос, — улыбнулся Профессор. — Для этого мы можем использовать последовательность команд вместо реакции на датчики. Например:


Copy
двигаться_вперед(50, 2) # двигаться вперёд со скоростью 50 в течение 2 секунд
повернуть_налево(90) # повернуть налево на 90 градусов
двигаться_вперед(50, 1) # двигаться вперёд ещё 1 секунду
повернуть_направо(90) # повернуть направо на 90 градусов
двигаться_вперед(50, 3) # двигаться вперёд 3 секунды

— Такая программа заставит Роби выполнить определённую последовательность движений, — пояснил Профессор. — Но есть проблема: если в процессе движения он встретит препятствие, он просто врежется в него.

— Можно ли сочетать оба подхода? — спросила Алиса. — Выполнять маршрут, но при этом реагировать на препятствия?

— Отличная мысль! — похвалил Профессор. — Это один из ключевых принципов робототехники — сочетание планового поведения и реакции на окружающую среду. Вот как это может выглядеть:


Copy
маршрут = [
{"действие": "вперед", "значение": 2},
{"действие": "поворот_налево", "значение": 90},
{"действие": "вперед", "значение": 1},
{"действие": "поворот_направо", "значение": 90},
{"действие": "вперед", "значение": 3}
]

текущий_шаг = 0

ПОКА текущий_шаг < длина(маршрут):
шаг = маршрут[текущий_шаг]

ЕСЛИ шаг["действие"] == "вперед":
времяначала = текущеевремя()
ПОКА (текущеевремя() - времяначала < шаг["значение"]) И (датчик_расстояния() > 10):
двигаться_вперед(50)

ЕСЛИ датчик_расстояния() <= 10:
# Обнаружено препятствие - реагируем
остановиться()
объехать_препятствие()

ИНАЧЕ ЕСЛИ шаг["действие"] == "поворот_налево":
повернуть_налево(шаг["значение"])

ИНАЧЕ ЕСЛИ шаг["действие"] == "поворот_направо":
повернуть_направо(шаг["значение"])

текущийшаг = текущийшаг + 1

— Это уже выглядит сложнее, — заметила Алиса, изучая код.

— Да, роботы часто требуют достаточно сложных программ, — согласился Профессор. — В этом примере мы храним маршрут как список словарей, где каждый шаг имеет тип действия и значение. Затем мы выполняем каждый шаг по порядку, но при движении вперёд постоянно проверяем датчик расстояния. Если обнаруживается препятствие, мы прерываем текущее движение и вызываем функцию для объезда препятствия.

— А как работает функция объехать_препятствие()? — спросила Алиса.

— Это может быть отдельная подпрограмма, — пояснил Профессор. — Например:


Copy
функция объехать_препятствие():
повернуть_направо(45)
двигаться_вперед(50, 0.5)
повернуть_налево(45)
ПОКА датчик_расстояния() > 10:
двигаться_вперед(30)
повернуть_налево(90)
двигаться_вперед(50, 1)
повернуть_направо(90)

— Эта функция заставляет робота отклониться вправо, затем двигаться параллельно препятствию, обойти его и вернуться к первоначальному направлению, — объяснил Профессор.

Байт продемонстрировал эту последовательность движений, имитируя действия Роби:
— В робототехнике такое поведение называется "избегание препятствий" и является одним из базовых навыков для мобильных роботов.

— А если мы хотим, чтобы робот сам нашёл путь к цели? — спросила Алиса.

— Тогда мы используем алгоритмы планирования пути, — ответил Профессор. — Например, алгоритм A\* (А-звёздочка) или алгоритм Дейкстры. Они позволяют роботу найти оптимальный путь от текущей позиции к цели, учитывая препятствия на карте.

Профессор показал на экране другую программу:


Copy
карта = [
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 0],
[0, 1, 1, 1, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 1, 1, 0],
[0, 1, 0, 1, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0]
] # 0 - свободное пространство, 1 - препятствие

начало = (0, 0)
цель = (7, 7)

путь = найти_путь(карта, начало, цель)

для каждой точки (x, y) в пути:
двигатьсякточке(x, y)

— Здесь мы представляем окружающее пространство как двумерную сетку, — объяснил Профессор. — Каждая ячейка либо свободна (0), либо содержит препятствие (1). Функция найти_путь() использует алгоритм поиска пути, чтобы определить последовательность точек от начала до цели. Затем робот последовательно двигается через эти точки.

— А что если карта заранее неизвестна? — поинтересовалась Алиса.

— Отличный вопрос! — похвалил Профессор. — В таком случае робот должен сначала исследовать окружающую среду и построить карту с помощью своих датчиков. Это называется SLAM — Simultaneous Localization and Mapping (одновременная локализация и картографирование).

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

Профессор достал из шкафа ещё одного робота, более сложного, с манипулятором-рукой:
— А это Арми. Помимо перемещения, он может взаимодействовать с предметами с помощью манипулятора. Это добавляет новый уровень сложности в программирование.

Он продемонстрировал простую программу для Арми:


Copy

Подъехать к кубику


двигатьсяккоординатам(x, y)

Опустить манипулятор


установитьвысотуманипулятора(5)

Захватить кубик


закрыть_захват()

Поднять манипулятор


установитьвысотуманипулятора(20)

Перевезти кубик в другое место


двигатьсяккоординатам(новыйx, новыйy)

Опустить манипулятор


установитьвысотуманипулятора(5)

Отпустить кубик


открыть_захват()

Поднять манипулятор


установитьвысотуманипулятора(20)

— Для программирования роботов-манипуляторов используются специальные подходы, — пояснил Профессор. — Например, кинематика — математическое описание движения, не учитывающее силы, которые вызывают это движение. Есть прямая кинематика (расчёт положения захвата по углам суставов) и обратная кинематика (расчёт необходимых углов суставов для достижения заданного положения захвата).

— Звучит сложно, — заметила Алиса.

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

— Но в робототехнике есть и особенности, — добавила Логик. — Например, параллельное выполнение задач. Робот может одновременно двигаться, сканировать окружение и обрабатывать команды пользователя. Для этого используются многопоточность или асинхронное программирование.

— Ещё одна важная концепция — это обратная связь, — продолжил Профессор. — Робот постоянно проверяет, достиг ли он желаемого состояния, и корректирует свои действия. Например:


Copy
желаемый_угол = 90
текущийугол = получитьугол_поворота()

ПОКА абсолютноезначение(желаемыйугол - текущий_угол) > 1:
если желаемыйугол > текущийугол:
повернуть_направо(10)
иначе:
повернуть_налево(10)

текущийугол = получитьугол_поворота()

— Этот код заставляет робота поворачиваться, пока он не достигнет желаемого угла с точностью до 1 градуса, — объяснил Профессор. — Такие контуры обратной связи позволяют роботам точно выполнять команды, несмотря на неидеальность механики и внешние факторы.

— А что насчёт искусственного интеллекта в роботах? — спросила Алиса. — Могут ли роботы учиться и принимать решения самостоятельно?

— Абсолютно! — кивнул Профессор. — Современные роботы часто используют методы машинного обучения. Например, робот может научиться распознавать объекты на изображениях с камеры или оптимизировать свои движения для экономии энергии.

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

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

— А какие бывают виды роботов? — спросила Алиса.

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

— Робототехника — это междисциплинарная область, объединяющая механику, электронику, компьютерные науки, теорию управления и множество других дисциплин, — подытожила Логик. — И программирование — важнейшая часть этой области, ведь именно программы делают роботов "умными".


Задание

Придумай и опиши своего робота. Какие у него будут функции? Как он будет выглядеть? Какие датчики и механизмы ему понадобятся? Напиши простой алгоритм (в виде последовательности шагов или блок-схемы) для одной из задач твоего робота. Например, как он должен действовать, чтобы полить все цветы в доме или найти и принести определённый предмет.