Добрый день уважаемые читатели! В последних статьях я рассказывал о популярных методах SLAM и визуальной одометрии, которые имеют поддержку в ROS. В этой статье я немного отклонюсь от темы и расскажу о настройке и работе с ROS на микрокомпьютере NVIDIA Jetson TK1. После установки всего необходимого мы подключим и попробуем в деле стереокамеру ZED от streolabs. Кому интересно прошу под кат.

О NVIDIA Jetson


Для начала рассмотрим платформу NVIDIA Jetson TK1. NVIDIA Jetson TK1 это микрокомпьютер NVIDIA на основе Tegra K1 SOC (CPU+GPU на одном чипе с поддержкой CUDA). NVIDIA Jetson может похвастаться 4-х ядерным CPU ARM Cortex-A15 с 2.3 ГГц, имеет те же самые компоненты, что и Raspberry Pi (HDMI, USB 2.0 и 3.0, Ethernet), а также модули, свойственные ПК: SATA, mini-PCIe. Мобильный процессор Tegra K1 имеет очень близкие свойства и архитектуру к десктопным GPU, что позволяет выдерживать большие нагрузки с минимальным энергопотреблением. Как говорится на официальной странице процессор позволяет запускать на плате любые ресурсоемкие графические задачи, такие как распознавание лиц, дополненная реальность и даже задачи компьютерного зрения для беспилотных автомобилей. Более подробнее о всех возможностях платформы можно прочитать здесь.

Встроенная память на NVIDIA Jetson TK1 представлена модулем eMMC размером 16 Гб. По умолчанию на NVIDIA Jetson TK1 предустановлена операционная система Ubuntu 14.04.

Для питания микрокомпьютера используется AC/DC адаптер на 12 В.

image

Стереокамера ZED


Стереокамера ZED является пассивной камерой глубины, состоящей из двух обычных RGB камер, удаленных на расстояние 12 см друг от друга, с обзором до 20 метров. В отличие от активных камер (таких как ASUS Xtion и Microsoft Kinect), стереокамера ZED не имеет ИК-лазера для измерения расстояния. Камера относительно недорогая (стоит 449$). Преимуществом камеры можно считать ее малые размеры (175 x 30 x 33 мм) и легковесность (159 г).

Камеру можно использовать для построения карт местности вне помещения на дроне.
Подробнее о камере можно прочитать на официальной странице.

image

Настройка Ubuntu на NVIDIA Jetson TK1


Подключим NVIDIA Jetson TK1 с помощью HDMI к монитору, провод Ethernet в соответствующий разъем и наконец с помощью AC/DC адаптера на 12 В к источнику питания.

Для установки системы на NVIDIA Jetson может понадобиться установить JetPack TK1 (инструкцию можно найти здесь). У меня на руках оказался NVIDIA Jetson с уже установленным JetPack и системой Ubuntu 14.04, поэтому здесь я не рассматриваю его установку.

Итак система Ubuntu 14.04 запустится автоматически. Для авторизации используем логин и пароль ubuntu.

Узнаем IP адрес хоста Jetson:

ifconfig

Получим аппаратные характеристики:

lscpu

Вывод будем таким:

Architecture:          armv7l
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1

Возможна проблема с подключением к Jetson по SSH: ifconfig отображает IP адрес, но подключиться к Jetson по этому адресу не удается. Чтобы решить проблему откроем файл /etc/network/interface из-под рута:

sudo nano /etc/network/interface

и добавим строки:

auto eth0
iface eth0 inet dhcp

Мы сделали динамическое назначение IP адреса. Сохраним изменения и выполним:

sudo ifup eth0

Теперь все должно работать. Данное решение было взято отсюда.
Теперь подключимся к Jetson по SSH:

ssh -X ubuntu@<ip_address>

Установка CUDA


Для работы с камерой ZED нам нужен ZED SDK, который требует установленной CUDA версии 6.5. Скачаем deb файл для CUDA Toolkit 6.5 for L4Tотсюда (инструкция взята отсюда):

wget http://developer.download.nvidia.com/compute/cuda/6_5/rel/installers/cuda-repo-l4t-r21.1-6-5-prod_6.5-14_armhf.deb

Установим метаданные репозитория для CUDA for L4T, который только что скачали:

sudo dpkg -i cuda-repo-l4t-r21.1-6-5-prod_6.5-14_armhf.deb

Скачаем и установим сам CUDA Toolkit включая OpenGL toolkit для NVIDIA:

sudo apt-get update

Установим cuda-toolkit-6-5:

sudo apt-get install cuda-toolkit-6-5

Добавим пользователя ubuntu в группу «video» для обеспечения доступа к GPU:

sudo usermod -a -G video $USER

Здесь $USER это ubuntu.
Добавим пути до папки установки CUDA в скрипт .bashrc и выполним его в текущем терминале:

echo "export PATH=/usr/local/cuda-6.5/bin:$PATH" >> ~/.bashrc
echo "export $PATH=/usr/local/cuda-6.5/bin:$PATH" >> ~/.bashrc
source ~/.bashrc

Проверим, что CUDA Toolkit установлен на устройстве:

nvcc -V

Настройка USB 3.0 на Jetson TK1


По умолчанию порт USB 3.0 настроен системой на Jetson TK1 как USB 2.0. Нам необходимо его сконфигурировать как USB 3.0. Для этого откроем файл /boot/extlinux/extlinux.conf под рутом:

sudo vi /boot/extlinux/extlinux.conf

Найдем строку ‘usb_port_owner_info=0‘. Если эта строка встречается два раза, то изменим последнее включение. Перепишем ‘usb_port_owner_info=0‘ на ‘usb_port_owner_info=2‘.

Установка ZED SDK


Процедура установки выглядит подобным образом как и на десктопной Linux. Стоит только отметить, что OpenCV уже установлен при установке JetPack для того, чтобы можно было для него использовать оптимизацию Tegra. Поэтому ручная установка OpenCV не требуется.

Для использования стереокамеры ZED нам нужно установить ZED SDK 1.2. В качестве установщика используется специальный для Jetson TK1 .run файл. Скачаем установщик:

wget https://www.stereolabs.com/developers/downloads/archives/ZED_SDK_Linux_JTK1_v1.2.0.run

Установим для файла права на исполнение и запустим его в терминале:

sudo chmod +x ZED_SDK_Linux_JTK1_v1.2.0.run
./ZED_SDK_Linux_JTK1_v1.2.0.run

Примем условия лицензионного соглашения, нажмем ‘q’ и затем ‘Y’. Далее выполним процедуру следуя инструкциям.

Запустим ZED Explorer на самом Jetson (не работает при подключении удаленно через SSH):

/usr/local/zed/tools/ZED\ Explorer

image

Установка ROS драйвера для стереокамеры ZED


Я использовал в своих экспериментах ROS Indigo. Установим зависимости для ROS драйвера:

sudo apt-get install ros-indigo-tf2-ros ros-indigo-image-transport ros-indigo-dynamic-reconfigure ros-indigo-urdf

Установим ROS враппер для ZED камеры:

cd ~/catkin_ws/src
git clone https://github.com/zastrix/zed-ros-wrapper.git
git checkout ef3ad46f14cf62ff21083829a1fa6879d20246de
cd ~/catkin_ws
catkin_make

Запустим zed_wrapper выполнив следующие команды в разных окнах терминала:

roscore
roslaunch zed_wrapper zed.launch

Покажем активные топики:

rostopic list

В списке помимо стандартных топиков увидим топики с префиксом /zed:

/zed/depth/camera_info
/zed/depth/depth_registered
/zed/joint_states
/zed/left/camera_info
/zed/left/image_raw_color
/zed/left/image_rect_color
/zed/odom
/zed/point_cloud/cloud_registered
/zed/rgb/camera_info
/zed/rgb/image_raw_color
/zed/rgb/image_rect_color
/zed/right/camera_info
/zed/right/image_raw_color
/zed/right/image_rect_color

Запустим rqt_image_view:

rosrun rqt_image_view rqt_image_view

При выборе топика /zed/depth/depth_registered получим карту глубины:

image

RGB изображение с левой камеры (/zed/left/image_raw_color):

image

И наконец RGB изображение с правой камеры (/zed/right/image_raw_color):

image

Данные с камеры публикуются в топики /zed/rgb/image_raw_color и /zed/depth/depth_registered с частотой 15Hz.
Узнаем частоту публикации облака точек в топик /zed/point_cloud/cloud_registered:

rostopic hz /zed/point_cloud/cloud_registered

average rate: 4.146
    	min: 0.202s max: 0.371s std dev: 0.04798s window: 11
average rate: 4.178
    	min: 0.191s max: 0.371s std dev: 0.04306s window: 16

Запустим rviz на самом Jetson (мне не удалось успешно запустить его при подключении через ssh с опцией -x):

rosrun rviz rviz

image

image

SLAM На NVIDIA Jetson со стереокамерой ZED


Давайте теперь попробуем камеру ZED на практической задаче. На NVIDIA Jetson можно без проблем запустить алгоритм SLAM RTAB-MAP. Для начала установим враппер ROS для RTAB-MAP:

sudo apt-get install ros-indigo-rtabmap-ros

Теперь запустим rtabmap с использованием камеры ZED. Если у нас не запущен zed_wrapper, то запускаем его:

rosrun zed_wrapper zed_wrapper_node

Запустим rtabmap:

rtabmap

Выберем камеру ZED в окне rtabmap в качестве источника:

image

Я не проводил испытания RTAB-MAP на NVIDIA Jetson, поэтому оставляю вам, дорогие читатели, возможность испытать этот алгоритм SLAM. Об использовании RTAB-MAP можно прочитать в двух моих последних статьях (здесь и здесь).

Надеюсь эта статья станет для вас хорошей стартовой точкой для использования стереокамеры ZED и микрокомпьютера NVIDIA Jetson. Желаю вам удачи в экспериментах и до новых встреч!

PS: Интересно ваше мнение по поводу выбора недорогой стереокамеры для экспериментов. Поддержка ROS не имеет большого значения, главное цена. Свои варианты пожалуйста пишите в комментариях к статье.

PS (Upd): Хотелось бы попробовать пассивные стереокамеры типа ZED. Желательно способные работать с Raspberry Pi 3.

Комментарии (22)


  1. Javian
    27.01.2018 20:42

    Возможно для этих целей подойдет Kinect. Б/у еще дешевле выйдет чем $449 у камеры в обзоре.


    1. Quiensabe
      27.01.2018 21:18

      Кинекту нужен комп. Вот Vico VR — можно (а мозги робота — на андроид смартфоне, заодно и его камеру можно использовать). Но это все же не пассивный сенсор, для определенных задач — не подойдет.


      1. lonelymyp
        27.01.2018 22:53

        Но и этой стерео камере тоже комп нужен.


    1. lonelymyp
      27.01.2018 22:47

      У кинекта раз в 10 дальность ниже, что накладывает определённые ограничения.


    1. MastaLomaster
      28.01.2018 00:15

      Не забывайте, что ни Kinect, ни RealSense не могут работать при солнечном освещении. И это сильно ограничивает их применение. Если бы не это, я бы давно парктроник себе из них соорудил — куда лучше ультразвуковых датчиков получилось бы…


      1. CreFroD
        28.01.2018 10:37

        Смотря какой RealSense. Например, R200 прекрасно работает на улице.


  1. Alex_ME
    27.01.2018 23:04

    А знаете какой-нибудь SLAM (желательно, под ROS) для лидаров (Velodyne)?


    1. vovaekb90 Автор
      28.01.2018 13:10

      Знаю только segmatch и loam_velodyne с открытыми исходниками. К сожалению, большинство методов не имеет открытого кода.


  1. CreFroD
    27.01.2018 23:40

    А в чем преимущество камеры ZED перед сенсорами RealSense для дальних дистанций (R200, ZR300, D-Серия)? Те ведь ещё и в темноте работают. Больше ли у ZED точность, несмотря на отсутствие ИК проектора?


    1. vovaekb90 Автор
      28.01.2018 13:16

      Не могу ответить. Я работал только с Kinect и ASUS Xtion. У них дальность сильно ограничена и они не работают при солнечном свете. Хотелось попробовать пассивные камеры. Есть статья об использовании камеры ZED. Автор пишет, что камера способна работать на улице.


      1. Tunerok
        30.01.2018 21:11
        +1

        Это же стереопара, почему она не должна работать на улице?


        1. vovaekb90 Автор
          30.01.2018 21:13

          В этом преимущество пассивных стереокамер перед активными типа Microsoft Kinect.


  1. Shpiler
    27.01.2018 23:54

    Всё таки TK1 для ZED староват и слабоват… Пол года гонял дрона с этой камерой и TX1, обнаружил что заявленные стереолабсом 20 метров — лажа. В реальности срабатывание на таком расстоянии было один раз, закончилось тем что дрон едва не улетел в лес. Стабильно удавалось вытянуть из нее до 12 метров. Может быть 20м заявляли для максимального разрешения, не знаю — его не тянул с нужным fps даже ТХ1. Возможно ТХ2 и смог бы.
    В любом случае это гораздо круче всяких кинектов и реалсенсов, при том что в комплекте идет неплохая считалка визуальной одометрии.


    1. CreFroD
      28.01.2018 01:46

      А не могли бы вы пояснить, чем круче реалсенсов? Например, D435?


      1. Shpiler
        28.01.2018 11:26

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


  1. Pavel9860
    28.01.2018 13:17
    +1

    Kinect c Raspberry весьма популярен, в том числе c ROS
    Kinect c Jetson вполне работает, и первый с TK1 и второй с TX1
    Intel realsense c Jetson тоже работает, с TK1, TX1 и TX2
    Realsense работает с Raspberry Pi3, хотя официально не поддерживается. И не думаю, что в такой конфигурации будет быстро работать со SLAM.
    Так, что вариантов довольно много, для 3D навигации или сканирования выбрал бы Nvidia Jetson (от 200$ TK1 до 500$ TX2) в паре с Intel realsense D435- дальность 10 м (доступен предзаказ за179$,).
    Бюджетный вариант и весьма неторопливый это Orange Pi Pc Plus (25$) c Kincect 1(от 30$) — дальность до 5 м.
    C Kinect 2 были сложности, насколько я понимаю из-за нелинейности карт глубины.


    1. vovaekb90 Автор
      28.01.2018 13:23

      Спасибо Pavel9860 за идеи. На самом деле, я не рассматриваю NVIDIA Jetson как платформу для экспериментов. Думаю использовать Raspberry Pi 3 и ноутбук на базе Intel Core i3. Хотелось бы попробовать пассивные стереокамеры типа ZED.


  1. mikkab
    29.01.2018 03:14

    В zed нет ничего что нельзя было бы сделать 2 камерами, вес большой, нет возможности разнести камеры на большее расстояние. как вариант для тестов — ок, но для постоянного применения не очень.
    jetson хорош, но кусается. на малине обрабатывать такой видеопоток проблематично, выносить на внешний комп — будут задержки.


  1. al_sh
    29.01.2018 11:17

    >>>Nvidia Jetson от 200$
    Не подскажете, где взять можно?
    В реале видел только у одной питерской конторы по цене космодрома


    1. Pavel9860
      29.01.2018 20:31

      ebay, amazon, был вариант в Питере


  1. Pavel9860
    29.01.2018 21:21

    Если есть специалисты по ROS (диф. управление, одометрия, GPS, can bus), готовые подключится к проекту, нужна ваша помощь -не бесплатно(в лс)


    1. vovaekb90 Автор
      30.01.2018 01:45

      Pavel9860, добавляйтесь в нашу группу вконтакте: vk.com/robotoperating. Здесь можно найти людей, хорошо знающих и работающих с ROS.