Как стать автором
Обновить

Установка ROS на Raspberry Pi

Время на прочтение 7 мин
Количество просмотров 28K
Я уже писал ранее об установке rosserial_arduino для взаимодействия микроконтроллера Arduino с роботической платформой ROS в предыдущей статье. rosserial_arduino является пакетом стека rosserial, разработанного для платформы ROS, и “превращает” плату Arduino в самостоятельный узел ROS, с которым могут взаимодействовать другие компоненты системы. При использовании Arduino для робототехнических проектов существует одно существенное ограничение: Arduino не может быть использован как полноценный вычислительный узел, который может обрабатывать все операции, требуемые для нормального функционирования робота. Например, на нем нельзя запускать скрипты OpenCV для задач компьтерного зрения. В данной статье я хочу рассказать о своем опыте установки системы ROS и подключении Arduino к микрокомпьютеру Raspberry Pi с использованием уже знакомого пакета rosserial_arduino.

image


Мотивация


После знакомства с платформой 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.

image

Установка ОС на 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:

image

Подключаем адаптер в 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>

где <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

и введите пароль.
Откроется окно с изображением рабочего стола подобным этому:

image

Стоит отметить, что каждый раз при перезагрузке “малинки” 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

Замечание! При загрузке скетчей в Arduino IDE может возникнуть ошибка «fatal error: string: No such file or directory compilation terminated». Это означает, что у нас есть типы сообщений ROS в ros_lib, но они также должны быть скомпилированы в соответствующие типы для Arduino. Нужно скомпилировать их таким образом:

$ cd <sketchbook>/libraries
$ rm -rf ros_lib
$ rosrun rosserial_python make_libraries.py .

Сейчас вы можете работать с rosserial_arduino на Raspberry Pi так же, как на обычном компьютере: создавать узлы, подисываться на темы, публиковать в темы и тд.
К Raspberry Pi можно подключить камеру RPi Board camera и использовать ROS пакет cv_bridge (интерфейс ROS для взаимодействия с OpenCV, описание можно найти здесь) для выполнения задач компьютерного зрения.
Вот кстати мой робот в полном вооружении:

image

image

Заключение


Надеюсь, что эта статья станет для вас хорошим входным руководством к действию для начала работы с ROS на Raspberry Pi и у вас появятся собственные идеи использования Raspberry Pi в связке с Arduino или другими микроконтроллерами подобного типа. Желаю вам удачи в ваших экспериментах и проектах и надеюсь, что скоро поделюсь своими новыми идеями в следующих статьях!

PS: Некоторые инструкции взяты из книги Петин В. А. «Электроника. Микрокомпьютеры Raspberry Pi. Практическое руководство».
Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
+9
Комментарии 13
Комментарии Комментарии 13

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн