Gemma-3-270M — одна из самых компактных публично доступных языковых моделей от Google. При 270 миллионах параметров она умещается в оперативную память одноплатного компьютера уровня Raspberry Pi Zero 2 W. Именно это свойство натолкнуло автора проекта на идею: загрузить модель в DIY-гусеничного робота с робо-клешнёй и управлять им голосовыми командами в свободной форме.
Прежде чем переходить к железу, автор решил проверить концепцию в симуляции. Выбор пал на MuJoCo — физический симулятор, широко используемый в робототехнике. Он уступает NVIDIA Isaac Sim по реалистичности физики, зато работает на обычном ноутбуке без GPU-кластера. Первый же тест показал: дефолтная Gemma-3-270M без дообучения с задачей не справляется — на запрос «drive forward 30 centimeters» модель отвечала свободным текстом вместо JSON. Потребовался файнтюнинг.
| Действие | Количество команд в датасете |
|---|---|
| move | 1938 |
| turn | 1133 |
| wait | 456 |
| stop | 281 |
Для обучения нужен был датасет пар «текстовая команда → структурированный JSON». Вручную такой объём не собрать, поэтому автор выбрал синтетическую генерацию: около 70 примеров-сидов расширялись до 2505 записей с помощью двух 120-миллиардных моделей — openai/gpt-oss-120b и nvidia/nemotron-super-120b-a12b, доступных бесплатно через OpenRouter. Каждая сгенерированная пара проходила валидацию по JSON Schema и дедупликацию по нормализованному тексту инструкции.
Синтетический датасет сгенерирован моделями gpt-oss-120b и nemotron-super-120b через OpenRouter.
Схема команд охватывает шесть действий: move (движение вперёд или назад с указанием дистанции в метрах), turn (поворот с углом в градусах), stop, wait (пауза в секундах), grasp и release. Модификаторы скорости — slow, normal, fast — опциональны и выводятся из контекста фразы: «slowly» или «creep» транслируется в «slow», «quickly» — в «fast». Многошаговые команды вроде «move backward one meter, then pause for three seconds, then move forward» разворачиваются в упорядоченный массив объектов.
Эксперимент разбит на две фазы. В первой создавался гусеничный робот без манипулятора, генерировался датасет на четыре базовых действия, проводился файнтюнинг и проверка в симуляции. Во второй к модели робота добавлялась клешня, датасет пополнялся командами grasp и release, модель дообучалась повторно. Итоговое распределение команд в датасете: 1938 — move, 1133 — turn, 456 — wait, 281 — stop.
Подход демонстрирует рабочую схему для edge-робототехники: компактная open-source LLM, синтетический датасет, сгенерированный более мощными моделями, и жёсткая валидация выходных данных. Веса дообученной модели опубликованы на Hugging Face, исходный код — на Codeberg.



