Вы умеете собирать кубик Рубика? Я практически нет. В детстве я мог собрать только пирамидку, а кубик просто раздирал на запчасти и собирал заново, после чего он стремительно разбалтывался. В прошлом году я съездил на сигграф и там на одном из выставочных стендов раздавали (ужасные по качеству, но зато с рекламой) кубики, после чего конференция для меня была практически потеряна, зато двенадцать часов в самолёте прошли незаметно.
Собирать кубик, подглядывая в уже готовые алгоритмы, мне было неинтересно, поэтому я его собрал пока что только один раз, это у меня заняло примерно полгода и приличную стопку исписанной бумаги. Между делом мне на глаза попался проект MindCub3r. Его автор даёт чертежи и ПО для роботов-сборщиков кубика из LEGO, причём эти чертежи есть для всех возможных комплектов, начиная от первого NXT и заканчивая EV3.
Эти роботы крайне хороши, я восхищён тем, их автор David Gilday использует для непосредственно сборки кубика только два сервомотора и ещё один для сканера. Надо учитывать, что стандартные наборы LEGO довольно скудны, и то, что такого робота можно собрать из одной коробки — это немалое достижение. Работает оно просто, сначала кубик сканируется: его датчик ставится напротив каждой этикетки кубика, затем софт решает кубик, выдавая цепочку необходимых вращений, которая потом и исполняется механически.
Мой робот собирает Кубик Рубика — LEGO MINDSTORMS EV 3
Решил я повторить этого робота, для начала мне просто хотелось получать собранный кубик, а задача максимум — это задать роботу нужную мне конфигурацию (не обязательно собранный кубик) и получить её на физическом кубике. Это мне позволит получить своего рода сейв, когда я буду собирать кубик вручную, и я смогу к нему вернуться в любой момент (вы помните, что я не хочу смотреть в готовые алгоритмы сборки, мне интересно научиться собирать самому?) На данный момент я записываю все ходы на бумаге, чтобы иметь возможность откатиться, и мне это порядком надоело.
Итак, собрал я хардварную часть робота, сборочные чертежи великолепны. Скачал софт, загрузил, с трепетом поставил кубик на платформу и жестоко обломался. Оказывается, этому роботу необходим официальный кубик Рубика, а я купил тот, что используется для спидкубинга. У него другие цвета граней (например, нет белого), и робот надорвался, не сумел его сосканировать.
Хорошо, сказал я, поскрёб по сусекам, нашёл официальный кубик, правда, возрастом под два десятка лет. С его затёртыми и залапанными наклейками робот тоже работать не захотел.
Ну что ж, всё равно мне пришлось бы рано или поздно совать нос в код, т.к. родной софт майндкубера умеет только собирать полностью, но не умеет собрать отдельную конфигурацию. Исходники под NXT опубликованы, а вот под EV3 я их не нашёл. Мне удалось поправить только сканирующую фазу для NXT, обновлённые роботы спокойно собирали и мой спидкубик, и официальный, что я привёл на фотографиях выше. Но в итоге тесниться в NXT мне надоело, там оказалась съеденной почти вся память, поэтому я решил писать код с нуля под EV3.
Сборка Кубика Рубика роботом LEGO Mindstorms EV3 . Уфа, кружок робототехники
Итак, постановка задачи: написать весь софт под существующий хард MindCub3r EV3, для начала софт должен просто собирать кубик. Минимизировать количество ходов в сборке меня не интересует, мне нужен как можно более простой код. Эта статья говорит только про то, как решать кубик, в следующей я опишу сканирование и управление сервами. В среднем решение получается длиной слегка за сто ходов.
Пишем код
Использованный метод
- нижнее переднее ребро
- нижний правый передний угол
- переднее правое ребро
- верхний правый передний угол
- верхнее переднее ребро
Затем код будет выглядеть следующим образом:
(исполнить четыре раза) < собрать нижнее переднее ребро; повернуть весь куб на 90° вокруг вертикальной оси; >(исполнить четыре раза) < собрать нижний правый передний угол; повернуть весь куб на 90° вокруг вертикальной оси; >(исполнить четыре раза) < собрать переднее правое ребро; повернуть весь куб на 90° вокруг вертикальной оси; >(исполнить четыре раза) < собрать верхний правый передний угол; повернуть весь куб на 90° вокруг вертикальной оси; >(исполнить четыре раза)
В этой статье я описываю отдельностоящую программу, которая собирает кубик в командной строке. Как обычно, весь код я публикую на гитхабе. Примеры случайных конфигураций кубика можно брать здесь, там же и валидатор нашего решения.
Структура данных

Грани кубика назовём стандартно: F — передняя, R — правая, B — задняя, L — левая, U — верхняя, D — нижняя. Вот стандартные вращения:
Каждое ребро имеет две прилегающих грани, каждый угол имеет три прилегающих грани. Для представления кубика я использую два массива из двенадцати (по числу рёбер) и восьми (по числу углов) целых чисел. Итак, вот массив индексов:

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

Собранный куб должен быть представлен парой массивов и , это рёбра и углы, соответственно. Например, ребро номер 4 в массиве должно иметь ориентацию 8.
Вот так выглядит представление кубика:
Скрытый текст
unsigned char edges[12], corners[8]; // actual configuration of the cube // When we rotate one face, there will be 4 rotating edges with 2 incident facets and 4 rotating corners with 3 incident facets // these arrays define the transformations of the cube indices for all 6 possible rotations const unsigned char how_edges_move[6][8] = ; const unsigned char how_corners_move[6][12] = ; // given a face index and a number of turns, rotate the face void atomic_rotation(unsigned char face_idx, unsigned char count) < for (int i=0; i> > for (int i=0; i > > >
edges и corners — это массивы, где хранятся данные, how_edges_move и how_corners_move описывают преобразование индексов массивов edges и corners для вращения вокруг каждой из шести граней, а функция atomic_rotation() собственно и выполняет вращение одной данной грани.
Жёстко зашитые алгоритмы
Сложная часть закончилась, теперь начинатся скучная часть, открываем Cube Explorer и руками записываем некоторое количество алгоритмов для сборки.
Скрытый текст
// hard-coded algorithms to assemble corresponding edges and corners const char alg_DF_edge[] [10] = ; const char alg_FR_edge[] [34] = ; const char alg_UF_edge[] [40] = ; const char alg_DRF_corner[][10] = ; const char alg_URF_corner[][40] = ; // given a sequence string, split it into atomic rotations and print the moves // the moves are to be corrected with the orientation of the cube void apply_sequence(const char *sequence, unsigned char orientation) < while (*sequence) < unsigned char fi = char2idx[*sequence-‘A’]; unsigned char cnt = *(++sequence) — ‘0’; atomic_rotation(fi, cnt); if (fi<4) fi = (fi+orientation)%4; // U and D facets are not affected by the entire cube rotation std::cout << idx2char[fi] << *sequence << » «; sequence += 2; >>
Помните, что первым делом мы будем собирать нижнее переднее ребро? В полностью перемешанном кубике оно может находиться на любом из 24 возможных мест, поэтому массив alg_DF_edge даёт 24 разных последовательности, которые поставят ребро на место. Названия остальных массивов говорят сами за себя. Функция apply_sequence() разбивает строку на атомарные операции и вызывает atomic_rotation().
Непосредственно сборщик
Непосредственно сборщик выглядит прямым переводом псевдокода, данного в начале, на язык C++:
Скрытый текст
for (int e=8; e rotate_entire_cube(); > for (int c=4; c rotate_entire_cube(); > for (int e=4; e rotate_entire_cube(); > for (int c=0; c for (int e=0; e
Обратите внимание, что rotate_entire_cube() каждый раз вызывается четыре раза, таким образом, между циклами наш куб всегда ориентирован как надо, но внутри цикла мы должны знать, как именно он ориентирован, чтобы скорректировать вывод решения на экран.
Запуск
Берём пример разобранного кубика здесь и запускаем программу:
~/MindCub3r(master)$ make ./main RF BL UF DR UL FD DL LF RU BU BR BD FRU URB ULF LDF LUB RFD LBD RDB g++ -Wall -Wall -Wextra -Weffc++ -pedantic -std=c++98 -c solver.cpp -o solver.o g++ -Wall -O3 -o ./main solver.o -lm R1 F1 U2 R2 B1 D3 B3 D1 U1 R3 U3 R1 U3 B3 U2 B1 L1 U1 L3 L3 U2 L1 F1 U2 F3 D3 L3 U2 L1 D1 F3 U1 F1 U2 L1 U1 L3 U3 B3 U3 B1 U3 L3 U3 L1 U1 F1 U1 F3 F1 R2 F1 U3 L2 U1 F3 R2 F1 U3 L2 U1 F2 B1 L2 F3 D1 F3 D3 F2 L2 B3 U3 R2 U1 F1 B3 R2 B1 F3 U1 R2 B1 U1 B3 U3 B3 F1 R1 B1 R3 F3
Копируем вывод в веб-валидатор и получаем:
Result is a solved cube. Move count is 91. Good solution!
Итак, у нас есть солвер, в следующий раз будем управлять непосредственно роботом.
Источник: sohabr.net
Программа для робота который собирает кубик рубик ev3
Робот полностью автономно собирает кубик Рубика!
Расчетное время:
Сканирование куба: 1 минута
Расчет решение: 20 — 40 секунд
Команда движения: 1 — 5 минут. Средняя 4.5 минут
В среднем общее время: 6 минут


Скачать прошивку и полную коннструкцию с описанием!
Прочтите все на этой странице.
Запустить программу калибровки.
Запустите программу tiltedtwister. Вы должны использовать unscrambled куб при первом запуске программы. Программа должна вычислить решение нулевых ходов. Если нет, то прервать программу и настроить, какие должны быть скорректированы.
Карабканье кубе и дайте Twister наклонить ее решения.
Вырезать кусок тонкого картона 70 х 70 мм и вырезать углы 8 х 15 мм.
Поместите его на поворотный круг, чтобы куб лежал на плоской поверхности. Важно, что кубик переворачивался легко по поверхности при наклонах.
Подключение проводов следующим образом:
1 — Touch — датчик прикосновения
2 — Датчик освещенности или HiTechnic цвет датчика
3 — ультразвуковой датчик
— Поворотный двигатель
B — Tilter — рука, двигатель
C — Light — цвет датчика двигатель
К сожалению, желтого и белого цвета стандартного кубика Рубика не дает показания от датчика света.
Если у вас нету цветового датчика, то нужно заменить некоторые цвета куба.
На моем кубике, я заменил желтый, синий с голубым и оранжевым золотом .
Вы можете попробовать использовать другие цвета, до тех пор, как датчик сможет их различать.
Используйте программу colortest попробовать различные цвета. Используйте программу куб тестер для проверки куба.
Если у вас есть HiTechnic цвета датчик вам не придется заменять какие-либо наклейки на всех.
Позиция свет / цвет датчика имеет решающее значение. Если слишком близко к поверхности куба чтения может быть неточным. Можно отрегулировать высоту положение датчика, осторожно согнув вверх датчика рукой. Она должна быть около 3 мм выше верхней части куба.
Разрыв захвата не должна быть слишком жесткой вокруг куба. В противном случае он будет перетаскивать куб назад с ним.
Если куб жесткий, можно смазать его силиконовым спреем. После смазки нужно поработать с кубом в течение нескольких минут.
Убедитесь в том, что поворотный механизм выравнивается до начала программы.
Убедитесь в том, что tilter рука полностью убирается перед запуском программы.
Необходимо избегать сильного источника света прямо над роботом.
Прежде чем позволить роботу решить задачку с кубом необходимо откалибровать его. Калибровку программа calibrates позицию сканера с рукой. Если вы используете HiTechnic цвет датчика, но calibrates значения цвета вашего куба (и тем куба должны быть unscrambled при запуске калибровки программы).
Выполнить калибровку программы и прочитать инструкции по NXT-дисплей. Когда программа попросит Вас позицию датчика выше центре куба, нужно повернуть его так, что излучающая свет попадает в центр кусок верхней части куба. Подсказка: Dim свет в комнате лучше увидеть, где свет от датчика хиты кубика.
Cube тестер (только для использования с учетом датчик)
Запустить эту программу, чтобы проверить, если цвета куба могут быть урегулированы с помощью датчика света.
Место unscrambled куба на поворотный круг. Робот сканирует гранями куба. Затем он показывает минимальный и максимальный датчик света значения цвета для каждого куба лицо и рассказывает ли кубик имеет или нет.
Если цвет варьируется дублирование программы говорит куба не ОК. Но если совпадения мала она может работать в любом случае из-за цвета решить алгоритм tiltedtwister программы.
Цвет тестер (только для использования с учетом датчик)
Эта программа отображает текущую стоимость датчика света. Используйте его, чтобы проверить свой набор цветов.
HiTechnic цветной сенсор
Требует LEGO MINDSTORMS NXT микропрограммы v1.05 или более поздней версии.
См. отдельные здания инструкции для датчика руку с цветовой датчик.
Загрузка программ для кирпича
Распакуйте ZIP-загрузка в новую директорию.
Файлы с расширением. Rxe исполняемые файлы, которые должны быть загружаемым на кирпич с помощью LEGO mindstorms программы:
— Создать новый проект (Файл / Новый)
— Нажмите кнопку «NXT окна»
— Выберите вкладку памяти
— Нажмите кнопку «Загрузить»
Файлы с расширением. RSO являются звуковые файлы и должна быть загружаемые таким же образом, как rxe-файлы.
Размер tiltedtwister программа достаточно велика. Если у вас возникли проблемы при загрузке tiltedtwister.rxe т RY следующее:
— Удалить других программных файлов и звуковые файлы и т.д., чтобы освободить место.
— Обновление микропрограммы NXT. Я использую NXT Встроенноое 1.05 у меня кирпич. Вы можете загрузить и установить с микропрограммным LEGO Mindstorms NXT программного обеспечения.
— Дефрагментация NXT файловой системы. (Bricx командования центр / NXT Explorer / Дефрагментация)
Файлы с расширением. Nxc могут быть отредактированы и составлен с использованием BricxCC (http://bricxcc.sourceforge.net).
Смотреть NXT-дисплей, как она сканирует лица. При использовании датчика света выводит учетом стоимости. Если вы используете цвета датчик выводит три значения для каждого сканирования. Это RGB-значения цвета чтении.
Когда она проверила все стоит она решает цветов. Экран говорит: «Урегулирование цветами».
Затем она вычисляет трех решений.
Для каждого решения он делает галочка звук с ростом поля. Это должно занять около десяти секунд.
После этого он начинает выполнение решений с указанием числа оставшихся извиваются на дисплее.
Если она не читая цветов, один из следующих вещей произойдет:
— При расчете решение он никогда не останавливается. Он держит с тикающей выше и выше поле.
— Он останавливается тикал и ничего не происходит.
— Это удается вычислить решение. Но это не правильное решение, поскольку оно решен цветов неправильно.
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо войти под своим именем.
| 3D Модели для Авто | |
| Бакометр 2 | 335 |
| Touch Start-Stop Engine. | 587 |
| Кодграберр | 17 |
| Исправляем AVR фьюзы при помощ . | 109 |
| Автоматическая зарядка для Ni- . | 84 |
| LEDstairs | |
| Бакометр — измеритель остатка . | 4 |
| IR конструктор на PIC12F629 | 77 |
| Универсальное зарядное устройс . | 103 |
| бaкoмeтр | 1974 |
| Двунаправленный автомобильный . | 2 |
| Программатор GENIUS G840 | 1 |
| Светодиодный тахометр | 34 |
| Индикаторы ГРИ ИН1 — ИН14 | 1 |
| Multiprog | 1 |
| Управляющая программа LED CUB | 959 |
| Универсальное зарядное устройс . | 9 |
| Изготовлю печатные платы. | 29 |
| Простой автоматический выключа . | 25 |
Источник: bezkz.su
MindCub3r по-русски — делаем робота, который может собрать кубик Рубика (статья обновлена)
Не так давно обзавелся набором LEGO MINDSTORMS EV3 (31313) и с удивлением обнаружил, что в русскоязычном сегменте интернета довольно мало интересных материалов и инструкций по сборке и настройке роботов из этого набора. Решил, что нужно это дело исправлять.
Эта инструкция представляет собой вольный перевод материалов с официального сайта проекта MindCub3r и дополнена опытом самостоятельной сборки этого робота, способного собрать кубик Рубика меньше чем за 2 минуты.
Подробнее о LEGO MINDSTORMS EV3 можно почитать на этом сайте.
Вот, что у нас должно получится в итоге:

MindCub3r можно построить из одного комплекта Lego Mindstorms EV3 (31313, Home Edition).
Также вам понадобится инструкция по сборке и программное обеспечение, разработанное авторами проекта.
ВАЖНОЕ СООБЩЕНИЕ.
Буквально позавчера автор проекта объявил в своем ФБ, что подправил программное обеспечение для своего робота, и теперь оно работает со «штатной» прошивкой «кирпича» 1.06Н. На главной странице проекта эта информация также уже появилась, архив MindCub3r-v1p1a.zip, содержащий, среди прочего, и обновленную версию программы, уже доступен для загрузки. Загрузка и установка блока для датчика цвета по-прежнему необходима.
Дальнейший текст статьи исправлен с учетом последних изменений на сайте проекта!
Инструкцию по сборке MindCub3r смотрим или скачиваем здесь.
Прошивку (на момент написания статьи EV3-Firmware-V1.06H.bin) для кирпича скачиваем с официального сайта LEGO MINDSTORMS здесь.
Архив MindCub3r-v1p1a.zip с файлами проекта (MindCuber-v1p1.ev3, autorun.rtf и mc3solver-v1p1.rtf) качаем тут.
Еще нам понадобится прошивка для датчика цвета, которую берем здесь. Все дело в том, что стандартные настройки этого датчика не корректно определяют цвета в режиме RGB.
После того, как вы соберете робота и скачаете себе на компьютер все необходимое, можно приступать к настройке.
Если вы еще не обновили прошивку «кирпича» первым делом устанавливаем новую версию ПО для главного блока Mindstorms EV3:
1. Запускаем программное обеспечение LEGO MINDSTORMS EV3;
2. Выбираем Инструменты — Обновление встроенного ПО;

3. В появившемся диалоговом окне нажимаем «Просмотреть», находим предварительно закаченный файл EV3-Firmware-V1.06H.bin и жмем «Открыть»;


4. В диалоговом окне в таблице «Доступные файлы встроенного ПО» выбираем EV3-Firmware-V1.06H и жмем «Загрузить». Ждем окончания загрузки;

5. Перезагружаем главный блок (выключаем и снова включаем).
Далее устанавливаем прошивку для датчика цвета:
1. В ПО LEGO MINDSTORMS EV3 открываем новый пустой проект;
2. Выбираем Инструменты — Мастер импорта блоков;

3. В появившемся диалоговом окне нажимаем «Просмотреть», находим предварительно загруженный файл ColorSensorRGB-v1.00.ev3b и жмем «Открыть»;


4. В диалоговом окне в таблице «Выбрать блоки для импорта» выбираем ColorSensorRGB-v1.00.ev3b и жмем «Импорт».

5. Для завершения установки закройте диалоговое окно и выйдите из программного обеспечения LEGO MINDSTORMS EV3.
Теперь самый ответственный момент — загрузка программы робота в кирпич:
1. Распаковываем предварительно загруженный архив MindCub3r-v1p1a.zip;
2. Запускаем ПО LEGO MINDSTORMS EV3;
3. Выбираем Файл — Открыть проект, ищем файл MindCub3r-v1p1.ev3, распакованный из архива MindCub3r-v1p1.zip и жмем «Открыть»;

4. После открытия проекта загружаем его в «кирпич». Загружаем, но НЕ ЗАПУСКАЕМ.

5. Идем в Инструменты — Обозреватель памяти (Ctrl+I);

6. Выбираем (выделяем) во вкладке «Модуль» или «SD-карта» папку проекта «MindCub3r-v1p1»;
7. Нажимаем «Загрузить»;

8. Находим файл mc3solver-v1p1.rtf, распакованный из архива MindCub3r-v1p1a.zip и нажимаем «Открыть»;
9. Еще раз нажимаем «Загрузить», предварительно убедившись, что папка проекта «MindCub3r-v1p1» все еще выделена;
10. Находим файл InstallMC3-v1p1.rbf, распакованный из архива MindCub3r-v1p1a.zip и нажимаем «Открыть»;
Примечание: файл mc3solver-v1p1.rtf имеет текстовое расширение .rtf. Пожалуйста, не пытайтесь открыть этот файл с помощью текстового редактора.
11. Закройте диалоговое окно, выйдите из программы и перезагрузите модуль.
Последний этап — устанавливаем приложение MC3 Solver на главном модуле:
1. Включаем блок:
2. Находим во второй вкладке папку проекта MindCub3r-v1p1 (в памяти блока или на SD-карте):
3. Выбираем файл InstallMC3-v1p1 и нажимаем на центральную кнопку модуля для установки:
4. В третьей вкладке проверяем наличие установленного приложения MC3 Solver v1p1:
5. Перезагружаем блок.
6. В третьей вкладке блока запускаем приложение «MC3 Solver v1p1» для начала работы программы mc3solver-v1p1.rtf:
Всё! MindCub3r готов к использованию!
7. Запускаем программу в первой или во второй вкладке блока:
После запуска программы робот попросит вложить кубик («Insert cube») и начнет его сканировать датчиком цвета.
После сканирования робот ненадолго задумается и начнет сборку.
Удачное решение задачи ознаменуется радостным вращением кубика.
Вот, собственно, процесс работы робота:
Выше описан идеальный сценарий, на практике же все немного хуже — датчик может не правильно определить цвета — всего робот может провести 3 (три) цикла сканирования до того, как выдаст ошибку (Scan error). После этого нужно изъять кубик и снова вложить в робота. Причиной этому может быть или низкий заряд батареи модуля или «неправильный» кубик.
У меня иногда проходило по 3-5 повторов (3 цикла сканирования и одно изъятие) прежде чем робот принимался за сборку, но результат того однозначно стоит.
Если у вас остались вопросы, задавайте их в комментариях к статье, с удовольствием на них отвечу.
- роботы
- lego
- lego mindstorms
- lego mindstorms ev3
- робототехника
Источник: habr.com