Моя основная задача в Яндексе — поддержка больших языковых моделей. После обучения модели весят десятки гигабайт, их нужно как-то дотащить до продакшена. Для этого нужно переложить файлы, всё протестировать, убедиться, что изменения ничего не ломают. Я пишу веб-сервер и слежу, чтобы он правильно и хорошо работал.
Мой папа увлекается кубиком Рубика, а мне это особо не передалось. Игрался, но не слишком продолжительное время. Но это не помешало мне создать робота, который умеет собирать кубик Рубика быстрее всех в мире.
Предыдущий рекорд, 305 мс, установила японская компания Mitsubishi Electric. У них получился хороший робот, но мой — быстрее.
Сначала я взял первые попавшиеся моторы и попробовал крутить одну грань кубика. Когда получилось, попробовал крутить уже все шесть граней. Эти моторы я оставил, но позже поменял контроллеры, которые ими управляют. Далее добавил распознавание кубика, алгоритмы на компьютере. В общем, с каждой новой версией я исправлял допущенные ошибки.
Я занимался проектом в одиночку и без экспертных знаний. Единственное, с чем мне помогали друзья, — дизайн пары деталей для одной из предыдущих итераций. Также они дали мне несколько советов по подбору моторов и оптимизации управления ими. В остальном это мой личный проект.
Мой робот умеет не только собирать кубик Рубика, но и запутывать его. Кажется, что с практической точки зрения это не очень полезно, но в роботе применяются те же технологии, что и для решения промышленных задач.
Например, BLDC-моторы, которые используют в складских роботах, роборуках, роботах-доставщиках и даже в электромобилях. В последнем случае совсем другая специфика, но в целом технология похожа.
Мой робот — больше арт-объект, чем практически полезное изобретение. Он красивый и залипательный: можно долго смотреть, как он работает и что-то крутит в демонстрационном режиме.
Устройство робота
Для сборки кубика Рубика нужно сделать три простые вещи:
-
Узнать, в каком он сейчас состоянии, распознать.
-
Найти алгоритм решения.
-
Покрутить и собрать.
Первыми двумя вещами занимается подключённый к роботу компьютер, он используется для более быстрой обработки и поиска решения. Для таких задач подойдёт даже мини-компьютер Raspberry Pi, который помещается в ладонь. Но для установки мирового рекорда его скорости обработки информации недостаточно, нужно оборудование помощнее.
При распознавании я использую две камеры от PS 3 — PlayStation Eye. Они очень дешёвые и выдают около 187 кадров в секунду, позволяя получить кадр за 6–10 мс. Камеры отправляют кадры на компьютер сразу, как только считали их с матрицы. Это очень важная особенность: камеры создавались для интерактивных игр, чтобы быстро распознавать действия в реальном мире.
Для этих камер я написал драйвер на языке программирования Rust. Сделал сам, чтобы уменьшить возможные задержки на перекладывание байтов памяти, оптимизировать и лучше контролировать момент съёмки кадра. Время сборки датасета из 200 картинок — 5 минут. На основе этих картинок робот понимает, где какой цвет находится, и распознаёт кубик.
Решение осуществляется при помощи двухфазного алгоритма Герберта Коцембы. Для решения кубика на компьютере я поставил жёсткую отсечку в 8 мс. За это время он находит субоптимальное решение и отправляет его роботу. После этого начинается заключительный этап — сборка.
Плата управления — Teensy 4.0, прошивка для неё написана на языке программирования Rust. С её помощью роботу нужно быстро принять с компьютера по USB-интерфейсу задание, как и какие грани нужно повернуть. На соответствующие серводвигатели отправляется сигнал о необходимости начать вращение, после чего нужно следить, когда они дойдут до нужного положения. После этого задание вращать грани получают другие серводвигатели.
В свою очередь, к мотору и датчику угла подключается специальная железка — драйвер. Она непрерывно считывает положение угла, и понимает, как и какой ток нужно подать на мотор, чтобы он приложил нужное количество силы в определённую сторону. С помощью этого удаётся реализовать достаточно точный и быстрый переход между какими-то двумя углами поворота. Ну а сами моторы подключены к кубику с помощью алюминиевых валов, которые с одной стороны насаживаются на мотор в специальное посадочное отверстие, а с другой — вставляются в кубик вместо крышечки на центральной части.
К слову, существенная часть оптимизации происходит именно на стадии сборки. Во-первых, нужно добиться уменьшения задержки общения одновременно с шестью гранями. Во-вторых, надо правильно подобрать стратегию, когда начинать вращать следующую грань после начала вращения предыдущей. Полного окончания вращения я не жду — использую «резку углов». Это разрушает кубик, но сборка происходит быстрее.
Кстати, в Америке на соревнованиях кубик начал разваливаться. Я его подклеивал, он немного дольше прожил, но всё равно разлетался.
Мировой рекорд
При сборке для мирового рекорда нужно достать кубик из робота, запутать его руками по алгоритму специальной верифицированной программы от World Cube Association и положить обратно. Затем робот запускается, а время измеряется с момента, когда он начинает видеть кубик, до момента завершения сборки.
Видео для рекорда записывают так, чтобы было понятно, что камеры заранее не видят кубик. Я делаю это с помощью подсветки: на камерах выставлены такие параметры, что без дополнительного света они ничего не различают. В момент начала сборки включается подсветка — и камеры начинают распознавать кубик, решая головоломку.
Кроме того, у меня на экране выводится время сканирования, решения и сборки. Время сборки отслеживается с помощью камеры замедленной съёмки. Время сканирования и решения чётко и формально описаны, можно посмотреть на частоту кадров в секунду у используемых мной камер. Также можно увидеть, что время решения кубика тоже реалистичное. Я пользуюсь определённым решателем, и на GitHub можно посмотреть, что он действительно так быстро работает.
Есть камеры, которые позволяют снимать со скоростью 1 мс. Приятно думать, как (и насколько) можно улучшить машину с такими камерами!
Но с сокращением времени на сканирование может сильно возрасти стоимость оборудования. Камера захочет передать картинку на компьютер не по USB или интернет-кабелю, а по очень быстрому протоколу. Такое решение стоит дорого. Если сейчас сканирование за 10 мс обходится в 800 ₽, то при более крутом оборудовании это может обойтись в тысячи долларов.
Когда кубик отсканирован, он уже находится в одном из 43 квинтиллионов состояний — и нужно как-то привести его к одному решённому. Здесь помогает двухфазный алгоритм Коцембы. Ускорять его можно, но для этого нужно больше вычислительных мощностей.
Поэтому пока пользуюсь оптимизированным математическим перебором, срезая углы там, где получается.
Ещё, наверное, собирать быстрее можно, если поставить более подходящие моторы и контроллеры для управления ими. Но пока это только в планах, сейчас моторы стоят какие попались.
Результаты и победа
Мой робот собирал быстрее чем за 300 мс со всеми этапами, когда я выезжал в Америку на выставку.
Сейчас прошло уже больше полугода, но мой рекорд в 203 мс пока что официально не внесён в Книгу рекордов Гиннеса. Если найдётся человек, который соберёт ровно за 200 мс, придётся бить его рекорд. Но сейчас это вряд ли произойдёт: все целятся в 305 мс, а не в 203 мс.
Формально моего результата нет. Хочу поставить такой рекорд, чтобы его было страшно побить — и люди даже не пытались.