Эта инструкция о том как подключить USB-камеру к Raspberry Pi или BeagleBone Blue и использовать ее с ROS (Robot Operating System) — чтобы читать данные с камеры через ROS image_view и даже транслировать видео поток в веб-браузер!
В конце видео демонстрация на роботе EduMip.
1) В качестве бонуса мы создадим распределенную систему ROS.
2) Приложение Roscore и приложение для просмотра изображений будут работать на ПК (мастер) и узел камеры на Raspberry Pi (ведомый).
3) Чтобы настроить master и slave, нам нужно обновить переменные среды на обоих устройствах.
4) На мастере: найдите IP-адрес устройства. Для ethernet net_dev может быть как enpXXs0 или ethX:
$ ifconfig {net_dev}
ifconfig enp61s0
или просто ifconfig
5) Использовать IP-адрес в качестве значения для переменной ROS_IP:
$ export ROS_IP="10.42.0.1"
6) И для ROS_MASTER_URI:
$ export ROS_MASTER_URI="http://10.42.0.1:11311"
7) Если вы хотите использовать эти значения для будущих сеансов, вы можете сохранить значения в файле .bashrc в своем домашнем каталоге:
$ echo 'export ROS_IP="10.42.0.1"' >> ~/.bashrc
$ echo 'export ROS_MASTER_URI="http://10.42.0.1:11311"' >> ~/.bashrc
8) Подключитесь к Raspberry Pi через ssh:
$ ssh {user}@{raspberry_ip}
9) Для RPi в качестве подчиненного устройства добавьте главный IP-адрес для ROS_MASTER_URI
10) И IP-адрес Raspberry Pi для ROS_IP
$ export ROS_IP="10.42.0.65"
$ export ROS_MASTER_URI="http://10.42.0.1:11311"
или
$ echo 'export ROS_IP="10.42.0.65"' >> ~/.bashrc
$ echo 'export ROS_MASTER_URI="http://10.42.0.1:11311"' >> ~/.bashrc
11) Теперь пришло время подключить USB-камеру.
12) Проверьте, распознана ли камера системой::
$ lsusb
$ ls /dev | grep video*
13) Установите узел ROS usb_cam с необходимыми зависимостями:
$ sudo apt install ros-kinetic-usb-cam
14) У узла usb_cam уже есть тестовый файл запуска:
$ cat /opt/ros/kinetic/share/usb_cam/launch/usb_cam-test.launch
15) Прежде чем запускать этот файл, давайте запустим ядро ROS на master:
$ roscore
16) И теперь запустите узел usb_cam на slave:
$ roslaunch usb_cam usb_cam-test.launch
17) Теперь мы можем видеть созданные темы. Мы можем проверить их либо на master, либо на slave.
18) Перевидите текущий процесс в фоновый режим с помощью CTRL + Z и выполните команду bg, чтобы продолжить выполнение в фоновом режиме. (на варианте Ubuntu не full desktop и без экрана, запустите просто еще один терминал)
19) Чтобы увидеть темы в терминале:
$ rostopic list
20)… или в графическом интерфейсе:
$ rqt_graph
21) Чтение данных камеры с помощью image_view:
$ rosrun image_view image_view image:=/usb_cam/image_raw
22) Или используя rqt_image_view
23) Перенести фоновую задачу на передний план:
$ fg
24) Последний эксперимент на сегодняшний день — потоковая передача в web
25) Установка узла ROS веб-видео-сервер:
$ sudo apt install ros-kinetic-web-video-server
26) Чтобы сделать это правильно, создайте рабочую область для catkin для нашего пользовательского файла запуска:
$ mkdir -p ~/rosvid_ws/src
$ cd ~/rosvid_ws
$ catkin_make
$ source devel/setup.bash
27) Затем создайте пакет ROS:
$ cd src
$ catkin_create_pkg vidsrv std_msgs rospy roscpp
28) Создайте файл запуска с помощью nano, vim итд.:
$ mkdir -p vidsrv/launch
$ nano vidsrv/launch/vidsrv.launch
разместите там код отсюда
На Beaglebone Blue с usb камерой A4Tech у меня сработал такой код:
<launch>
<!-- This node description you can take from usb_cam-test.launch -->
<node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
<param name="video_device" value="/dev/video0" />
<param name="image_width" value="352" />
<param name="image_height" value="288" />
<param name="pixel_format" value="mjpeg" />
<param name="camera_frame_id" value="usb_cam" />
<param name="io_method" value="mmap"/>
</node>
<!-- This node will launch web video server -->
<node name="web_video_server" pkg="web_video_server" type="web_video_server" />
</launch>
29) Соберите пакет:
$ cd ..
$ catkin_make
30) Снова запустите ядро ROS на master:
$ roscore
31) И запустите созданный файл запуска:
$ roslaunch vidsrv vidsrv.launch
32) Порт веб-видео-сервера по умолчанию — 8080
33) Открыть URL в веб-браузере: {RPi_IP}:8080
Ссылки на документацию:
> Video server node
> USB camera node
> rqt image viewer
> Raspberry Pi Camera Module node
USB камеры можно использовать практически любые, у которых есть драйвера для linux, также аналогично можно использовать Raspberry Pi Camera Module ссылка выше.
Пример как это работает на BeagleBone Blue с камерой A4Tech:
Поиск карты тройка на видео с USB камеры BealeBone Blue (алгоритм распознавания работает на ноутбуке с master ROS).
Комментарии (11)
roanlane
22.06.2018 22:29+1Можете подсказать, какие задержки были при стримминге с камеры? И ещё интересует, почему детектируйте точки SURF. Есть к примеру ORB, который и быстрее значительней, и не запатентован
AmigoRRR Автор
22.06.2018 22:33задержка большая, видно на камеру. позже буду все алгоритмы распознавания тестить
katzen
23.06.2018 12:39+1Последний опыт общения с USB-камерами под малинкой принёс массу отрицательного опыта. Непредсказуемые отвалы интерфейса с невозможностью переинициализировать камеру без физического переподключения доконают кого угодно.
robux
23.06.2018 14:40+1Подтверждаю. У меня юсб-камера на малине регулярно «отваливалась» при использовании motion. Ничего, кроме физического перетыкания usb-шнура, не помогало.
Связано это с motion, с фирмой камеры или с реализацией usb на rpi — не знаю.
musuk
Какая нагрузка на процессор Raspberry при этом?
motion на Raspberrian, например, выжирал у меня вообще все ресурсы.
AmigoRRR Автор
Я тестировал на BeagleBone Blue, в видео видно насколько тормозит видео при 100% загрузке процессора. На Raspberry последних поколений тормозить не должно особенно на Raspberry Pi Camera Module. Я еще буду эксперементировать с кодеками и степенью сжатия.
1nd1g0
Если сама камера аппаратно поддерживает открываемые современными браузерами кодеки и нет требования к универсальности решения, то иногда можно прямо из видеопотока от камеры вырезать уже закодированные пакеты и слать клиенту. Таким образом работают некоторые системы видеонаблюдения, где процессор настолько слаб, что сам ничего адекватно пережать не успевает. Плюсы в максимальном качестве видео и минимальной нагрузке, минусы — первичная сложность реализации из-за слабой документированности чипов камер и жёсткая привязка к протоколу камеры, который может меняться со временем без предупреждения даже у одной модели.
AmigoRRR Автор
можешь дать список таких камер?
1nd1g0
На практике игрался только со своей Logitech C930e, но вот ещё небольшой список
.
nochkin
Процессор грузит больше не сама камера, а видео кодеки. В этом случае можно взять камеру с железными кодеками внутри и использовать готовый поток.
Leonid0
при 1 fps CPU load ~ 80%