From 48a1385a1a9542e0b25b49a96b98d696dbba1808 Mon Sep 17 00:00:00 2001 From: GalinaDa <73272491+GalinaDa@users.noreply.github.com> Date: Fri, 19 Mar 2021 17:43:06 +0700 Subject: [PATCH] docs: add ProCleVeR team copter hack article (#316) * Add remote-control-with-oculusvr for Clover * Edit article * List article * Update remote-control-with-oculusvr.md Update article * Edit article Co-authored-by: GalinaDa Co-authored-by: Oleg Kalachev --- docs/en/copterhack2021.md | 1 + docs/ru/SUMMARY.md | 1 + docs/ru/copterhack2021.md | 1 + docs/ru/remote-control-with-oculusvr.md | 155 ++++++++++++++++++++++++ 4 files changed, 158 insertions(+) create mode 100644 docs/ru/remote-control-with-oculusvr.md diff --git a/docs/en/copterhack2021.md b/docs/en/copterhack2021.md index a01d22c0..05c2261a 100644 --- a/docs/en/copterhack2021.md +++ b/docs/en/copterhack2021.md @@ -18,3 +18,4 @@ All information about the event can be found on the official website: https://co |Quadrotor|[Дрон-Агроном](../ru/drone-agronom.html)| |Atomic Ferrets|[Система засечки для дронов](../ru/race_timing_sys_copterhack.html)| |FTL|[AdvancedClover](../ru/advanced_clover.html)| +|ProCleVeR|[Разработка системы для управления БПЛА с помощью шлема виртуальной реальности](../ru/remote-control-with-oculusvr.html)| diff --git a/docs/ru/SUMMARY.md b/docs/ru/SUMMARY.md index e24d4584..9c330705 100644 --- a/docs/ru/SUMMARY.md +++ b/docs/ru/SUMMARY.md @@ -107,6 +107,7 @@ * [CopterHack-2018](copterhack2018.md) * [CopterHack-2017](copterhack2017.md) * [Проекты на базе Клевера](projects.md) + * [Разработка системы для управления БПЛА с помощью шлема виртуальной реальности](remote-control-with-oculusvr.md) * [Шоу коптеров](clever-show.md) * [Innopolis Open 2020 (L22_ÆRO)](innopolis_open_L22_AERO.md) * [Олимпиада НТИ 2020 (P4DF2)](nti2020_p4df2.md) diff --git a/docs/ru/copterhack2021.md b/docs/ru/copterhack2021.md index cef8e4fc..b9c6ba34 100644 --- a/docs/ru/copterhack2021.md +++ b/docs/ru/copterhack2021.md @@ -14,6 +14,7 @@ CopterHack 2021 – это командный конкурс по разраб |Atomic Ferrets|[Система засечки для дронов](race_timing_sys_copterhack.md)| |MINIONS|[Дрон для высаживания семян](seeding_drone.md)| |FTL|[AdvancedClover](advanced_clover.md)| +|ProCleVeR|[Разработка системы для управления БПЛА с помощью шлема виртуальной реальности](remote-control-with-oculusvr.md)| |ADDI|[3D-printed generative design frame](../en/generative_design_frame.html)| |Bennie and the Jetson TX2|[Retail Drone](../en/bennie.html)| |DroMap|[The Indoor Mapping Drone](../en/dromap.html)| diff --git a/docs/ru/remote-control-with-oculusvr.md b/docs/ru/remote-control-with-oculusvr.md new file mode 100644 index 00000000..d41220ac --- /dev/null +++ b/docs/ru/remote-control-with-oculusvr.md @@ -0,0 +1,155 @@ +# Разработка системы для управления БПЛА с помощью шлема виртуальной реальности + +[CopterHack-2021](copterhack2021.md), команда: **ProCleVeR**. + +## Команда + +- [Давыденко Галина](https://github.com/GalinaDa), e-mail: [galyadavydenko@yandex.ru](mailto:galyadavydenko@yandex.ru). + +## Введение + +Сейчас существует несколько способов управления квадрокоптером: первый и самый простой, управление через аппаратуру, у данного метода имеется несколько недостатков, управление идет до тех пор, пока человек может видеть квадрокоптер, или же пока не будет потерян сигнал. Второй способ – FPV, такое управление уже более удобно и наиболее распространено, по сравнению с предыдущим. В данном случае осуществляется не только управление коптером, но и также получения видео-изображения по дополнительному видео-каналу в режиме реального времени. Третий способ, автономный полет - позволяет БПЛА работать в среде, куда не проникает сигнал GPS и без оператора. + +Рассмотрев все способы управления, я выявила, что похожим на систему, которую я разрабатываю, будет FPV. В моей разработке присутствует несколько компонентов, квадрокоптер, шлем виртуальной реальности и манипуляторы. И сравнив, то что я хочу получить в итоге и то что есть на данный момент, выявилось, что у моей разработки будут преимущества, например, как я считаю главным минусом FPV управления является то, что коптер не сможет летать на большие расстояния из-за сигнала аппаратуры. + +## Разработка + +Было принято решение делать систему такой: управление квадрокоптером будет проходить через манипуляторы, а также через шлем виртуальной реальности. Какое же управление идет через шлем? На шлем будет перенесен поворот квадрокоптера по рысканью. При помощи поворота головы, будет поворачиваться коптер. + +## Настройка Clover OS + +Настройка включает в себя переключение Raspberry из режима точки доступа в режим клиента. На начало работы была установлена [следующая операционная система](https://github.com/CopterExpress/clover). После установки можно было приступить непосредственно к настройкам системы. Как перевести Raspberry Pi в режим клиента, рассказывается в статье: [Настройка Wi-Fi](https://clover.coex.tech/ru/network.html). После того, как была произведена данная настройка Raspberry будет автоматически подключаться к Wi-Fi, после можно подключаться к Raspberry по SSH, также в дальнейшем подключение к Wi-Fi пригодится для подключения к серверу и передачи данных между клиентом и серверу (в разрабатываемой мной системе клиентом является квадрокоптер и сервером – компьютер). + +## Подключение и проверка подключения + +Для начала проверим и попробуем подключиться к Raspberry по сети Wi-Fi. Узнать подключается ли Raspberry, а также узнать его IP-address для дальнейшей работы. Подключаемся к маршрутизатору по локальному адресу 192.168.0.1, затем переходим к списку подключённых устройств и находим устройство с названием: cloverXXXX, где Х – любое число. + +![Список клиентов, подключённых к маршрутизатору](https://user-images.githubusercontent.com/60854798/111508088-e1917480-877d-11eb-80c1-58a0fd6df65b.jpg) + +## Удаленное управление + +Для дальнейшей работы, будет проходить несколько тестов. Первые два теста используют светодиоды. 1 – отправление и получение данных с проверкой на светодиоде. Данные отправляются с сервера и приходят клиенту, клиент также отправляет данные о своем состоянии серверу. + +Для начала подключим библиотеку, используемую при работе со светодиодами – RPi.GPIO. Затем поле того как было получено сообщение от сервера, включаем(выключаем) светодиод, в строке мы будем указывать порт, к которому подключен светодиод, а также значение 1 или 0 в зависимости от того, что требуется сделать со светодиодом. Познакомится с программным управление светодиода можно познакомится здесь. + +Далее рассмотрим вариант управлении непосредственно через среду Unity, которая и использовалась при разработке системы. Для данного теста было написано два кода один из низ написан на C# и является сервером в данном подключении, другой на Python – клиент. + +Откроем соединение и подключимся к клиенту по протоколу ТСР при помощи следующих строк: + +```csharp +IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("192.168.0.107"), 9090); +socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); +socketServer.Bind(ipPoint); +``` + +Для прослушивания каналов используем метод: + +```csharp +socketServer.Listen(10); +``` + +Так как потребуется начать асинхронную операцию, создадим объект асинхронных событий. + +```csharp +SocketAsyncEventArgs e = new SocketAsyncEventArgs(); +``` + +Для того, чтобы определить нажата ли клавиша, будем использовать следующее: + +```csharp +Input.GetKey(KeyCode.Space) +``` + +Для отправки используем: + +```csharp +socketClient.Send(Encoding.ASCII.GetBytes("1")); +``` + +Для принятия данных используем: + +```csharp +socketClient.Receive(Encoding.ASCII.GetBytes("1024")); +``` + +Видео демонстрации работоспособности результата: + + + +## Отправка изображения и передача видео в среду Unity + +Для начала будем отправлять пакет данных, который содержит в себе информацию: тип передаваемых данных и если это изображение, то его размер. Это делается потому, что клиент(квадрокоптер) помимо изображения будет отправлять данные, например, местоположение, заряд аккумулятора, мощность и так далее. Для этого, было необходимо различать пакеты. В программе это реализуется следующим образом: + +```csharp +socketClient.Receive(buffer); +Array.Copy(buffer, 0, image, i, buffer.Length > size - i ? size - i : buffer.Length); +``` + +Для вывода изображения используем: + +```csharp +Texture2D tex = new Texture2D(2, 2); +tex.LoadImage(image); +GetComponent().material.mainTexture = tex; +``` + +В свою очередь клиент отправляет изображение, которое предварительно загрузили на Raspberry. + +Для определения размера передаваемого изображения используем: + +```python +filesize = os.stat(filename).st_size +``` + +Пакуем данные: + +```python +d = struct.pack('>bI', 0, filesize) +``` + +Также для отправки данных может использоваться другой метод: + +```python +s.sendall(bytes_read) +``` + +Перейдем к передаче видеопотока и его отображении: + +Для вывода напишем следующие строчки кода: + +```csharp +yield return new WaitWhile(() => socketClient.Available < size); +Debug.Log(socketClient.Available); +socketClient.Receive(image, 0, image.Length, SocketFlags.None); +Texture2D tex = new Texture2D(2, 2); +tex.LoadImage(image); +GetComponent().material.mainTexture = tex; +``` + +У клиента добавляем передачу видео с подключенной камеры: + +```python +ret, frame = cam.read() # считываем изображения с камеры +result, frame = cv2.imencode('.jpg', frame, encode_param) # записываем в переменные нужные данные +client_socket.send(struct.pack(" + +## Функции при управлении + +- Индикация управления. + + + +- Поворот квадрокоптера по рысканью при помощи шлема виртуальной реальности. + +## Тестовые запуски системы + +- Запуск без индикации. +- Запуск с индикацией. + +