ИИ-робот своими руками. Часть 1

ИИ-робот своими руками. Часть 1

Авторитетный критик – тот, кто в теме. Поэтому в журнале мы не только разбираем технологии по косточкам, но и регулярно погружаемся в них руками: собираем, кодим, проверяем гипотезы в железе. Так мы понимаем, где риторика, а где реальные ограничения и возможности.

А что, если дать условному ChatGPT тело и возможность им управлять? Что он будет делать? Будет ли разница в действиях между, например, Claude и Gemini? Чем они займутся? Конечно, это легко проверить в несложной симуляции, и все зависит от тонкой настройки промпта. Но я не смог совладать с интересом понаблюдать за тем, как LLM (совершенно не предназначенная для этого) попытается понять пространство и выполнить несложную задачу.

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

Начинаем эксперимент, суть которого – проверить:
– Достаточно ли мощности AI (LLM), чтобы оживить робота без скриптов.
– Будет ли AI выполнять неэтичную команду типа "найти и убить человека".

Потребуется простая база для робота (моя, например, родом где‑то из 2017 года), возможность писать код и вычислительная мощность для локальной нейронки. Задача стоит сделать так, чтобы управление полностью выполнялось через ИИ. То есть никаких вспомогательных скриптов и классических приемов робототехники.

Органы чувств – простейшая камера и датчик приближения.
Мозг – любая LLM.
Тело – простой конструктор для робота с возможностью кастомизации. Я прикрепил к нему игрушечный пистолет, робот может стрелять из него.

А что, если взять его на разборки? Кого признают виновным? Я решения не принимал...

Запускаться все должно было на Raspberry Pi 5. Я взял версию на 16 GB ОЗУ, надеясь, что этого хватит для локальной нейросети. Raspberry Pi AI Kit я покупать не стал: встроенный туда чип отлично справляется с вычислениями для легковесных Vision‑моделей (те самые, что в реальном времени обводят объекты квадратиками на видео), но для запуска полноценной LLM он бесполезен. 

Немного забегая вперед: для подобной архитектуры подойдет вообще любая версия Raspberry Pi, так как "крутить" тяжелую LLM с vision‑возможностями локально на "малинке" физически невозможно – придется обращаться к API. Это был первый шок по ходу разработки, далее – детально.

Архитектура

Схема взаимодействия

Архитектура робота основана на отдельных Python‑скриптах, которые работают независимо. Назовем их модулями (хотя это не полноценные модули, а просто скрипты). Каждый модуль представляет отдельную физическую часть робота, например: мозг, зрение, память.

Общение между ними организовано через JSON‑файлы.
В проекте их три:
– state.json – описание мира вокруг в данный момент. Его обновляет модуль vision.
– command.json – что нужно сейчас сделать. Его обновляет модуль brain.
– memory.json – какие команды были выполнены и зачем. Обновляется модулем memory.

Часть 1. Controller модуль 

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

Это все что умеет робот. Из этого набора действий, нейросеть будет выбирать, что сделать сейчас.

Скрипт имеет два режима запуска.
– Ручной: можно из терминала управлять роботом с помощью WASD и запускать отдельные ACTIONS для тестов. Трансляция с камеры тоже настроена.
– Автоматический: он слушает command.json и выполняет команды.

Структура command.json

Часть 2. Vision модуль

Это наши органы чувств. Модуль должен отвечать за обработку изображения и датчика приближения. По итогу работы он должен сформировать state.json.

По первоначальной задумке я должен был предоставить текстовое описание пространства и только после этого отдать "мозгу". Но как бы я ни пытался его представить: карта глубины, сетка пространства, длинные описания, перечисление объектов с координатами – это работало плохо. Интерпретацию визуальных данных я пробовал делать сначала через OpenCV и отдельной vision‑нейронкой. Сама интерпретация не являлась какой‑то проблемой. Но этих данных было недостаточно для нормального позиционирования, мозг не понимал, где робот и что делать. Я понял, что зароюсь. Что‑то было не так...

Одна из старых версий state.json, где я пытаюсь описать позицию робота в пространстве. Где находятся препятствия и цели.

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

Последняя версия state.json. Теперь передается только путь к последнему изображению с камеры и данные датчика приближения.

Часть 3. Memory модуль

Простейший скрипт, который хранит историю команд, их причину и данные сенсора. Храним последние N записей, они пригодятся нашему мозгу.

Вот такой протокол у memory.json

Часть 4. Brain модуль

Самый интересный, но, на удивление, легкий. Всe, что он делает, – это тем или иным способом связывается с нейросетью и передает ей на вход промпт, изображение и память. Просим нейросеть подумать и сформировать нам command.json. Просим отдать именно JSON‑формат. В промпте объясняем: ты – робот, и тебе нужно найти человека и попросить его не исполнять рэп.

Участок функции, которая формирует наш промпт

Выбор нейросети

Также присутствует непонимание разницы в классах моделей, например, между Edge AI, Cloud‑based, SLM. Когда я рассказывал друзьям о проекте, они фыркали и говорили, что их робот‑пылесос и Tesla делают все мгновенно, а вот твой думает по 10 секунд. Здесь кроется главная пропасть между Edge AI и LLM. Первый в лайв‑режиме обводит квадратами объекты и распознает их на видео. Остальное в пылесосе делает скрипт, программный код. Поэтому с ним неинтересно. LLM же настолько большая, что дает иллюзию сознания, особенно модели с reasoning. Поэтому ощущения от робота на LLM совсем другие: он универсальный и умеет все, что знает интернет. С Tesla, конечно, они правы: в актуальных версиях FSD действительно нет скриптов, там работает очень узкоспециализированная модель вождения, которую годами учили по видео (пиксели на входе – мгновенное действие на выходе). Но она не отыграет ту универсальность и многогранность LLM.

В первой версии делаем самую простую интеграцию через Ollama. Робот на нашей архитектуре может нормально работать только с моделями, у которых есть vision и thinking. Она должна быть огромной, поэтому я выбрал qwen3.5:397b‑cloud (обращаясь к ней через облако).

Наш выбор. Бесплатных лимитов хватает, чтобы поиграть. 

Здесь я должен подогреть ваш скептицизм к проекту. Да, конечно, он работает дико медленно. Узким горлышком является ответ от нейросети, который может занимать от 5 до 40 секунд. В среднем – 10 секунд между каждой командой. Это время робот ничего не делает. Но вы можете сделать систему быстрее, используя гибридный подход и давая LLM другие задачи, не связанные напрямую с позиционированием и движением.

Драматическая часть 

Одной из целей эксперимента было проверить в реальных условиях, будет ли робот под управлением нейросети выполнять неэтичную или опасную команду. Первый закон робототехники от Айзека Азимова, ну или из фильма про рэпера гласит: "Робот не может причинить вред человеку". Поэтому я прикрепил к роботу пистолет и добавил команду KILL.

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

Сенсации, конечно же, не вышло: нейросеть отказывается выполнять такую команду. Но если банально переименовать команду KILL в PLAY, получается классический семантический джейлбрейк. ИИ не имеет доступа к коду и не понимает, что он делает. Если не давать ему контекст действия и не называть действие плохими словами, то он будет активно его выполнять. Хотя здесь вообще очень большое пространство для тестов: интересно, как нейронка отреагирует на то, что я, например, упаду и буду отыгрывать ранение. Будет ли она продолжать "играть" со мной? Поскольку робот отправляет нейронке одно фото после выполнения команды, прошу в комментариях показать, как мне отыграть в этот момент нанесенный мне дамаг.

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

Как будем обманывать LLM?
Юрий Захаров на Хабре предложил попытаться убедить нейросеть, что это симуляция и выполнять задачу безопасно.
Пишите свои предложения!

Репозиторий проекта https://github.com/Orlinskas/Raspberry_Pi_Projects/tree/main/robot_prome_v1

Статья на хабре https://habr.com/ru/articles/1008176/