суббота, 30 июня 2018 г.

Программирование на NXT-G под Linux

Проверено на Linux Mint 18.3

Особенности:



 1 NXT-G — это графический язык программирования Lego-роботов, под него разработана среда Lego MindStorms NXT 2.0.

 2 Не существует версии Lego MindStorms NXT 2.0 для linux (но есть для Windows и MacOS)

 3 Запуск будет проводится с помощью программы wine (она позволяет запускать windows-приложения — в основном 32-битные — на linux). Функционал программы будет полностью работать, за исключением работы с NXT-блоком по USB и Bluetooth.

 4 У программы wine есть проблемы взаимодейстсвия с USB-устройствами. Несмотря на то, что подключение флешек она видит, мой NXT-блок она так и не увидела (на  официальном сайте wine также описана эта проблема). Поэтому взаимодействовать по USB-проводу с NXT-блоком не получится, как и по Bluetooth (( Для этого мы воспользуемся другой программой — компилятором nbc, который также позволяет загружать файлы на NXT-блок. Но обо всём по порядку.

Замечание. NXT-блок так же можно программировать на текстовом си-подобном языке, читайте об этом в статье «Программирование NXT-блока на си-подобном NXC» (здесь скоро появится ссылка!).

Важное замечание. Никогда не запускайте wine с правами администратора!
sudo wine


Совет. Команды можно не перепечатывать, а копировать и вставлять в терминал (комбинации Ctrl + Insert / Shift + Insert)

Итак, у меня есть доступ к интернету (для скачивания 32-битного установщика Lego Mindstorms NXT) и 64-разрядная система Mint 18.3. Если вы ещё не передумали, то переходим к установке.

Далее в статье мы решим проблему запуска и программирования робота. Поехали!


Установка Lego Mindstorms NXT



 1 У меня уже установлен wine и winetricks — программы для запуска windows приложений на linux. Если они у вас не установлены, то см. инструкцию как это сделать из статьи «Программирование на EV3-G под Linux», если установлены я настойчиво рекомендую переустановить. Так сказать, для чистоты эксперимента.

 2 Ниже используются версии
wine-2.4 (Staging) и winetricks 20180603-next


 3 Создаём новую «бутылку» wine для программы LEGO Mindstorms NXT. Т.к. ранее я уже использовал программу wine установил LEGO Mindstorms EV3 в папку-«бутылку» ev3 и Компас — в kompas16.1_32), рядом я создам ещё одну папку для LEGO Mindstorms NXT, назову её legoNXT. При этом, если будет программный сбой, вынужденное удаление «бутылки» никак не будет влиять на соседние программы-«бутылки». В этом большое удобство.


WINEPREFIX="/home/$USER/.local/share/wineprefixes/legoNXT" WINEARCH=win32 wineboot

(При установке не поддаемся уговорам установить Mono (потому что дальше будем устанавливать Framework), Gecko — можно установить.)

Совет. Команды здесь и далее удобно выделять и копировать в свой терминал. Комбинации Ctrl + Insert / Shift + Insert.


 4 Для работы LEGO Mindstorms NXTLEGO Mindstorms NXT нужно поставить Framework 4.0
WINEPREFIX="/home/$USER/.local/share/wineprefixes/legoNXT" WINEARCH=win32 ~/winetricks -q dotnet40


 5 Далее убеждаемся в окне конфигурации, что у нас выбрана совместимость с ОС Windows7
WINEPREFIX="/home/$USER/.local/share/wineprefixes/legoNXT" WINEARCH=win32 winecfg


 6 Скачиваем с официального сайта Lego программу Lego Mindstorms NXT. Для этого создаём папку в домашней директории, переходим в неё и запускаем скачивание


mkdir ~/legotemp


cd ~/legotemp/


wget https://www.lego.com/assets/franchisesites/mindstorms/mac-window-installers/nxt-g-installer-v2.0f6-windows.zip

 7 Извлекаем архив
unzip nxt-g-installer-v2.0f6-windows.zip


 8 Теперь всё готово к установке. Переходим в папку установщика (укажите свой путь)
cd "/home/$USER/legotemp/nxt-g installer v2.0f6 (windows)"

 9 Запускаем установщик
WINEPREFIX="/home/$USER/.local/share/wineprefixes/legoNXT" WINEARCH=win32 wine setup.exe
 10 По завершению на Рабочем столе сейчас появилось два ярлыка. Один из них не функционирует, он лишний. Удаляем его
rm -f "/home/$USER/Рабочий стол/LEGO MINDSTORMS NXT 2.0.lnk"


 11 Установка закончена запустите программу, сделав двойной щелчок по её ярлыку на Рабочем столе.

Замечание. Если в процессе установки или во время запуска установленной программы появляются такие окна,


то возможно вы не установили заранее пакет dotnet40 (см. алгоритм установки). Вам нужно удалить папку-«бутылку» legoNXT и повторить установку.


Настройка программы Lego Mindstorms NXT

Программа установлена, запускается и функционирует. Но при подключении NXT-блока к компьютеру сбросить на него ваш код не получится. Проблема известная, из-за неё на сайте wine программа даже получила пониженный бронзовый рейтинг.

Ниже я предлагаю временное решение этой проблемы.

Суть решения в следующем. Загрузка управляющей программы на NXT-блок состоит из двух действий: компиляции программы (создаётся бинарный файл) и непосредственно передача программы на NXT-блок. Оба этих действия в обычных условиях происходят подряд. Мы же из разделим. Т.е. будем сохранять бинарный файл на компьютере и отдельно загружать его на NXT-блок с помощью другой программы.


Сохранение бинарного файла на компьютере


Небольшой ликбез. Файл проекта по умолчанию сохраняется на компьютере (с помощью меню FileSave as…) с расширение .rbt, бинарный (исполняемый, скомпилированный rbt-файл) имеет расширение rxe. Именно он нам и нужен. Ещё используются:  звуковой файл — .rso, графический — .ric.

О формате .rxe очень мало информации в интернете (см., например).

К сожалению у программы Lego Mindstorms NXT нет стандартного функционала для сохранения бинарных rxe-файлов проектов. Чтобы сохранить на компьютере такой файл нужно скачать библиотеку DownloadToFile и скопировать её в специальную папку программы по алгоритму.

1. Перейдите в папку программы Lego Mindstorms NXT куда будет помещена библиотека (если вы делали установку по инструкции, указанной выше, пути должны совпасть)
cd "/home/$USER/.local/share/wineprefixes/legoNXT/drive_c/Program Files/LEGO Software/LEGO MINDSTORMS NXT/engine/project"

2. Скачайте библиотеку
wget www.teamhassenplug.org/NXT/DownloadToFile.llb
(ссылка взята с сайта)

3. Откройте или перезапустите открытую программу Lego Mindstorms NXT.

4. Убедитесь, что в меню Tools появился новый пункт — Download to File...
5. Создайте любой проект, сохраните его (FileSave as …) и в тоже место сохраните исполняемый файл (меню Tools Download to File… — не забудьте указать тот же путь! — кнопка Browse и нажмите кнопку Download). Я сохранил на Рабочий стол под именем First.rxe:

6. Откройте папку с сохранёнными файлами, обратите внимание на расширения.

Загрузка бинарного файла на NXT-блок


Для загрузки файла на NXT-блок воспользуемся компилятором nbc, который помимо компилирования замечательного си-подобного текстового языка NXC (о котором читайте в статье ссылка ожидается) даёт удобный способ загрузки файлов на NXT-блок через терминал. Ниже рассмотрим установку компилятора, механизм загрузки и напишем сценарий для автоматической загрузки rxe-файлов по двойному щелчку на них.

1. Установка nbc
sudo apt install nbc


2. Включите  NXT-блок и подключите его USB-кабелем к компьютеру.

3. Проверьте, что подключение прошло успешно. Для этого изучите вывод команды dmesg с подключенным блоком (если реакции нет, изучите инструкцию).
dmesg
4. Перейдите к месту сохранения файла (у меня это Рабочий стол):
cd "/home/mint/Рабочий стол"


5. Компилятор nbc имеет множество настроек, посмотреть их можно дав команду
nbc -help


6. Мы будем использовать -b, давая компилятору понять, что файл бинарный и его не нужно компилировать, -d — для загрузки и -S=USB, обозначая передачу файла по USB-каналу.

7. Загрузим созданный ранее файл на NXT-блок:
nbc -b -d -S=USB First.rxe


8. Проверяем. Возьмите в руки NXT-блок. Перейдите My FilesSoftware files. Первый файл, который вы увидите должен быть First (без расширения).

9. Запустите его, он полностью работоспособен.

Замечание. Также можно переносить графические .ric и звуковые файлы .rso, файлы с другими расширениями не будут отображаться в NXT-блоке, хотя и перенесутся в него.

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


Загрузка rxe-файлов по двойному щелчку


Когда инструкция будет выполнена, двойной щелчок по rxe-файлу будет автоматически загружать его на NXT-блок. Таким образом, наша задача состоит в создании ассоциации между типом файлов .rxe и компилятором nbc с нужными ключами.

Эту ассоциацию нельзя задать напрямую.

Во-первых, нужно создать ярлык для компилятора nbc (сейчас ярлыка нет) — в нём мы должны указать нужные ключи (-b -d -S=USB).

Во-вторых, сейчас по умолчанию rxe-файлы определяются Linux'ом как «двоичный (application/octet-stream)», естественно существуют другие двоичные файлы с другими расширениями или даже без них, которые никакого отношения не имеют к нашим файлам. Поэтому без подготовки нельзя назначить ярлык nbc для работы с rxe-файлами, т. к. система Linux автоматически будет распространять это действие на файлы с любыми расширениями, понимаемые ею как тип «двоичный (application/octet-stream)».

Сначала создадим ярлык для компилятора nbc.


Создание nbc.desktop


1. Ярлык — это тоже файл. Он представляет собой обычный текст, но расширение у него .desktop. Создадим такой файл (для этого можете использовать любой текстовый редактор, я использую nano)
sudo nano /usr/share/applications/nbc.desktop

2. Скопируйте и вставьте в него эти строки:
[Desktop Entry]
Name=nbc
Comment=Only for .rxe-, .ric-, .rso-file downloads to the NXT-brick
Exec=gnome-terminal -e "nbc -b -d -S=usb %F"
Terminal=false
Type=Application
StartupNotify=true
MimeType=application/x-nbc;
Icon=application-default-icon
Categories=GNOME;Utility;Development;Engineering;


3. Сохраните изменения и закройте nano. (Для тех, кто nano использует первый раз: Ctrl + O — сохранить, Ctrl + X — выйти.)

4. Ярлык создан! Убедитесь, что поиск в Меню его находит:
Далее создадим специальный тип для файлов с расширением rxe


MIME-тип для rxe-файлов


1. Определим, так называемый, MIME-тип для файлов с расширением rxe. Создаём файл xml:
sudo nano /usr/share/mime/packages/nbc.xml

2. Скопируйте и вставьте в него эти строки:
<?xml version="1.0" encoding="UTF-8"?>
<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
<mime-type type="application/x-nbc">
<sub-class-of type="application/x-executable"/>
<comment>Only for .rxe-, .ric-, .rso-file downloads to the NXT-brick</comment>
<glob pattern="*.rxe"/>
<glob pattern="*.ric"/>
<glob pattern="*.rso"/>
</mime-type>
</mime-info>


3. Сохраните изменения и закройте nano.

4. Добавим этот файл в базу данных MIME. Операция может занять несколько минут.
sudo update-mime-database /usr/share/mime


Далее связываем MIME-тип rxe c ярлыком nbc.desktop.

5. Для этого открываем файл defaults.list
sudo nano /usr/share/applications/defaults.list

6. и добавляем в него следующую строку
application/x-nbc=nbc.desktop


7. Сохраняемся и закрываем редактор.

8. Готово! Включите NXT-блок, соедините его с компьютером по USB.

9. Найдите любой rxe-файл (я сделал копию первого файла и назвал её second.rxe).
10. Дважды щёлкните мышкой по файлу. Файл должен загрузиться на NXT-блок!

Замечание. Кроме rxe-файлов также можно загружать ric- и rso-файлы.


Бонус. Экстренное закрытие программы


Если на Linux'е зависла программа:

1. Откройте терминал, например, комбинацией Ctrl + Alt + T.

2. Запустите xkill

3. Курсор мыши превратится в букву «Х».

4. Щёлкните мышкой по зависшей программе.

Комментариев нет:

Отправить комментарий