# Потокова передача відео через канал зв'язку WiFi в режимі Raw (WFB-ng)

Цей посібник показує, як налаштувати [супутній комп'ютер](../companion_computer/README.md) з камерою Logitech C920 або RaspberryPi так, щоб відеопотік передавався з БЛА на земний комп'ютер і відображався в _QGroundControl_.
Для налаштування використовується WiFi у режимі непідключеного (транслювання) та програмне забезпечення проекту [WFB-ng](https://github.com/svpcom/wfb-ng).

Канал також може бути використаний як двосторонній [телеметричний](../telemetry/README.md) зв'язок та тунель TCP/IP для керування дроном під час польоту.
Якщо ви керуєте дроном вручну за допомогою джойстика з QGroundControl (яке використовує MAVLink), то ви можете використовувати WFB-ng як єдине з'єднання для всіх комунікацій з дроном (відео, телеметрія MAVLink, дистанційне керування за допомогою джойстика).

:::warning
Перш ніж використовувати _WFB-ng_, перевірте, чи дозволяють регулятори такий тип використання WiFi в вашій країні.
:::

## Загальний огляд WFB-ng

Проект _WFB-ng_ надає транспорт даних, який використовує низькорівневі пакети WiFi для уникнення обмежень відстані та затримки звичайного стеку IEEE 802.11.

Основні переваги _WFB-ng_ включають:

- Низька затримка відеозв'язку.
- Двосторонній телеметричний зв'язок (MAVLink).
- TCP/IP тунель.
- Автоматичне різноманіття передавача - використовуйте кілька карт на землі, щоб уникнути відслідковувача антен.
- Full link encryption and authentication (using [libsodium](https://doc.libsodium.org/)).
- Агрегація пакетів MAVLink (упаковка невеликих пакетів у партії перед передачею).
- Покращений [OSD](https://github.com/svpcom/wfb-ng-osd) для Raspberry PI або загального лінуксового робочого стола з gstreamer.

Додаткова інформація наведена в [FAQ](#faq) нижче.

## Апаратне забезпечення(Hardware)

### Налаштування транспорту

Налаштування транспортного засобу складається з такого:

- Raspberry PI 3B/3B+/ZeroW

- Камера.
  Були протестовані наступні варіанти:
  - [Камера Raspberry Pi](https://www.raspberrypi.org/products/camera-module-v2/), підключена через CSI.
  - [Logitech camera C920](https://support.logi.com/hc/en-us/articles/360024326953-Getting-started-HD-Pro-Webcam-C920) connected via USB

- WiFi module [ALPHA AWUS036ACH](https://www.alfa.com.tw/products/awus036ach_1?variant=40319795789896) or any other **RTL8812au** card.

### Наземна станція

- Наземний комп'ютер на станції.
  Ці варіанти були перевірені:
  - Будь-який Linux комп'ютер з USB-портом (протестований на Ubuntu 18.04 x86-64)
  - Комп’ютер із будь-якою ОС із керуванням QGround та Raspberry PI, під’єднаний через Ethernet (RasPi забезпечує з’єднання Wi-Fi).

- WiFi module [ALPHA AWUS036ACH](https://www.alfa.com.tw/products/awus036ach_1?variant=40319795789896) or any other **RTL8812au** card.
  Див. вікі [WFB-ng > апаратне забезпечення WiFi](https://github.com/svpcom/wfb-ng/wiki/WiFi-hardware) для отримання додаткової інформації про підтримувані модулі.

## Модифікація апаратного забезпечення

Alpha AWUS036ACH - це карта середньої потужності, яка використовує багато струму під час передачі.
Якщо ви живите її від звичайного USB2, то на більшості **ARM-плат** вона скине порт.
Якщо ви підключите її до порту **USB3** за допомогою **нативного кабелю USB3** до ноутбука на **Linux**, ви можете використовувати її без модифікацій.

Для **Raspberry PI** (UAV або земля) її необхідно підключити безпосередньо до 5V BEC (або адаптера високої потужності для земельного pi) одним із двох способів:

- Зробіть власний USB-кабель ([відірвіть провід `+5V` від USB-штепселя і підключіть його до BEC])(https://electronics.stackexchange.com/questions/218500/usb-charge-and-data-separate-cables)
- Відірвіть провід `+5V` на платі поруч із USB-портом і підключіть його до BEC (не робіть цього, якщо сумніваєтеся - використовуйте власний кабель).

Вам також потрібно додати **конденсатор низького опору** з ємністю 470 мкФ (як у ESC) між **+5В карти та землею**, щоб фільтрувати перепади напруги.
Ви повинні інтегрувати конденсатор з власним USB-кабелем.
Без конденсатора ви можете отримати втрату пакетів або їх порушення. Будьте обережні з петлею маси при використанні декількох земляних проводів.
Будьте обережні з [петлею маси](https://en.wikipedia.org/wiki/Ground_loop_%28electricity%29) при використанні декількох земляних проводів.

:::info
Якщо ви використовуєте спеціальні "дуже" потужні карти з Taobao/Aliexpress, то ВИ МАЄТЕ живити їх так, як описано вище в БУДЬ-ЯКОМУ випадку.
:::

### Конфігурація UAV

1. Завантажте образ Raspberry PI з [останнього випуску wfb-ng](https://github.com/svpcom/wfb-ng/releases/)
2. Виконайте прошивку на Raspberry PI **UAV**
3. Перезавантажте його і підключіться через ssh зі стандартними обліковими даними (pi/raspberry).
4. Виконайте дії для ролі **повітря**, як показано в motd.
5. Налаштуйте камерний канал. Відкрийте `/etc/systemd/system/fpv-camera.service` і розкоментуйте конвеєр відповідно до вашої камери (камера PI або камера Logitech)
6. Відкрийте `/etc/wifibroadcast.cfg` і налаштуйте канал WiFi відповідно до налаштувань вашої антени (або використовуйте замовчуваний #165 для 5.8GHz)
7. Налаштуйте PX4 на вивід потоку телеметрії зі швидкістю 1500 Кбіт/с (інші швидкості UART не добре відповідають дільникам частоти RPI).
  Підключіть UART Pixhawk до UART Raspberry PI.
  У розділі `/etc/wifibroadcast.cfg` файлу розкоментуйте `peer = 'serial:ttyS0:1500000'` секцію.

### Використання ноутбука Linux як GCS (важче, ніж використання RasPi)

1. На **наземному** Linux комп'ютері розробки:

  ```sh
  sudo apt install libpcap-dev libsodium-dev python3-all python3-twisted
  git clone -b stable https://github.com/svpcom/wfb-ng.git
  cd wfb-ng && make deb && sudo apt install ./deb_dist/wfb-ng*.deb
  ```

2. Слідуйте інструкції з [Setup HOWTO](https://github.com/svpcom/wfb-ng/wiki/Setup-HOWTO) для завершення встановлення

3. Не забудьте скопіювати `/etc/gs.key` з боку **UAV** на **бік землі**, щоб зв'язати два налаштування.

4. Також не забудьте використовувати той самий канал частоти, що й на боці UAV.

### Використання Raspberry PI як БЗК (легше)

Якщо у вас є Windows або OSX, або ви не хочете налаштовувати WFB-ng на свій ноутбук з Linux, тоді ви можете використовувати той самий готовий образ і ще один Raspberry Pi:

1. Запишіть образ на **ground** Raspberry Pi.
2. Перезавантажте його і підключіться через SSH за стандартними обліковими даними (pi/raspberry).
3. Виконайте дії для ролі **землі**, як показано в motd, але пропустіть налаштування служби `fpv-video` та `osd`.
4. Підключіть ваш ноутбук та земельний RasPi через Ethernet та налаштуйте IP-адреси
5. Відредагуйте `/etc/wifibroadcast.cfg` і встановіть IP-адресу ноутбука в розділах `[gs_mavlink]` та `[gs_video]` (замінивши `127.0.0.1`).

### Налаштування QGroundControl

1. Запустіть _QGroundControl_ і встановіть `RTP h264` на порту 5600 як вихідне джерело відео
2. Використовуйте налаштування за замовчуванням (udp на порту 14550) як джерело mavlink

## Налаштування радіо

З настройками WFB за замовчуванням використовуйте радіоканал 165 (5825 МГц), ширину 20 МГц, MCS #1 (QPSK 1/2) з довгим GI.
Це забезпечує приблизно 7 мбіт/с **ефективної** швидкості (тобто використовуваної швидкості після FEC та кодування пакетів) в **обох напрямках** разом, оскільки WiFi є напівдуплексом.
Таким чином, він підходить для потокового відео 720p@49fps (4 мбіт/с) + два потоки телеметрії з повною швидкістю (вгору та вниз).
Якщо вам потрібна вища пропускна здатність, ви можете використовувати індекси MCS (наприклад, 2 або більше)

## Антени та інше

For simple cases you can use omnidirectional antennas with linear (that bundled with wifi cards) or circular leaf ([circularly polarized Coverleaf Antenna](https://www.antenna-theory.com/antennas/cloverleaf.php)) polarization.
Якщо ви хочете налаштувати зв'язок на велику відстань, ви можете використовувати кілька WiFi адаптерів з напрямними та всенапрямленими антенами. TX/RX Підтримується різноманіття передачі/прийому для кількох адаптерів з коробки (просто додайте кілька мережевих інтерфейсів до `/etc/default/wifibroadcast`).
Якщо ваш WiFi адаптер має дві антени (наприклад, Alfa AWU036ACH), різноманіття передачі втілено через [STBC](https://en.wikipedia.org/wiki/Space%E2%80%93time_block_code).
Карти з 4 портами (наприклад, Alfa AWUS1900) наразі не підтримуються.

## Часто Запитувані Питання

**З:** _Який тип даних можна передавати за допомогою wfb-ng?_

**A:** Будь-який UDP з розміром пакета <= 1445.
Наприклад, x264 в середині RTP або MAVLink.

**Q:** _Які гарантії передачі?_

**A:** Wifibroadcast використовує FEC (передню корекцію помилок).
Ви можете налаштувати його як TX так і RX одночасно!), щоб відповідати вашим потребам to fit your needs.

**Q** _Яка максимальна відстань, на яку я можу летіти і все ще зберігати зв'язок?_

**A**Це залежить від ваших антен та WiFi карт.
З Alfa AWU036ACH і направленою антеною 20dBi на землі можливий польот на відстань приблизно 20 км.

:::warning
Не використовуйте діапазон, на якому працює RC TX!
Або налаштуйте RTL належним чином, щоб уникнути втрати моделі.
:::

**Q:** _Чи підтримується лише Raspberry PI?_

**A:** WFB-ng не зв'язаний з жодним GPU - він працює з UDP-пакетами.
Але для отримання потоку RTP вам потрібен відеокодер (який кодує вихідні дані з камери у потік x264) або ви повинні використовувати камеру з апаратним відеокодеком, таку як Logitech C920 або камери спостереження з Ethernet.

#### Які ARM-плати рекомендуються для БПЛА?

- RPI3b/3b+/ZeroW.
  Існують готові образи, але вони підтримують лише відео h264 для камер CSI.
- Jetson Nano.
  Він підтримує h264 і h265, але вам потрібно налаштувати його самостійно за [допомогою Setup HOWTO.](https://github.com/svpcom/wfb-ng/wiki/Setup-HOWTO)

Ви можете використовувати будь-яку іншу ARM-плату з Linux, але вам потрібно використовувати камеру Ethernet або USB з вбудованими апаратними відеокодеками (наприклад, Logitech C920).

## Теорія

WFB-ng переводить WiFi-карти у режим монітору. Цей режим дозволяє надсилати та отримувати довільні пакети без асоціації та очікування підтвердження (ACK).
[Аналіз можливостей ін'єкції та доступу до медіа апаратного забезпечення IEEE 802.11 в режимі монітору](https://github.com/svpcom/wfb-ng/blob/master/doc/Analysis%20of%20Injection%20Capabilities%20and%20Media%20Access%20of%20IEEE%20802.11%20Hardware%20in%20Monitor%20Mode.pdf) [802.11 часів](https://github.com/ewa/802.11-data)
