Raspberry Pi. Передача видео для дистанционного управления

в 19:34, , рубрики: diy или сделай сам, linux, Raspberry Pi, робототехника, метки:

Передача видео для дистанционного управления может использоваться во многих проектах связанных с управление различными устройствами. То есть это можно прикрутить к колесной базе, к квадрокоптеру, к телу гуманоидного робота и тд. Raspberry Pi(далее малина) в данном смысле удобна тем что позволяет использовать для этого не какие то специализированные устройства типа FPV, а обычные устройства которые у многих уже имеются в наличии, а так же упрощает и схемы их включения и сложность написания программ для них, не говоря уже о стоимости проектов.

Raspberry Pi. Передача видео для дистанционного управления

Удаленный контроль

Недавно заполучил малину, в Питере их уже в магазинах продают так что ни ждать, ни заказывать не надо, хотя чуть дороже получается. Поскольку монитора с HDMI у меня нет, а роутер есть, то как вариант управления был выбран remote controle через ssh порт. Это позволяет с любого компа включенного в локальную сеть (как вариант, но более сложный и глобальную) управлять малиной.

Примечание. На компьютере с которого я управляют малиной стоит Ubuntu. Хотя для Windows’а все это также остается в силе.

Наладить подключение достаточно просто. В Debian образе, скачиваемом с офсайта, эта функция по умолчанию включена. И единственное что остается узнать ip адрес и ввести команду подключения. Для того что бы узнать адрес можно либо зайти в настройки роутера(обычно ip 192.168.0.1), или в консоли вести команду
$ nmap -p 22 --open -sV 192.168.0.1/24
которая выдаст кучу текста среди которой будут указанны адреса подключенных в сеть устройств и состояния их SSH порта.
Далее для открытия удаленного доступа
$ ssh -p 22 pi@192.168.0.17
где pi — это имя учетной записи, а после @ адрес малины.

Потом попросят ввести пароль и если он правильный то консоль начнет общаться с вами от лица малины.
Raspberry Pi. Передача видео для дистанционного управления

Более подробно о настройке удаленного доступа можно почитать на
http://www.penguintutor.com/linux/raspberrypi-headless
http://www.penguintutor.com/linux/tightvnc

На второй ссылке описывается как получить удаленный доступ к графическому интерфейсу. Это выглядит интересно — на экране своего монитора видишь рабочий стол малины. Но из-за того что сигнал идет по сетке то появляется задержка и мышка и прочее управление идет с запаздыванием. Так что в предустановленную там «змейку» не поиграть.

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

Подключение Веб камеры и передача картинки

Используемая камера Logitech c270 встала без проблем. Однако дальше ждало разочарование так как заявленное на малине аппаратное ускорения кодирования видео отсутствовало. То есть оно есть, но кодеки для него отсутствует. А без него, программно, сжатие идет со скорость 2-5 fps и дает 100% загрузку машины. В итоге без подвешивания системы идет только необработанный(raw) поток. То есть для записи (по прикидкам) при разрешение 640х480 на одну минуту уйдут 100-200 мб. Но пропускной способности локальной сети и wi-fi хватает так что пока что можно и так его гнать, надеясь что в ближайшее время кодеки все таки появятся. Так что идем дальше.

Долгих экспериментов и поиска нужных заклинаний описывать не буду. В итоге все свелось к использованию gstreamer’а. В вкратце, это мультимедийный фреймворк с интерфейсом в виде командной строки. Так же есть библиотека которая дает возможность программно использовать его компоненты, что можно использовать в дальнейшем для интеграции в собственные программы.

Для его установки на малине надо ввести
$sudo apt-get install gstreamer0.10-plugins-base gstreamer0.10-plugins-good gstreamer0.10-plugins-ugly gstreamer0.10-tools

(если их не будет, возможно номер версии сменился или другое, то удобно воспользоваться командой «$apt-cache search gstreamer» и установить что-то с похожими именами)

Далее на малине вводится

$sudo gst-launch-0.10 v4l2src device=/dev/video0 ! 'video/x-raw-yuv,width=640,height=480, framerate=20/1'! ffmpegcolorspace ! rtpvrawpay ! udpsink host=192.168.0.50 port=4000 sync=false

где
device=/dev/video0 — источник картинки
'video/x-raw-yuv,width=640,height=480, framerate=20/1' — формат
udpsink host=192.168.0.50 port=4000 sync=false — адрес куда посылаем

Видео передается по протоколу rtp. Этот протокол работает на транспортном уровне и используется при передачи трафика реального времени. Он может использовать как TCP, так и UDP, но так как TCP повторяет не дошедшие сообщения, которые уже не нужны то в данном случае используется UDP.
На стороне приемника надо ввести
$ gst-launch udpsrc caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string)YCbCr-4:2:0, depth=(string)8, width=(string)640, height=(string)480, ssrc=(uint)1825678493, payload=(int)96, clock-base=(uint)4068866987, seqnum-base=(uint)24582" port=4000 ! queue ! rtpvrawdepay ! queue ! ffmpegcolorspace ! Autovideosink

В итоге на стороне приемника появится картинка.
Raspberry Pi. Передача видео для дистанционного управления
Для любителей рекурсии: эта скриншот рабочего стола нетбука, который принимает картинку от малины, которая берет её от веб камеры, которая направлена на малину лежащею на нетбуке на экране которого …

Картинка, полученная таким образом, по качеству идентична полученной на прямую без сети от веб камеры, так как ни каких сжатий или трансформаций не применялось.
На следующем скриншоте показана загрузка канала, слева при передачи картинки 640х480, затем пауза и 320х240.
Raspberry Pi. Передача видео для дистанционного управления
Однако, поскольку картинка идет не на прямую, а через сеть то появляется задержка сигнала. Далее была проведена серия нехитрых экспериментов, по которым можно оценить задержку сигнала.
Raspberry Pi. Передача видео для дистанционного управления
Raspberry Pi. Передача видео для дистанционного управления

Для конфигурации малина->LAN кабель->роутер Dlink-300->wi-fi->нетбук задержки составили
для разрешения 640х480 0.5 секунд
для разрешения 320х240 0.2 секунды

Много это или мало зависит от целей использования. Для прямого управления квадракоптера (без дополнительной стабилизации) или других систем испытывающих какие то возмущения выводящие их из равновесия — это много. Но тем не менее многие вещами при такой задержки управлять можно, как пример — луноходы, которые управлялись вообще с 2х минутной задержкой.

Подключение wi-fi адаптера

Адаптер TP-Link WN722N. В целом установка адаптера не представляет ни чего сложного процесс хорошо описан здесь
http://elinux.org/RPi_Peripherals
за маленьким исключением исключение, что бы найти которое ушло некоторое время. Пароль надо вводить в уже зашифрованном виде. Спасибо Ubuntu
http://help.ubuntu.ru/wiki/настройка_сети_вручную
Для этого надо ввести
$ wpa_passphrase <имя_точки_доступа> <ascii_ключ>

В итоге после всех выяснений файл /etc/network/interfaces у меня сейчас выглядит так. Эти настройки верны wpa-psk, если использовать wpa2 то настройки будут другие, описание которых можно найти в ссылке на Ubuntu.
auto lo

iface lo inet loopback
iface eth0 inet dhcp

# The wireless interface
iface wlan0 inet static

address 192.168.0.40
gateway 192.168.0.1
netmask 255.255.255.0
wpa-ap-scan 1
wpa-proto WPA
wpa-pairwise TKIP
wpa-group TKIP
wpa-key-mgmt WPA-PSK
wpa-ssid name
wpa-psk 7d7cf754caЦензураf04b1b0ef6f15e21ed1292168950d20
wpa-driver wext

auto wlan0

После настройки беспроводного соединения на стороне компьютера надо сменить ip адрес и общение будет происходить так же как и при проводном соединение.

Далее были проведены тесты на время задержки для конфигурации:
малина->адаптер->wi-fi->роутер Dlink-300->wi-fi->нетбук
(а так же для малина->адаптер->wi-fi->роутер Dlink-300-> LAN кабель ->нетбук )
для разрешения 640х480 0.8 секунд
для разрешения 320х240 0.2-0.3 секунды

По тому что время задержке увеличилось можно сделать предположение что либо адаптер, либо юсб соединение, либо драйвер вносят задержки, которых нет при соединение через LAN. Так что там где габариты позволяют лучше вместо адаптера соединять малину через LAN c роутером.

LiPo

Как довесок, что бы отвязать систему от сети питания собрал преобразователь для подключения к LiPo аккумулятору. Дело в том что малина запитывается от 5В плюс-минус 25%, так что напрямую подключать аккумуляторы с другим напряжением нельзя, однако при помощи небольшого девайса это можно исправить.
Схема у него очень простая и нашел я её здесь
http://spydamonky.hackhut.com/2012/07/05/lipo-raspberry-pi-power-adapter/
Детали схемы я нашел в ближайшем специализированном магазине, а microUSB штекер в компьютерном магазине – купил самый дешевый кабель и вырезал из него.
Raspberry Pi. Передача видео для дистанционного управления
В первом варианте как и на схеме был один регулятор напряжения, но он сильно грелся, так как максимальный ток там 1А, а через него шло минимум 700мА, то я решил ему в параллель поставить второй, что должно в вдвое увеличить максимальный ток. Однако все равно греется сильно. Видимо надо будет какой то радиатор еще прикрутить.
Вообще, LIPo аккумуляторы для таких целей лучше не использовать так как в случае разряда ниже допустимого уровня они необратимо выходит из строя, а этот момент здесь ни как не ловится. То есть устройство работает, работает, а когда перестает аккумулятор уже умер. Если под рукой есть другой тип аккумуляторов то лучше их использовать.

П.С.
Далее как цель поставить это все на какую то платформу и использовать уже дальше.

Автор: ajhhh

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js