Робот собирающий кубик рубика ev3 инструкция и программа

Время на прочтение
4 мин

Количество просмотров 99K

Не так давно обзавелся набором LEGO MINDSTORMS EV3 (31313) и с удивлением обнаружил, что в русскоязычном сегменте интернета довольно мало интересных материалов и инструкций по сборке и настройке роботов из этого набора. Решил, что нужно это дело исправлять.

Эта инструкция представляет собой вольный перевод материалов с официального сайта проекта MindCub3r и дополнена опытом самостоятельной сборки этого робота, способного собрать кубик Рубика меньше чем за 2 минуты.

Подробнее о LEGO MINDSTORMS EV3 можно почитать на этом сайте.

Вот, что у нас должно получится в итоге:

image

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. Выбираем ИнструментыОбновление встроенного ПО;

image

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

image

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

5. Перезагружаем главный блок (выключаем и снова включаем).

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

image

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

image

image

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

image

5. Для завершения установки закройте диалоговое окно и выйдите из программного обеспечения LEGO MINDSTORMS EV3.

Теперь самый ответственный момент — загрузка программы робота в кирпич:
1. Распаковываем предварительно загруженный архив MindCub3r-v1p1a.zip;

2. Запускаем ПО LEGO MINDSTORMS EV3;
3. Выбираем ФайлОткрыть проект, ищем файл MindCub3r-v1p1.ev3, распакованный из архива MindCub3r-v1p1.zip и жмем «Открыть»;

image

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

image

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

image

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

image

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 цикла сканирования и одно изъятие) прежде чем робот принимался за сборку, но результат того однозначно стоит.

Если у вас остались вопросы, задавайте их в комментариях к статье, с удовольствием на них отвечу.

Полная инструкция по сборке на русском языке для MindCub3r EV3.
Перевод на русский язык © 2015 ROBOTDAY.RU

MindCuber.com

Сделайте своего собственного робота LEGO® MINDSTORMS®, который будет решать и собирать головоломку Кубик Рубика®…

Как собрать MindCub3r из набора LEGO MINDSTORMS EV3

Примечание: Эта страница вскоре будет обновлена, здесь будет добавлена информация о версии Education MindCub3r, но уже сейчас здесь есть все необходимые файлы для начала работы с набором Education.

Скачайте инструкции и необходимые программы (кликните правой кнопкой мыши на ссылки “загрузить” и выберите  “Сохранить ссылку как…”)

1. Описание

MindCub3r – робот, которого можно собрать из одного набора LEGO MINDSTORMS EV3 Обычная версия (31313) или из наборов EV3 Education Core и Expansion sets (45544+45560).
Этот робот способен полностью решить и правильно собрать известную головоломку Кубик Рубика (Rubik’s Cube puzzle).

Все программы для MindCub3r будут правильно работать с прошивкой LEGO firmware v1.06H (home) или v1.06E (Education), а также с последующими новыми версиями прошивок.
Рекомендуется всегда обновлять программное обеспечение центрального блока EV3 ( прошивку) до самой последней официальной версии от LEGO.

Аккуратно соберите робота по инструкции  Инструкция по сборке (Обычная версия EV3 31313) или Инструкция по сборке (Образовательная версия EV3 Education 45544) , затем загрузите и установите программное обеспечение, как описано далее.

Программное обеспечение MindCub3r состоит из трех частей:

  1. Файл проекта: MindCub3r-v1p8.ev3 or MindCub3r-Ed-v1p8.ev3, который содержит программу управления моторами и сенсорами.
    Она создана в стандартном  визуальном редакторе программ и проектов LEGO MINDSTORMS EV3
  2. Дополнительная запускаемая программа: mc3solver-v1p8.rtf, которая написана на C++ и реализует более эффективный и быстрый алгоритм решения головоломки, чем тот, который использовался для предыдущей версии NXT MindCuber ( для набора LEGO NXT)
  3. Приложение для EV3: “MC3 Solver v1p8”, которое используется для запуска программы mc3solver-v1p8.rtf

The main program and mc3solver-v1p8.rtf executable program communicate with each other via shared files on the EV3.
Примечаниеe: Файл v1p8 использует расширение .rtf для возможности загрузки его в блок EV3 с помощью стандартного программного обеспечения LEGO MINDSTORMS EV3 для персонального компьютера.
Расширение .rtf , которое обычно используется для текстовых файлов, в данном случае применяется к запускаемой программе, в качестве альтернативы.
Пожалуйста, не открывайте этот файл с помощью обычного текстового редактора.

MindCub3r использует датчик EV3 color sensor (сенсор цвета)  в режиме RGB, чтобы сделать возможным распознавание  тех оттенков цветов, которые обычно не определяются в стандартном режиме сенсора, по умолчанию используемом в программном обеспечении LEGO MINDSTORMS EV3 .
Программа Color Sensor RGB Block должна быть импортирована в программное обеспечение LEGO MINDSTORMS EV3 для персонального компьютера, чтобы поддерживать режим RGB для сенсора.

2. Программное обеспечение

Примечание: Используйте ссылки Загрузить следующим образом:

    • На Windows – клик правой кнопкой мыши на ссылке Загрузить
    • На Mac – при нажатой клавише control(ctrl), кликните на ссылку Загрузить

В появившемся меню выберите один вариант:

  • Сохранить ссылку как…
  • Сохранить содержимое как…
  • Загрузить содержимое ссылки как…

Затем выберите папку на вашем компьютере, куда вы собираетесь сохранить файл.

2.1 Установка Color Sensor RGB Block

    1. Загрузите блок, ColorSensorRGB-v1.00.ev3b, на ваш компьютер.
      Иногда при загрузке этот файлe может быть переименован в ColorSensorRGB-v1.00.zip . В этом случае после загрузки, переименуйте его снова в ColorSensorRGB-v1.00.ev3b
    2. Запустите программное обеспечение LEGO MINDSTORMS EV3 на персональном компьютере и создайте новый пустой проект.
    1. Выберите в меню  Tools (Инструменты)  а затем – Block Import(Импортировать блок).
    1. В разделе Block Import  and Export(Импортировать блок и Экспорт), выберите  Browse(Обзор).
    1. Найдите загруженный ранее файл ColorSensorRGB-v1.00.ev3b на вашем компьютере и нажмите Open(Открыть).
    1. Выберите ColorSensorRGB-v1.00.ev3b из списка Select Blocks to Import( Выбрать Блоки для Импорта) и нажмите Import(Импорт).
    1. Чтобы правильно завершить установку , нажмите Сlose (Закрыть) , а после этого также закройте программное обеспечение LEGO MINDSTORMS EV3 полностью.

2.2 Загрузка проекта MindCub3r

      1. Загрузите соответствующий вашей системе файл на ваш компьютерe:
        • Загрузить MindCub3r-v1p8.zip (Обычный набор EV3 31313)
        • Загрузить MindCub3r-Ed-v1p8.zip (Education набор EV3 45544+45560)

        Примечание: Предыдущие версии также доступны здесь

      2. Извлеките (распакуйте архив)все файлы из архива. На компьютере под управлением Windows, найдите эти файлы в проводнике, затем кликните на них правой кнопкой мыши и выберите пункт меню Извлечь все…
        Этот архив содержит:

        • Файл проекта с основной программой MindCub3r-v1p8.ev3 или MindCub3r-Ed-v1p8.ev3 project file with the main program
        • Запускаемый файл программы mc3solver-v1p8.rtf
        • InstallMC3-v1p8.rbf – приложение для запуска файла mc3solver-v1p8.rtf
    1. Запустите программное обеспечение LEGO MINDSTORMS EV3 для персонального компьютера, выберите в меню команду File(Файл)
      и затем выберите пункт Open Project( Открыть проект ).
    1. Найдите файл проекта MindCub3r-v1p8.ev3 или MindCub3r-Ed-v1p8.ev3 и нажмите кнопку Open(Открыть).
    1. Download (Загрузить) – с помощью этой кнопки загрузите программу MindCub3r в блок EV3 (но пока не запускайте ее).
    1. Выберите в меню пункт Tools(Инструменты) и затем пункт Memory Browser(Обзор памяти)
      .
    1. Нажмите кнопку Brick или SD Card (SD Карта)( если в основной блок EV3 у вас вставлена карта micro-SD ), найдите и выделите MindCub3r-v1p8 или MindCub3r-Ed-v1p8 в папке проектов (Projects) и нажмите кнопку Download(Загрузить).
    1. Find the folder on the computer where the files were extracted from MindCub3r-v1p8.zip or MindCub3r-Ed-v1p8.zip. Select mc3solver-v1p8.rtf and Open to download this program to the EV3.
    1. Select Download again from the Memory Browser dialog.

    1. Find the folder on the computer where the files were extracted from MindCub3r-v1p8.zip or MindCub3r-Ed-v1p8.zip. Select InstallMC3-v1p8.rbf and Open to download this file to the EV3.
    1. Close the Memory Browser dialog.

2.3 Install the MC3 Solver Application

    1. Go to the Run Recent screen on the EV3.
    1. Press the right button on the EV3 to move to the File Navigation screen. Select the MindCub3r-v1p8 or MindCub3r-Ed-v1p8 folder and press the center button to open it. If there is a micro-SD card in the EV3, select and open the SD_Card folder first.

    1. Use the down button to Select InstallMC3-v1p8 and press the center button to run it. The EV3 will make a short beep.

      This installs “MC3 Solver v1p8” application on the Brick Apps screen.
    1. Turn off the EV3 brick to ensure all the files are saved to the flash memory and then turn it on again.

MindCub3r is now ready to use!

3. Operation

    1. Run the “MC3 Solver v1p8” application on the EV3 from the Brick Apps screen to start the mc3solver-v1p8.rtf executable program.

      This is only necessary once each time the EV3 is turned on as the program will continue to run in the background until the EV3 is turned off.
    1. Run the MindCub3r program on the EV3 from the Run Recent screen or from the File Navigation screen if it is the first time it has been run.


      The program first resets the position of the scan arm (holding the color sensor) and then the tilt arm. If the turntable starts to rotate or the two arms do not move in this order, please carefully check that cables have been connected to the correct ports on the EV3 as shown by the color coding in the build instructions. During this period, the EV3 buttons flashes red.The program then connects to the mc3solver-v1p8.rtf program that was downloaded to the EV3. If the program is found, the EV3 makes a short beep and continues. If the solver program is not running, the buttons continues to flash red and the message “Find solver” is displayed on the EV3 screen. If this happens, please check that the “mc3solver-v1p8.rtf” program has been downloaded to the MindCub3r-v1p8 or MindCub3r-Ed-v1p8 project folder on the EV3 and that the “MC3 Solver v1p8” application has been installed and run once.When MindCub3r is ready to start, the EV3 buttons turn orange and the message “Insert cube…” is displayed on the screen.
    1. Gently turn the turntable in each direction with your finger so that it moves slightly because of “play” in the gears connecting it to the motor. If necessary, adjust the position of the motor so that there is an equal mount of play in each direction. Use the left and right buttons on the EV3 to do this. A short press nudges the motor by a small angle. Holding the button for longer moves it by larger angles more quickly.
    1. Insert a scambled Rubik’s Cube into the turntable tray and MindCub3r will start to scan and solve the cube.MindCub3r may scan the cube up to three times if it is unable to determine the colors at first. If the scanned colors do not result in a valid pattern, MindCub3r will stop after the third attempt and display the message “Scan error” on the EV3 display. If this happens, there may be a number of possible causes. See the troubleshooting section.If there is a cube present before MindCub3r is ready, the buttons will stay red and the message “Remove cube…” is displayed for you to remove the cube. If this happens even when no cube is present or if MindCub3r does not start to scan the cube when it is inserted, please check that the cables to the infra red or ultrasonic and color sensors are connected to the correct ports on the EV3 as shown in by the color coding in the build instructions.

4. Troubleshooting Tips

4.1 Scanning

If MindCub3r attempts to scan the cube 3 times and displays the message “Scan error” the following tips may help.

  1. MindCub3r is designed to work with an official Rubik’s Cube branded by Rubik’s. However, it should work with most cubes provided one set of stickers is white and the others are distinct colors. It is optimized to work with white, yellow, red, orange, green and blue stickers.
  2. Cubes with a white plastic body may scan less reliably that those with a black body but may work reasonably well if there are no other issues.
  3. A standard cube is about 57mm along each edge. MindCub3r will work most reliably with a cube this size although cubes that are only slightly larger or smaller may work. It has been known to solve some cubes as small as 55mm but not all.
  4. Make sure latest release of the MindCub3r software is installed including the latest enhanced firmware. Version v1p8 has some improvements in the position of the scan arm and the underlying algorithm for discriminating the colors.
  5. Check that the scan arm has been built exactly as shown in the build instructions. Small differences such as how the black 5-hole beams on either side of the scan arm are connected can alter the position of the color sensor during the scan or even jam the scan arm so it stops during the scan. In particular, if the color sensor looks as though it is over the edge of the cube or too close to the middle while scanning the corner or edge, please check the build instructions again.
  6. Make sure that the turntable is carefully aligned before inserting the cube as described here. This is required to ensure that the cube is positioned correcetly under the color sensor during the scan.
  7. Use new or well charged batteries as the reset position of the scan arm can be affected by low battery levels.
  8. Try the scan in dim lighting conditions as the color sensor can become saturated in bright lights.
  9. Try to bend the cable connecting the color sensor to the EV3 in its most natural direction (swap the two ends if necessary) and through the clip at the bottom of the scan arm to minimize any force that the cable applies to the position of the color sensor during the scan.

If this does not help, please upload a video showing a failing scan with close up views of the scan arm from different angles and the position of the color sensor over the cube as the scan arm moves and post a link on the MindCuber Facebook pageand I will try to help.

Like MindCuber on Facebook to share your experiences and help each other with troubleshooting.

See more LEGO robot Rubik’s Cube solvers at youtube.com/IAssemble and youtube.com/ARMflix

Copyright © 2013-2015 David Gilday

LEGO and MINDSTORMS are trademarks of the LEGO Group
Rubik’s Cube is a trademark of Seven Towns Limited

Disclaimer: thoughts and opinions expressed here are my own (David Gilday)

MindCub3rПредставляем вашему вниманию пошаговую инструкцию по сборке из набора LEGO Mindstorms Education EV3 модель «MindCub3r — Умный сортировщик». Сборка состоит из 544 деталей и 133 последовательных шагов. Робота MindCub3r можно собрать из домашнего набора LEGO MINDSTORMS EV3 (31313) или из наборов EV3 Education Core и Expansion (45544 + 45560). Попробуйте вместе с нами сделать собственного робота, который будет решать и собирать головоломку Кубик Рубика.

На сборку и программирование робота Mindcub3r у нас ушло 2 дня. Размер и тип кубика-рубика имеет значение! Для правильной работы робота маленький кубик не подойдет, найдите побольше. И да, чем плавнее будут двигаться части кубика, тем будет лучше.

Что должно получиться в итоге:

Совершенно готовая схема сборки LEGO Mindstorms для показа на уроке детям по дополнительному образованию.

Lego Mindstorms Mindcuber

Инструкции по сборке и примерную управляющую программу вы получите после того, как нажмете на кнопку скачать.

Все материалы проверены, вирусов нет.

Скачать

Напоминаем, что скачать готовую пошаговую инструкцию по сборке для набора Lego Mindstorms Education EV3 «MindCub3r» вы сможете после нажатия на кнопку скачать и просмотра рекламы. За счет рекламы живет наш сайт. Спасибо за понимание!

Предпросмотр:

MindCub3r превью

Introduction: EVB — Rubic’s Cube Solver

The EVB is a shield (or called cape) for Beaglebone Black (BBB). It fully support LEGO® MINDSTORMS® EV3 system, with both the hardware and software! The EVB is compatible with all LEGO® sensors just like the EV3 Brick. 100% compatible! It allows the EV3 Virtual Machine (VM) to be run on the Beaglebone Black.

EVB Kit is created by fatcatlab, you can find more information at our kickstarter page

http://kck.st/1uVI5Xk

Step 1: Build the Structure

The MindCuber team have made a detailed instruction on building this robot. You can find this instruction here. At last, of course I need to replace the EV3 with the EVB : )

Step 2: Install Colour Sensor RGB Block

Download the block, coloursensorRGB-v1.00.ev3b, to your computer. Note that this file may be renamed to coloursensorRGB-v1.00.zip during the download. If this happens, rename the file back to coloursensorRGB-v1.00.ev3b
Start the LEGO MINDSTORMS EV3 software and create a new, empty project. Select the Tools menu and then Block Import.

  1. In the Block Import and Export dialog, select Browse.
  2. Find the file coloursensorRGB-v1.00.ev3b on your computer and Open it.
  3. Select coloursensorRGB-v1.00.ev3b from Select Blocks to Import and then select Import.
  4. To complete the installation, close the dialogues and exit from LEGO MINDSTORMS EV3 software.

Step 3: Download MindCub3r Program

  1. Download the appropriate file to your computer.
  2. Extract all the files from this archive. On a computer running Windows, find the file in Windows Explorer, click with the right mouse button and select Extract all…

  3. Start the LEGO MINDSTORMS EV3 software and select the File menu then Open Project.

  4. Find the MindCub3r-v1p4.ev3 project file and Open it.

  5. Download the MindCub3r program to the EV3 (but do not runit yet).

  6. Select the Tools menu and then Memory Browser.

  7. Select Brick (or SD Card if there is a micro-SD card in the EV3) and find and select MindCub3r-v1p4 in the Projects folder and then select Download.

  8. Find the folder on the computer where the files were extracted from MindCub3r-v1p4.zip. Select mc3solver-v1p4.rtf and Open to download this program to the EV3.

  9. Select Download again from the Memory Browser dialog.

  10. Find the folder on the computer where the files were extracted from MindCub3r-v1p4.zip. Select InstallMC3-v1p4.rbf and Open to download this file to the EV3.

  11. Close the Memory Browser dialogue.

Step 4: Install the MC3 Solver Application

  1. Go to the Run Recent screen on the EV3.
  2. Press the right button on the EV3 to move to the File Navigation screen. Select the MindCub3r-v1p4 folder and press the centre button to open it. If there is a micro-SD card in the EV3, select and open the SD_Card folder first.
  3. Use the down button to Select InstallMC3-v1p4 and press the centre button to run it. The EV3 will make a short beep.
  4. Turn off the EV3 brick to ensure all the files are saved to the flash memory and then turn it on again.

Постановка задачи

Вы умеете собирать кубик Рубика? Я практически нет. В детстве я мог собрать только пирамидку, а кубик просто раздирал на запчасти и собирал заново, после чего он стремительно разбалтывался. В прошлом году я съездил на сигграф и там на одном из выставочных стендов раздавали (ужасные по качеству, но зато с рекламой) кубики, после чего конференция для меня была практически потеряна, зато двенадцать часов в самолёте прошли незаметно.

Собирать кубик, подглядывая в уже готовые алгоритмы, мне было неинтересно, поэтому я его собрал пока что только один раз, это у меня заняло примерно полгода и приличную стопку исписанной бумаги. Между делом мне на глаза попался проект MindCub3r. Его автор даёт чертежи и ПО для роботов-сборщиков кубика из LEGO, причём эти чертежи есть для всех возможных комплектов, начиная от первого NXT и заканчивая EV3.

Эти роботы крайне хороши, я восхищён тем, их автор David Gilday использует для непосредственно сборки кубика только два сервомотора и ещё один для сканера. Надо учитывать, что стандартные наборы LEGO довольно скудны, и то, что такого робота можно собрать из одной коробки — это немалое достижение. Работает оно просто, сначала кубик сканируется: его датчик ставится напротив каждой этикетки кубика, затем софт решает кубик, выдавая цепочку необходимых вращений, которая потом и исполняется механически.

Решил я повторить этого робота, для начала мне просто хотелось получать собранный кубик, а задача максимум — это задать роботу нужную мне конфигурацию (не обязательно собранный кубик) и получить её на физическом кубике. Это мне позволит получить своего рода сейв, когда я буду собирать кубик вручную, и я смогу к нему вернуться в любой момент (вы помните, что я не хочу смотреть в готовые алгоритмы сборки, мне интересно научиться собирать самому?) На данный момент я записываю все ходы на бумаге, чтобы иметь возможность откатиться, и мне это порядком надоело.

Итак, собрал я хардварную часть робота, сборочные чертежи великолепны. Скачал софт, загрузил, с трепетом поставил кубик на платформу и жестоко обломался. Оказывается, этому роботу необходим официальный кубик Рубика, а я купил тот, что используется для спидкубинга. У него другие цвета граней (например, нет белого), и робот надорвался, не сумел его сосканировать. Хорошо, сказал я, поскрёб по сусекам, нашёл официальный кубик, правда, возрастом под два десятка лет. С его затёртыми и залапанными наклейками робот тоже работать не захотел.

Ну что ж, всё равно мне пришлось бы рано или поздно совать нос в код, т.к. родной софт майндкубера умеет только собирать полностью, но не умеет собрать отдельную конфигурацию. Исходники под NXT опубликованы, а вот под EV3 я их не нашёл. Мне удалось поправить только сканирующую фазу для NXT, обновлённые роботы спокойно собирали и мой спидкубик, и официальный, что я привёл на фотографиях выше. Но в итоге тесниться в NXT мне надоело, там оказалась съеденной почти вся память, поэтому я решил писать код с нуля под EV3.

Итак, постановка задачи: написать весь софт под существующий хард MindCub3r EV3, для начала софт должен просто собирать кубик. Минимизировать количество ходов в сборке меня не интересует, мне нужен как можно более простой код. Эта статья говорит только про то, как решать кубик, в следующей я опишу сканирование и управление сервами. В среднем решение получается длиной слегка за сто ходов.

Пишем код

Использованный метод

В мире огромное количество алгоритмов, наверное, самым правильным было бы запрограммировать вот этот. Но это надо думать, изобретать эвристики для A* с итеративным заглублением, а я ленивый. Кроме того, это надо думать, как его использовать, чтобы получить заданную конфигурацию, а я ленивый. Поэтому я буду пользоваться самым тупым и прямым методом: при помощи Cube Explorer записываем все последовательности поворотов, которые позволяют собрать

  • нижнее переднее ребро
  • нижний правый передний угол
  • переднее правое ребро
  • верхний правый передний угол
  • верхнее переднее ребро

Затем код будет выглядеть следующим образом:

(исполнить четыре раза) {
    собрать нижнее переднее ребро;
    повернуть весь куб на 90° вокруг вертикальной оси;
}

(исполнить четыре раза) {
    собрать нижний правый передний угол;
    повернуть весь куб на 90° вокруг вертикальной оси;
}

(исполнить четыре раза) {
    собрать переднее правое ребро;
    повернуть весь куб на 90° вокруг вертикальной оси;
}

(исполнить четыре раза) {
    собрать верхний правый передний угол;
    повернуть весь куб на 90° вокруг вертикальной оси;
}

(исполнить четыре раза) {
    собрать верхнее переднее ребро;
    повернуть весь куб на 90° вокруг вертикальной оси;
}

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

Структура данных

Грани кубика назовём стандартно: F — передняя, R — правая, B — задняя, L — левая, U — верхняя, D — нижняя. Вот стандартные вращения:

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

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

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

Собранный куб должен быть представлен парой массивов {0, 1, 2, 3, 8, 9, 10, 11, 20, 21, 22, 23} и {0, 1, 2, 3, 20, 21, 22, 23}, это рёбра и углы, соответственно. Например, ребро номер 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] = {4,8,16,15, 0,12,20,11, 5,9,17,12, 1,13,21,8, 6,10,18,13, 2,14,22,9, 7,11,19,14, 3,15,23,10, 0,3,2,1, 4,7,6,5, 20,21,22,23, 16,17,18,19};
const unsigned char how_corners_move[6][12] = {4,12,19,11, 0,16,23,7, 8,20,15,3, 8,5,13,16, 4,1,17,20, 0,9,21,12, 9,6,14,17, 5,2,18,21, 1,10,22,13, 7,15,18,10, 3,19,22,6, 11,23,14,2, 0,3,2,1, 8,11,10,9, 4,7,6,5, 20,21,22,23, 16,17,18,19, 12,13,14,15};

// 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<12; i++) { // # edges
        for (int j=0; j<8; j++) { // 4*2 edge facets are to be moved
            if (how_edges_move[face_idx][j] == edges[i]) {
                edges[i] = how_edges_move[face_idx][(j+count)%4+(j/4)*4];
                break;
            }
        }
    }
    for (int i=0; i<8; i++) { // # corners
        for (int j=0; j<12; j++) { // 4*3 corner facets are to be moved
            if (how_corners_move[face_idx][j] == corners[i]) {
                corners[i] = how_corners_move[face_idx][(j+count)%4+(j/4)*4];
                break;
            }
        }
    }
}

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] = {"F2 ", "U1 ", "U2 ", "U3 ", "U3 ", "R3 F1 R1 ", "U3 ", "L1 F3 L3 ", "D1 R3 D3 ", "D2 B3 D2 ", "D3 L3 D1 ", "F3 ", "F1 ", "D1 R1 D3 ", "D2 B1 D2 ", "D3 L1 D1 ", "F3 ", "R1 ", "B1 ", "L3 ", "", "R2 ", "B2 ", "D1 "};

const char alg_FR_edge[]   [34] = {"U2 ", "U3 ", "F3 U3 F1 U1 R1 U1 R3 ", "U1 ", "U1 ", "U2 ", "U3 ", "R1 U1 R3 U3 F3 U3 F1 ", "", "D1 B1 U2 B3 D3 R1 U3 R3 ", "D1 B2 D3 U1 R2 ", "D3 L3 U2 L1 D1 F3 U1 F1 ", "F3 U1 F1 U3 R1 U2 R3 U2 R1 U3 R3 ", "R2 U2 R2 U2 R2 ", "R1 F3 B1 U3 B2 U1 F1 B3 R3 B2 ", "F2 U2 F2 U2 F2 "};

const char alg_UF_edge[]   [40] = {"", "R2 U1 F1 B3 R2 B1 F3 U1 R2 ", "R2 U3 F1 B3 R2 B1 F3 U3 R2 ", "F2 U3 L1 R3 F2 R1 L3 U3 F2 ", "R3 F1 R1 F1 R2 B3 D3 F3 D1 F1 B1 R2 F2 ", "R3 F3 R2 D2 L2 B3 L2 D2 R3 ", "R1 U1 R3 U3 R3 L1 F1 R1 F3 L3 ", "L1 F1 L2 D2 R2 B1 R2 D2 L1 "};
const char alg_DRF_corner[][10] = {"U3 ", "F3 U2 F1 ", "F3 U3 F1 ", "R1 U2 R3 ", "F3 U3 F1 ", "U1 ", "R1 U2 R3 ", "R1 U3 R3 ", "R1 U1 R3 ", "F3 U1 F1 ", "F3 U2 F1 ", "U3 ", "F3 U2 F1 ", "R3 U3 R1 ", "B3 U3 B1 ", "L3 U3 L1 ", "R1 U2 R3 ", "B1 U1 B3 ", "L1 U1 L3 ", "F1 U1 F3 ", "", "B1 U1 B3 ", "L1 U2 L3 ", "L3 U3 L1 "};

const char alg_URF_corner[][40] = {"", "U3 F2 L2 F3 R3 F1 L2 F3 R1 F3 ", "B1 L3 B1 R2 B3 L1 B1 R2 B2 ", "U3 ", "F1 R2 F1 U3 L2 U1 F3 R2 F1 U3 L2 U1 F2 ", "L1 U1 L3 B2 D3 F1 R3 F3 D1 B2 U1 ", "U1 F1 U3 B3 U1 F3 U3 B1 ", "F1 R1 U1 R3 U3 F3 ", "B1 U2 B2 R1 D3 R1 D1 R2 B2 U2 B3 U2 ", "B1 U3 F1 U1 F3 B3 U2 F1 U1 F3 U2 ", "R1 B2 L3 D1 L3 D3 L2 B2 R3 U3 ", "L1 U1 F1 U3 F3 L3 U2 "};

// 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<12; e++) { // D edges have numbers 8..11
            while (edges[e] != 20) { // solved FD edge has the position 20
                apply_sequence(alg_DF_edge[edges[e]], e-8);
            }
            rotate_entire_cube();
        }

        for (int c=4; c<8; c++) { // D corners have numbers 4..7
            while (corners[c] != 20) { // solved DRF corner has the position 20
                apply_sequence(alg_DRF_corner[corners[c]], c-4);
            }
            rotate_entire_cube();
        }

        for (int e=4; e<8; e++) { // middle edges have numbers 4..7
            while (edges[e] != 8) { // solved edge number 4 has the position 8
                apply_sequence(alg_FR_edge[edges[e]], e-4);
            }
            rotate_entire_cube();
        }

        for (int c=0; c<4; c++) { // U corners have numbers 0..3
            apply_sequence(alg_URF_corner[corners[c]], c);
            rotate_entire_cube();
        }

        for (int e=0; e<4; e++) { // U edges have numbers 0..3
            apply_sequence(alg_UF_edge[edges[e]], e);
            rotate_entire_cube();
        }

Обратите внимание, что 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!

Итак, у нас есть солвер, в следующий раз будем управлять непосредственно роботом.

Понравилась статья? Поделить с друзьями:
  • Робот собака инструкция на русском языке
  • Робот сборщик кубика рубика ev3 инструкция
  • Робот с клешней lego ev3 инструкция
  • Робот пятиминутка ev3 инструкция по сборке
  • Робот пылесос хиаоми с влажной уборкой инструкция