Update FPV page (#40)

pull/41/head
Dmitry Ilyin 2022-07-21 18:09:22 +03:00 committed by GitHub
parent 15a3601e1f
commit aeae99863a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 148 additions and 14 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

BIN
images/fpv-logo.jpg 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

162
ru/fpv.md
View File

@ -1,40 +1,78 @@
## Использование OpenIPC как бюджетного видеолинка для FPV систем
# OpenIPC Wiki
[Оглавление](../index.md)
Классический сетап в проекте [OpenHD](https://openhdfpv.org/) (и других похожих проектов) состоит из MIPI- или USB- камеры, подключенной к Raspberry Pi и Jetson Nano, которые выступают видеоэнкодером и роутером воздушной системы и в свою очередь соединены с WiFi адаптером по USB и с полетным контроллером по UART. Наземная станция обычно состоит и такого же WiFi адаптера, роутера и высококонтрастного монитора.
Использование OpenIPC как бюджетного видеолинка для FPV систем
--------------------------------
Иногда MIPI- или USB- камера меняется на IP-камеру, которая и мощнее (имеет свой собственный аппаратный энкодер) и стоит дешевле при аналогичных характеристиках. Большинство современных видеокамер являются типовыми embedded устройствами с Linux на борту (но значительно скромнее в размерах RAM и флеш памяти по сравнению с Raspberry и Jetson), что позволяет компилировать и запускать на них практически любое переносимое ПО.
<p align="center">
<img src="https://github.com/widgetii/wiki/blob/master/images/fpv-logo.jpg?raw=true" alt="Logo"/>
</p>
В процессе работы с данной технологией возникла идея об упрощении полетной системы и переноса всего необходимого ПО непосредственно на IP-камеру.
Классический сетап в проекте [OpenHD](https://openhdfpv.org/) (и других похожих проектов) состоит из MIPI- или USB- камеры, подключенной к Raspberry Pi и Jetson Nano, которые выступают видеоэнкодером и роутером воздушной системы и в свою очередь соединены с WiFi адаптером по USB и с полетным контроллером по UART. Наземная станция обычно состоит из такого же WiFi адаптера, роутера и высококонтрастного монитора или очков.
Иногда MIPI- или USB- камера меняется на IP-камеру, которая и мощнее (имеет свой собственный аппаратный энкодер) и стоит дешевле при аналогичных характеристиках. Большинство современных видеокамер являются типовыми embedded устройствами с Linux на борту (но значительно скромнее в размерах RAM и флеш памяти по сравнению с Raspberry и Jetson), что позволяет перекомпилировать и запускать на них практически любое переносимое ПО.
В процессе работы с данной технологией возникла идея об упрощении полетной системы и переноса всего необходимого ПО непосредственно на IP-камеру. Технически FPV прошивка проекта OpenIPC представляет собой специальную сборку с двумя типами драйверов популярных WiFi адаптеров, стримера Majestic (который выполняет роль GStreamer в классической схеме на системе-передатчике) и [WFB-ng](https://github.com/svpcom/wifibroadcast). К сожалению, из-за значительного размера бинарного кода WiFi драйверов и зависимости в виде libstd++ (часть WFB-ng написана на C++), минимальные требования к системе увеличились до 16 мегабайт флеш памяти.
### Преимущества
* Снижается стоимость системы (IP камера с поддержкой H.265 против аналога на Jetson Nano с MIPI камерой)
* Снижается общее потребление и увеличивается надежность системы за счет упрощения схемы
* Снижается задержка передачи видео: на наших Glass-to-Glass тестах мы получали для 1080p@60 задержку около 80ms (на среднебюджетных камерах), и для 720p@30 около 130 ms и 1080p@30 около 150 ms (для самых бюджетных камер)
* Появляется возможность тюнинга аппаратного энкодера (специфика сильно зависит от вендора IP камеры)
* Появляется возможность тюнинга аппаратного энкодера, например более частого формирования I кадра (специфика сильно зависит от вендора IP камеры)
* Сообществом накоплен огромный опыт [ремонта IP камер](https://t.me/ExIPCam), что позволяет еще более удешевить стоимость эксплуатации системы
### Недостатки
* Из-за ограниченных ресурсов (установленной оперативной и постоянной памяти) большинство модных языков программирования (таких как Java, Python, NodeJS) камера не потянет. Если любите писать на этих языках (или хотите портировать ПО, написанное на этих языках на камеру), то придется искать решения.
Замена флеш памяти на более емкую принесет радость в дом Golang и Rust разработчиков.
* Придется немного паять, чтобы доработать до ума сверхбюджетные платы, но уверен, что в мире FPV этого никого не испугать
* Придется немного паять, чтобы доработать до ума сверхбюджетные платы, но уверен, что в мире FPV никого этим не испугать
* В большинстве систем версия ядра Linux ограничена вендором IP камеры из-за того, что часть модулей поставляются в бинарном виде. Доработка драйверов ядра новых WiFi адаптеров или специфической периферии может потребовать значительного времени.
* На бюджетных камерах (для которых в первую очередь разрабатывалась FPV прошивка) очень ограниченные ресурсы, поэтому на момент написания этого текста возможностей запуска нейронных сетей нет. Ситуация должна измениться в ближайшем будущем.
### Ингредиенты
* IP-камера. Учитывая популярность среди FPV сообщества модели [VEYE 307](http://www.veye.cc/en/product/cs-mipi-imx307/), мы рекомендуем приобрести плату IVG-G2S IP камеры производства компании XiongMai с точно таким же сенсором IMX307, но [по более приятной цене](https://aliexpress.com/item/1005003386137528.html) (или еще [более приятной](https://item.taobao.com/item.htm?id=660122799616), если есть возможность покупки на Taobao, например, [через посредника](https://www.youcanbuy.ru/)). При заказе платы укажите, фокусное расстояние объектива, который установит продавец под ваш заказ (больше фокусное расстояние - больше увеличение, но меньше угол обзора).
В дальнейшем объектив можно поменять на другой с такой же резьбой, либо сразу купить несколько моделей на выбор (стандартом в мире видеонаблюдения считается 3.6мм).
Плата IP-камеры питается от 12V (фактически достаточно 5V, если не использовать ее как видеокамеру вместе с подсветкой) и для начальных тестов желательно взять сразу совмещенный кабель питание-Ethernet, который бывает двух типов: 12V с подключением питания через джек и активный PoE 48V (выбирайте в зависимости от возможностей вашего сетевого коммутатора).
Плата IP-камеры питается от 12V (фактически достаточно 5V, если не использовать ее как видеокамеру вместе с подсветкой) и для начальных тестов желательно взять сразу совмещенный кабель питание-Ethernet, который бывает двух типов: 12V с подключением [блока питания через джек](https://aliexpress.com/item/32961238897.html) и активный PoE 48V (выбирайте в зависимости от возможностей вашего сетевого коммутатора).
* WiFi адаптер. Крайне рекомендуется с обоих сторон линка использовать одинаковые адаптеры (более того, брать их из одной партии парами).
* WiFi адаптер. В настоящий момент FPV прошивка поддерживает два типа драйверов для чипов RT8812au и AR2791 (но в принципе никто не мешает добавить другие адаптеры). Крайне рекомендуется с обоих сторон линка использовать одинаковые адаптеры (более того, брать их из одной партии парами) и использовать только 5GHz частоты с связи с полной перегрузкой 2.4GHz. Прошивка протестирована с двумя адаптерами на [RT8812au](https://aliexpress.ru/item/32664378094.html) и [AR2791](https://aliexpress.co/item/32884675724.html) (поддерживается только 2.4GHz).
* Программатор SPI NOR для флеш памяти. В принципе можно обойтись без него средствами проекта [burn](https://github.com/OpenIPC/burn), который позволяет заливать систему в пустой/убитый флеш.
* Микросхема SPI NOR флеш памяти от 16 мегабайт и выше на замену стандартной 8 мегабайтовой. Рекомендуем [W25Q128FVIQ](https://www.aliexpress.com/item/1005003093500630.html) или [любую другую](https://www.winbond.com/hq/product/code-storage-flash-memory/serial-nor-flash/?__locale=en&selected=128Mb#Density) совместимую с прошивкой (новые модули также могут быть добавлены в проект по ID микросхемы). Обратите внимание, что на рынке представлено очень много подделок под Winbond и необходимо тщательно выбирать продавца.
* [Программатор SPI NOR для флеш памяти](https://aliexpress.com/item/32902635911.html). В принципе можно обойтись без него средствами проекта [burn](https://github.com/OpenIPC/burn), который позволяет заливать систему в пустой/убитый флеш (см. раздел [Заливка образа на пустую флеш с помощью burn](#%D0%B7%D0%B0%D0%BB%D0%B8%D0%B2%D0%BA%D0%B0-%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%B0-%D0%BD%D0%B0-%D0%BF%D1%83%D1%81%D1%82%D1%83%D1%8E-%D1%84%D0%BB%D0%B5%D1%88-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-burn-%D0%B5%D1%81%D0%BB%D0%B8-%D0%BD%D0%B5%D1%82-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%D1%82%D0%BE%D1%80%D0%B0)). Обратите внимание, что хотя у многих программаторов есть в комплекте "прищепка", снимать дамп/программировать флеш память напрямую на плате категорически нельзя, из-за того, что программатор кроме микросхемы будет питать также всю остальную плату (есть вариант подрезать VCC ногу).
* [UART-USB адаптер](https://aliexpress.com/item/1005001625391776.html) на 3.3V. Обратите внимание, что использование 5V адаптера может сжечь вашу камеру. Не покупайте/не используйте адаптеры на базе [PL2303](https://aliexpress.com/item/704553060.html), хотя и стоят они дешевле, они не будут работать с данным SoC. Указанный в предыдущем пункте программатор умеет работать UART адаптером, поэтому если он есть, то отдельный можно не покупать.
* [Коннекторы с разъемами типа JST 1.25](https://aliexpress.com/item/32863841787.html) в конфигурации `3 Pin` и `8 Pin` для подключения к UART порту камеры и замены штатного кабеля питания-Ethernet в полетном варианте.
Опционально:
* [Радиаторы на SoC](https://aliexpress.com/item/32859349038.html) приветствуются (как обычно не установлены производителем из-за удешевления).
* [Светосильный объектив F0.95](https://aliexpress.com/item/32876034491.html) (другие варианты [раз](https://aliexpress.com/item/32957334039.html) и [два](https://aliexpress.com/item/4000142214594.html)) для полного раскрытия возможностей сенсора Sony IMX307 и приятных полетов ночью.
* [Зум объектив 2.8-12мм](https://aliexpress.com/item/32809397197.html). Обратите внимание, что в комплекте идет устаревшая плата IP камеры на базе HiSilicon 3516EV100, которую также можно перепрошить на OpenIPC. Так как плата, управляющая моторами, общается с основной платой через UART, то придется творчески решить вопрос с мультиплексированием двух UART портов или выводом нераспаянных контактов.
* [FPC разъем на 16 pin](https://aliexpress.com/item/33013766973.html) для более качественной пайки подключения к USB адаптеру и соответствующий [кабель](https://aliexpress.com/item/32958943450.html).
### Установка на камеру
* Подключите кабель к камере и проверьте, что она работает (IP адрес по-умолчанию 192.168.1.10, ссылка для VLC `"rtsp://192.168.1.10/user=admin&password=&channel=0&stream=0"`). Припаяйте трехпроводной разъем UART к свободным площадкам на плате камеры, подключите UART-USB адаптер к компьютеру и проверьте, что при включении камеры идет вывод данных и вы можете прервать загрузку через `Ctrl-C` (работают обе RX и TX линии).
* Выключите камеру, отпаяйте оригинальную 8 мегабайтную SPI NOR флеш микросхему и сделайте на всякий случай ее дамп с помощью программатора.
* Подключите кабель к камере и проверьте, что она работает (IP адрес по-умолчанию 192.168.1.10, ссылка для VLC `"rtsp://192.168.1.10/user=admin&password=&channel=0&stream=0"`).
* Припаяйте трехпроводной разъем UART к свободным площадкам на плате камеры
<p align="center">
<img src="https://github.com/widgetii/wiki/blob/master/images/fpv-imx307-uart.jpg?raw=true" alt="Logo"/>
</p>
* Подключите UART-USB адаптер к компьютеру (скорость порта 115200N1, управление потоком отключено) и проверьте, что при включении камеры идет вывод данных и вы можете прервать загрузку через `Ctrl-C` (работают обе RX и TX линии).
* Выключите камеру, отпаяйте оригинальную 8 мегабайтную SPI NOR флеш микросхему и сделайте на всякий случай ее дамп с помощью программатора. Отпаивать микросхему желательно [феном](https://aliexpress.com/item/32980690787.html), но если очень хочется можно воспользоваться обычным [паяльником](https://www.youtube.com/watch?v=dspjVDv7hck). После выпайки микросхемы площадки нужно хорошо очистить от остатков припоя куском медного кабеля.
При работе феном желательно снять объектив и изолировать остальные компоненты, особенно пластиковые разъемы [каптоновой лентой](https://aliexpress.com/item/1005003563721341.html) (на крайний случай фольгой от шоколадки). Ни в коем случае [не используйте сплав Розе](https://habr.com/ru/post/437778/). Если не очень дружите с пальником, то проще зайти в ближайший сервис по ремонту мобильных телефонов и показать мастеру часть этой инструкции.
<p align="center">
<img src="https://github.com/widgetii/wiki/blob/master/images/fpv-imx307-spinor.jpg?raw=true" alt="Logo"/>
</p>
* Залейте [U-Boot](https://github.com/OpenIPC/firmware/releases/download/latest/u-boot-gk7205v200-universal.bin) в новую 16 мегабайтную флеш (в начало памяти) и припаяйте его на плату. Проверьте, что U-Boot запускается и вы попадаете в строку приглашения.
* На рабочей станции установите TFTP сервер, скачайте и распакуйте в каталог [архив](https://github.com/OpenIPC/firmware/releases/download/latest/openipc.gk7205v200-fpv-br.tgz) с FPV прошивкой
* Дайте команды в U-Boot (где `192.168.1.17` - это ваш TFTP сервер, а `192.168.1.33` временно присвоенный адрес камере):
@ -46,13 +84,26 @@
run uknor16m; run urnor16m
```
* После загрузки системы, проверьте, что она получила IP адрес через Ethernet (на нее можно зайти по SSH через root@IP без пароля) и камера все еще отдает видео по RTSP протоколу
* Припаяйте к USB площадкам GND, DP и DM (USB 5V питание подключать к плате не нужно из-за высокого потребления энергии адаптером), а также отдельно 5V и GND для питания WiFi адаптера (возможно через дополнительный DC-DC преобразователь в зависимости от вашей схемы).
* Припаяйте к USB площадкам GND, DP и DM (USB 5V питание подключать к плате не нужно из-за высокого потребления энергии адаптером), а также отдельно 5V и GND для питания WiFi адаптера (возможно через дополнительный DC-DC преобразователь в зависимости от вашей схемы). USB провод, который подходит к плате, необходимо зафиксировать стяжкой во избежание отрыва пятаков на контактной площадке:
<p align="center">
<img src="https://github.com/widgetii/wiki/blob/master/images/fpv-pinout.jpg?raw=true" width=50%/>
<img src="https://github.com/widgetii/wiki/blob/master/images/fpv-usb-colors.jpg?raw=true" width=50%/>
</p>
* Проверьте, что после загрузки через команду `lsusb` появилось новое устройство
* В конфигурационном файле `/etc/wfb.conf` выберите установленный адаптер `rtl` (по умолчанию) или `ath`
* Добавьте в конфигурацинный файл `/etc/majestic.yaml` строки:
```
outgoing:
- udp://127.0.0.1:5600
```
* Перезапустите камеру
### Проверка работы наземной станции (на десктопе)
* Подключите второй адаптер к десктопу и скомпилируйте драйвер, который работает в режиме мониторинга (см. соответствующую документацию проекта) и при необходимости загрузите его через `insmod`
* Активируйте интерфейс (в данном примере `wlan0` и укажите канал (в данном примере `169`):
* Активируйте интерфейс (в данном примере `wlan0` и укажите [канал](https://en.wikipedia.org/wiki/List_of_WLAN_channels) (в данном примере `169`):
```
sudo ip link set wlan0 down
sudo iw wlan0 set monitor control
@ -80,4 +131,87 @@ sudo ip link set wlan0 up
32180236 ANT 1 250:-54:-52:-50
32180236 ANT 0 250:-48:-45:-44
```
* Запустите Gstreamer `gst-launch-1.0 -vvv udpsrc port=5600 ! application/x-rtp,encoding-name=H265,payload=96 ! rtph264depay ! h265parse ! queue ! avdec_h265 ! autovideosink sync=false -e` и проверьте качество изображения
* Запустите Gstreamer `gst-launch-1.0 -vvv udpsrc port=5600 ! application/x-rtp,encoding-name=H265,payload=96 ! rtph265depay ! h265parse ! queue ! avdec_h265 ! autovideosink sync=false -e` и проверьте качество изображения
### Траблшутинг
* Через команду `sudo tcpdump -i wlan0` на десктопе без запуска WFG-ng вы можете проверить, что передатчик действительно отправляет пакеты в эфир:
![Tcpdump](../images/fpv-tcpdump.jpg)
### Заливка образа на пустую флеш с помощью burn (если нет программатора)
Запускаем [burn](https://github.com/OpenIPC/burn) при выключенной плате:
```
./hi35xx-tool --chip gk7205v200 --type=ddr --file=u-boot-gk7205v200-universal.bin -d ; screen -L /dev/ttyUSB0 115200
```
включаем питание платы и ждем заливки U-Boot и появления командной строки. Далее выполяем следующие команды, где `192.168.0.8` - адрес TFTP сервера и `192.168.0.200` - временный адрес IP камеры.
```
setenv ipaddr 192.168.0.200
setenv serverip 192.168.0.8
sf probe 0; sf lock 0
mw.b 0x42000000 ff 1000000; tftpboot 0x42000000 u-boot-gk7205v200-universal.bin; sf probe 0
sf erase 0x0 0x50000; sf write 0x42000000 0x0 ${filesize}
reset
run setnor16m
setenv ipaddr 192.168.0.200
setenv serverip 192.168.0.8
run uknor16m ; run urnor16m
saveenv
reset
```
### Дальнейшие доработки
#### Разработка платы-адаптера
Учитывая, что по тексту выше мы дорабатывали плату от обычной бюджетной камеры видеонаблюдения и монтаж USB коннектора производился без заводских разъемов, напрашивается вариант сделать дополнительную специальную плату (похожую на [плату со встроенным WiFi адаптером](https://aliexpress.com/item/1005002369013873.html)), на которой будут выведены разъемы для USB (возможно с дополнительным хабом) и SD карты. Это позволит передавать видео в эфир с минимальной задержкой в 720p, одновременно записывая оригинал в 1080p для последующей публикации на YouTube). Если у вас есть возможность разработать такую плату и поделиться схемой с сообществом, мы будем очень признательны.
### FAQ
#### Сколько потребляет камера во время своей работы?
Потребление зависит от того, включен ли сенсор (который сам по себе является одним из больших потребителей) и по нашим замерам составляет 1.7W в активном режиме и y 1.1W при выключенном сенсоре (но работающей основной системе). Отсюда можно сделать вывод, что при необходимости можно программно выключать/включать стример, чтобы еще больше уменьшить потребление системы, в те моменты когда это необходимо.
#### Поддерживается ли WDR?
Для полноценной работы WDR на IP камерах как основной чип так и сенсор оба должны поддерживать одинаковый стандарт WDR (их существует несколько типов). При этом обычно сенсор начинает работать на двойной частоте (например, 60FPS вместо 30FPS), делая один кадр с длинной выдержкой, второй - с короткой. Далее ISP (Image Signal Processor) аппаратно производит склейку из двух кадров одного, взяв темные участки с кадра с длинной выдержкой и светлые - с короткой, формируя изображение с расширенным цветовым диапазоном.
К сожалению, для получения WDR изображения вся система должна работать как минимум в два раза быстрее (или говоря по-другому иметь больше транзисторов, делая в два раза больше работы в момент времени), поэтому в процессоре Goke V200 этого режима нет. Если вам принципиальна поддержка WDR, рассмотрите возможность использования следующей в линейке процессоров V300, который также поддерживается проектом.
#### Можно ли вместо WiFi использовать LTE адаптер?
Можно, но потребуется модификация прошивки. Рекомендуем вопрос по адаптации конкректного оборудования задавать [в официальной группе](https://t.me/openipc_modding).
#### Можно ли подключить SD карту для записи видео?
Можно. Фотография от подписчика:
<p align="center">
<img src="https://github.com/widgetii/wiki/blob/master/images/fpv-sd-card.jpg?raw=true" width=50%/>
<img src="https://github.com/widgetii/wiki/blob/master/images/fpv-usb-sd.jpg?raw=true" width=50%/>
</p>
#### Какую дополнительную периферию еще можно подключить?
Исходя из распиновки нераспаянного FC разъема, показанного выше, видно, что он используется для дополнительных плат расширения с WiFi (по USD) и SD картой.
D/N (day/night) можно использовать только как входящий GPIO15 (из-за установленного транзистора). Слева от него на том же разъеме находится GND и GPIO16.
Учитывая, что корпус SoC выполнен в формате QFN88, имеется возможность припаяться тонким проводом практически к любой ножке микросхемы и задействовать дополнительные порты.
#### Можно ли использовать другую IP камеру?
Если у вас есть скиллы продвинутого пользователя Linux, то вы можете присоединиться к нашему проекту и адаптировать FPV прошивку под любой процессор, [поддерживаемый OpenIPC](https://openipc.org/supported-hardware). В большинстве случаев навыки программирования не требуются (либо вы получите их естественным путем в процессе знакомства и изучения системы).
#### Как еще больше можно уменьшить задержку передачи видео?
Чтобы получить минимально возможную задержку, в нашей прошивке используется режим низкой задержки (low latency), который имеется в процессорах HiSilicon/Goke. При этом конкретные значения зависят от модели SoC, сенсора, его разрешения, текущая выдержка кадра и даже нагрев чипа в процессе работы. Основную лепту в задержку вносит FPS системы (60FPS без всякого тюнинга будет лучше 30FPS с максимально выкрученными настройками), поэтому если вам важна низкая задержка обратите внимание на более дорогое железо. Для получения еще меньшей задержки возможно отключения промежуточных блоков за счет ухудшения качества картинки либо перехода на более современные чипсеты.
У нашей команды есть большой опыт передачи медиаинформации с низкой задержкой (на ряде проектов были достигнуты цифры задержки в 45ms). Если вас интересуют коммерческие услуги (консалтинг, разработка аппаратного и программного обеспечения, реверс-инжиниринг) [свяжитесь с нами](mailto:d.ilyin@openipc.org).