Установка ROS на Raspberry Pi
Я уже писал ранее об установке rosserial_arduino для взаимодействия микроконтроллера Arduino с роботической платформой ROS в предыдущей статье. rosserial_arduino является пакетом стека rosserial, разработанного для платформы ROS, и “превращает” плату Arduino в самостоятельный узел ROS, с которым могут взаимодействовать другие компоненты системы. При использовании Arduino для робототехнических проектов существует одно существенное ограничение: Arduino не может быть использован как полноценный вычислительный узел, который может обрабатывать все операции, требуемые для нормального функционирования робота. Например, на нем нельзя запускать скрипты OpenCV для задач компьтерного зрения. В данной статье я хочу рассказать о своем опыте установки системы ROS и подключении Arduino к микрокомпьютеру Raspberry Pi с использованием уже знакомого пакета rosserial_arduino.
Мотивация
После знакомства с платформой rosserial_arduino, у меня возник вопрос: можно ли каким-то образом использовать Arduino в связке с более мощным микрокомпьютером таким образом, чтобы сделать робота более независимым от лаптопа.
Тут у меня возникла идея попробовать ROS на микрокомпьютере Raspberry Pi. Raspberry Pi является самостоятельным мини-компьютером на плате. У него есть CPU чип, графический чип, слот для SD-карты, вход Ethernet, несколько USB интерфейсов и HDMI видео-выход для подключения монитора. К USB-входам можно подключить мышь, клавиатуру, а также внешний HDD.
Связка Raspberry Pi с Arduino является очень перспективной и уже неоднократно использовалась в робототехнических проектах.
Raspberry Pi позволяет также подключить камеру (веб-камеру или специальную RPi Board camera). Мне в руки год назад попал простенький колесный робот на модифицированной плате Arduino Uno. Только сейчас у меня в руках оказался Raspberry Pi модели B.
Установка ОС на Raspberry Pi
Для начала нужно установить дистрибутив Linux на “малинку”. Проще всего это сделать с менеджером установки ОС NOOBS. Как это сделать можно прочитать в данном мануале на официальном портале Raspberry Pi.
Я выбрал для установки Raspbian — модифицированный дистрибутив Debian, специально разработанный для Raspberry.
Замечание: при подключении монитора часто возникают проблемы с отображением картинки, в частности это происходит со старыми мониторами, неимеющими вход HDMI. Здесь нам на помощь приходит файл config.txt — конфигурационный файл Raspberry для настроек монитора. В некоторых случаях он уже имеется в архиве образа системы (Raspbian), в случае NOOBS его нужно создать в корне SD карты.
Вставьте в файл следующие строки:
# For more options and information see
# http://www.raspberrypi.org/documentation/configuration/config-txt.md
# Some settings may impact device functionality. See link above for details
# uncomment if you get no picture on HDMI for a default "safe" mode
hdmi_safe=1
# uncomment this if your display has a black border of unused pixels visible
# and your display can output without overscan
#disable_overscan=1
# uncomment the following to adjust overscan. Use positive numbers if console
# goes off screen, and negative if there is too much border
#overscan_left=16
#overscan_right=16
#overscan_top=16
#overscan_bottom=16
# uncomment to force a console size. By default it will be display's size minus
# overscan.
#framebuffer_width=1280
#framebuffer_height=720
# uncomment if hdmi display is not detected and composite is being output
hdmi_force_hotplug=1
# uncomment to force a specific HDMI mode (this will force VGA)
#hdmi_group=1
#hdmi_mode=1
# uncomment to force a HDMI mode rather than DVI. This can make audio work in
# DMT (computer monitor) modes
#hdmi_drive=2
# uncomment to increase signal to HDMI, if you have interference, blanking, or
# no display
config_hdmi_boost=4
# uncomment for composite PAL
#sdtv_mode=2
#uncomment to overclock the arm. 700 MHz is the default.
#arm_freq=800
В данном случае важными строками являются:
hdmi_safe=1
…
hdmi_force_hotplug=1
…
config_hdmi_boost=4
В моем случае данные настройки позволили получить корректное изображение на мониторе с входом VGA.
Настройка удаленного доступа к Raspberry Pi
К плате Raspberry Pi можно подключиться по сети через SSH. Для этого Raspberry Pi должен быть подключен к сети либо посредством Ethernet кабеля (для этого есть специальный вход на плате), либо через Wi-Fi адаптер, подключаемый к USB порту. При подключении Ethernet кабеля Raspberry автоматически получает IP адрес в сети и сразу становится доступен.
В случае использования адаптера необходимо выполнить ряд несложных процедур.
Я использовал вот такой Wi-Fi адаптер TPLINK:
Подключаем адаптер в USB порт и проверяем, определяется ли устройство в системе командой
$ iwconfig
Теперь сканируем пространство для поиска доступных беспроводных сетей:
$ sudo iwlist wlan0 scan
В поле ESSID в выводе команды указывается имя точки доступа.
Теперь соединимся с точкой доступа по WPA-шифрованию с помощью утилиты wpa_supplicant.
С помощью утилиты wpa_passphrase, которая входит в состав пакета wpa_supplicant, генерируем пароль на основе ключа доступа:
$ wpa_passphrase <hotspot_name> <hotspot_access_key>
где hotspot_name и hotspot_access_key это соответственно имя точки доступа и ключ доступа.
Утилита выдает сгенерированную строку psk.
Далее весь блок network, содержащий ssid сети и строку psk, вставляем в конец конфигурационного файла /etc/wpa_supplicant/wpa_supplicant.conf и сохраняем. В завершение перезагружаем наш Raspberry Pi и проверяем подключение к сети.
Для подключения по SSH в терминале на компьютере нужно выполнить команду:
$ ssh pi@<raspi_ip>
где — IP адрес малинки, который можно узнать командой ifconfig, выполненной непосредственно в терминале “малинки”.
Для подключения по SSH с возможностью запуска графических приложений используйте команду:
$ ssh -X pi@<raspi_ip>
К “малинке” можно подключиться в режиме удаленного рабочего стола с помощью программы Virtual Network Computing (VNC). Управление осуществляется путем передачи нажатий клавиш на клавиатуре и движений мыши с одного компьютера на другой и ретрансляции содержимого экрана через компьютерную сеть. Система VNC является платформонезависимой.
Сначала установим на Raspberry Pi сервер VNC с помощью команды в терминале:
$ sudo apt-get install tightvncserver
После окончания установки выполните команду:
$ vncserver :1 -geometry 1280x800 -depth 16
Эта команда запустит VNC-сервер. В данном случае это означает, что запущена виртуальная X-сессия (виртуальное представление рабочего стола Raspberry Pi). Теперь, после запуска клиента VNC и подключения к нему, вы будете подключены именно к этому виртуальному рабочему столу.
Параметр :1 определяет номер порта, на котором будет запущен процесс VNC. Параметр geometry настраивает разрешение (в данном случае — размер) виртуального рабочего стола. Параметр depth определяет глубину цвета отображения рабочего стола в битах (8, 16 и 24, по умолчанию — 16).
При первом запуске VNC-сервер попросит ввести пароль, который будет запрашиваться при подключении к удаленному рабочему столу.
Теперь установим VNC-клиент на стационарном компьютере:
$ sudo apt-get install xtightvncviewer
Мы готовы подключиться к удаленному рабочему столу “малинки”:
$ vncviewer <raspi_ip>:1
и введите пароль.
Откроется окно с изображением рабочего стола подобным этому:
Стоит отметить, что каждый раз при перезагрузке “малинки” VNC-сервер нужно запускать заново.
Подключение Arduino к Raspberry Pi
Плату Arduino можно подключить к Raspberry Pi так же легко, как и к обычному компьютеру. Для начала установим Arduino IDE на Raspberry Pi:
$ sudo apt-get update
$ sudo apt-get install arduino
Запускаем Arduino IDE командой:
$ arduino
Arduino IDE соединяется с Raspberry Pi через его USB кабель для программирования. Такое подключение требует, чтобы последовательная консоль (serial console) была отключена. По умолчанию Raspberry Pi конфигурирует последовательный порт (GPIO14-GPIO15) для обеспечения информации загрузки. Это также позволяет выполнить логин на Raspberry Pi через подключенное устройство. Для возможности программирования Arduino вам нужно отключить эту опцию по умолчанию.
Для отключения возможности авторизации нужно откредактировать системный файл inittab:
$ sudo nano /etc/inittab
Найдите строку:
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
, закомментируйте ее:
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
После этого сохраните и закройте файл.
При загрузке Raspberry Pi отправляет отладочные сообщения на последовательный порт. Это может быть полезно в некоторых случаях, но сейчас нам нужно отключить эту функциональность. Для этого отредактируем системный файл cmdline.txt:
$ sudo nano /boot/cmdline.txt
Найдите строку:
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
и удалите блок параметров console, чтобы в итоге получить строку такого вида:
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
Сохраните и закройте файл.
Чтобы изменения были применены системой нужно перезапустить Raspberry Pi:
$ sudo reboot
Теперь можно подключить плату Arduino к USB порту на Raspberry Pi, настроить Arduino IDE для вашей модели платы Arduino и загрузить на нее скетч.
Установка ROS и rosserial_arduino
Я выбрал для установки ROS Indigo. Инструкции по установке ROS Indigo детально описаны на официальной странице.
Я рекомендую установить вариант установки ROS-Comm. По своему опыту могу сказать, что установка варианта Desktop может занять очень долгое время порядка полудня.
После установки ROS и разрешении всех зависимостей с утилитой rosdep просто компилируем catkin_workspace:
$ catkin_make
$ catkin_make install
Запуск скетчей rosserial_arduino на Raspberry Pi
Теперь у нас установлен rosserial_arduino и мы можем запустить его:
$ roslaunch rosserial_python serial_node.py /de/ttyACM0
При запуске сервера rosserial возможно возникновение ошибки: no module named diagnostic_msgs.msg.
Чтобы решить проблему нужно скачать с официального репозитория ROS исходники сообщений ROS — common_msgs, которые отсутствуют в установке, и загрузить в папку пакета rosserial в папке workspace, затем скомпилировать ROS:
$ catkin_make install
Сейчас вы можете работать с rosserial_arduino на Raspberry Pi так же, как на обычном компьютере: создавать узлы, подисываться на темы, публиковать в темы и тд.
К Raspberry Pi можно подключить камеру RPi Board camera и использовать ROS пакет cv_bridge (интерфейс ROS для взаимодействия с OpenCV, описание можно найти здесь) для выполнения задач компьютерного зрения.
Вот кстати мой робот в полном вооружении:
Заключение
Надеюсь, что эта статья станет для вас хорошим входным руководством к действию для начала работы с ROS на Raspberry Pi и у вас появятся собственные идеи использования Raspberry Pi в связке с Arduino или другими микроконтроллерами подобного типа. Желаю вам удачи в ваших экспериментах и проектах и надеюсь, что скоро поделюсь своими новыми идеями в следующих статьях!
PS: Некоторые инструкции взяты из книги Петин В. А. «Электроника. Микрокомпьютеры Raspberry Pi. Практическое руководство».