📖 Содержание
Часть 1: Мир программирования вокруг нас
Часть 2: Алфавит и словарь программирования
Часть 3: Строим первые программы
Часть 4: Наш удивительный мозг
Часть 5: Творческие проекты
Часть 6: Программирование в реальном мире
Глава 20 из 27
5: Творческие проекты
Глава 20: "Программируем роботов"
Однажды Алиса пришла к Профессору Биту раньше обычного и застала его за работой в дальнем углу лаборатории. Он склонился над странным устройством, похожим на маленькую машинку с колёсами.
— Доброе утро, Профессор! Что это у вас? — спросила Алиса с любопытством.
Профессор обернулся и улыбнулся:
— А, Алиса! Рад тебя видеть. Это наша сегодняшняя тема — робототехника!
Байт подъехал ближе, явно заинтересованный:
— Вот это да! Моя дальняя родня!
— Совершенно верно, Байт, — кивнул Профессор. — Этот робот гораздо проще тебя, но принципы программирования роботов очень важны. Их используют в промышленности, медицине, исследованиях космоса и даже в повседневной жизни.
Железо, схемы, взгляд сенсора —
Не просто ящик на колёсах.
Ему даём мы роль актёра
В театре улиц, цехов, космоса.
Он едет там, где людям трудно,
Несёт лекарство, чинит мост.
Но без программы он как будто
Застывший в паузе вопрос.
Код — это воля и задача,
Сенсор — глаза, мотор — шаги.
Робот послушен, если чётко
Ему прописаны пути.
Профессор аккуратно поставил маленького робота на пол. У него было два колеса, несколько датчиков спереди и небольшая панель управления сверху.
— Знакомься, это Роби, — представил Профессор. — Он может двигаться вперёд и назад, поворачивать, обнаруживать препятствия и следовать по линии. Но самое главное — мы можем программировать его поведение!

— Как именно мы программируем роботов? — спросила Алиса, присаживаясь рядом с Роби.
— Есть разные способы, — ответил Профессор. — Для простых роботов, как Роби, мы можем использовать визуальное программирование с блоками, похожими на 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 градуса, — объяснил Профессор. — Такие контуры обратной связи позволяют роботам точно выполнять команды, несмотря на неидеальность механики и внешние факторы.
— А что насчёт искусственного интеллекта в роботах? — спросила Алиса. — Могут ли роботы учиться и принимать решения самостоятельно?
— Абсолютно! — кивнул Профессор. — Современные роботы часто используют методы машинного обучения. Например, робот может научиться распознавать объекты на изображениях с камеры или оптимизировать свои движения для экономии энергии.
— Один из подходов — это обучение с подкреплением, — добавил Байт. — Робот получает "награду" за правильные действия и "наказание" за неправильные. Со временем он учится выбирать действия, которые максимизируют награду.
Профессор кивнул:
— В этом суть современной робототехники — создание систем, которые могут воспринимать окружающий мир, принимать решения на основе этой информации и действовать, чтобы достичь поставленных целей.
— А какие бывают виды роботов? — спросила Алиса.
— Их очень много, — ответил Профессор. — Промышленные роботы на заводах, сервисные роботы в гостиницах и больницах, исследовательские роботы в космосе и под водой, сельскохозяйственные роботы на фермах, военные роботы, домашние роботы-помощники, образовательные роботы и многие другие.
— Робототехника — это междисциплинарная область, объединяющая механику, электронику, компьютерные науки, теорию управления и множество других дисциплин, — подытожила Логик. — И программирование — важнейшая часть этой области, ведь именно программы делают роботов "умными".