# Автономный полёт дрона с помощью Web-камеры

### Зависание в точке

Если система определения координат настроена правильно - возможно тестирование автономного полёта. Программирование автономного полёта осуществляется на языке Python, с использованием библиотек [ZuzaNanoRC](https://disk.yandex.ru/d/xS1PupmsH1YLwA) и [ZuzaNanoMocup](https://disk.yandex.ru/d/2TsJexyr7UL2JQ).

{% hint style="info" %}
После каждого запуска программы необходимо переподключить пульт к компьютеру!
{% endhint %}

Простейшая полётная миссия - осуществить взлёт, провисеть 10 секунд на месте, осуществить посадку. Данная миссия выполняется с помощью следующего кода ([Fly0.py](https://disk.yandex.ru/d/kxnVGUpi1uwt0w)):

```
import ZuzaNanoRC
import ZuzaNanoMocap
import time
import cv2
 

deviceId=1
focus=1150
frameWidth=640
frameHeight=480
fps=40

try:
    Controller = ZuzaNanoRC.ZuzaNanoRC('COM4')
    if not Controller.Connect():
        print('Ошибка связи с портом '+Controller.PortName+'!')
        exit()

    # запуск Mocap класса автономного управления P I D 120 0.35 700
    ZuzaNanoMocap = ZuzaNanoMocap.ZuzaNanoMocap(deviceId, frameWidth, frameHeight, fps, focus,(0,142,0),(255,255,255), 3, cv2.COLOR_BGR2LAB, 0.100, True, 5,
        [0,0,-2.7], 127,[120, 0.35, 700],[210, 0.4, 0], 1.3).start() 
    print(">запуск Mocap класса автономного управления")
    time.sleep(1.0)
    if ZuzaNanoMocap.max_area==0:
        print('НЕ вижу ЖУЖУ!')
        exit()

    # бинд
    print(">Бинд")
    Controller.Bind()
    time.sleep (6)  
    
    # включили моторы
    Controller.SetThrottle(0)
    time.sleep(0.1)
    Controller.SetThrottle(127)
    time.sleep(1)
    #print(">включили моторы")

    # взлетаем
    Controller.SetThrottle(90)
    time.sleep(0.05)
    print('>Взлетаем, подключаем controller')
    ZuzaNanoMocap._dist_i=[0,0,0]
    ZuzaNanoMocap.write_avi = False #Установить значение True, если нужно записать видеопоток с камеры 
    ZuzaNanoMocap.Controller = Controller

    #пауза - зависание дрона
    print(">Взлетели, пауза...")
    time.sleep(30)

    # посадка, установим целевой Z = -10м  
    print("> Посадка! ")
    ZuzaNanoMocap.dd_Target[2]=-10
    time.sleep(3)

    ZuzaNanoMocap.stop()

except KeyboardInterrupt:
    print('>KeyboardInterrupt!')
    ZuzaNanoMocap.stop()
    Controller.SetThrottle(255)

```

Разберём этапы выполнения программы.

1. Импорт нужных модулей и инициализация контроллера пульта управления. Впишите свои значения focus (строка 8) и номер порта пульта (строка 14)

```
import ZuzaNanoRC
import ZuzaNanoMocap
import time
import cv2
 

deviceId=1
focus=1150
frameWidth=640
frameHeight=480
fps=40

try:
    Controller = ZuzaNanoRC.ZuzaNanoRC('COM4')
    if not Controller.Connect():
        print('Ошибка связи с портом '+Controller.PortName+'!')
        exit()
```

2\. Инициализация класса ZuzaNanoMocap для автономного управления. В массив начальных координат \[0, 0, -2.7] вместо -2.7 запишите своё значение расстояния от камеры до пола

```
   # запуск Mocap класса автономного управления P I D 120 0.35 700
   ZuzaNanoMocap = ZuzaNanoMocap.ZuzaNanoMocap(deviceId, frameWidth, frameHeight,
       fps, focus,(0,142,0),(255,255,255), 3, cv2.COLOR_BGR2LAB, 0.100, True, 5,
       [0,0,-2.7], 127,[120, 0.35, 700],[210, 0.4, 0], 1.3).start() 
    print(">запуск Mocap класса автономного управления")
    time.sleep(1.0)
    if ZuzaNanoMocap.max_area==0:
        print('НЕ вижу ЖУЖУ!')
        exit()
```

3\. Привязка пульта к дрону

```
Controller.Bind()
```

4\. Взлёт и передача управления классу **ZuzaNanoMocap** (с помощью присваивания `ZuzaNanoMocap.Controller = Controller`)

```
    # включили моторы
    Controller.SetThrottle(0)
    time.sleep(0.1)
    Controller.SetThrottle(127)
    time.sleep(1)
    #print(">включили моторы")

    # взлетаем
    Controller.SetThrottle(90)
    time.sleep(0.05)
    print('>Взлетаем, подключаем controller')
    ZuzaNanoMocap._dist_i=[0,0,0]
    ZuzaNanoMocap.write_avi = False #Установить значение True, если нужно записать видеопоток с камеры 
    ZuzaNanoMocap.Controller = Controller
```

5\. Ожидание 30 секунд. Класс **ZuzaNanoMocap** удерживает дрон в целевой точке, в фоновом режиме

```
    #пауза - зависание дрона
    print(">Взлетели, пауза...")
    time.sleep(30)
```

6\. Посадка и остановка обработки видеопотока с камеры

```
    # посадка, установим целевой Z = -10м  
    print("> Посадка! ")
    ZuzaNanoMocap.dd_Target[2]=-10
    time.sleep(3)

    ZuzaNanoMocap.stop()
```

Перед запуском программы необходимо установить дрон вертикально под центром камеры, включить пульт, затем включить дрон.

После взлёта программа осуществляет зависание дрона в точке.

### Полёт по квадрату

После того как дрон стабильно зависает в точке - можно писать программы произвольных полётных миссий. В качестве примера ниже приведён фрагмент кода - полёт по квадрату. Начальные координаты дрона (X,Y,Z) указаны в метрах относительно центра камеры: `ZuzaNanoMocap.dd_Target = [0,0,-2.7]`. После взлёта следующий код осуществляет полёт дрона по квадрату([Fly square.py](https://disk.yandex.ru/d/lxs84w7FknKqZw)):

```
    for i in range(3):
        for y in range(10,-11,-1):
            ZuzaNanoMocap.dd_Target[1]=y/50 #50
            time.sleep(0.3)
        time.sleep(0.5)
        for x in range(10,-11,-1):
            ZuzaNanoMocap.dd_Target[0]=x/50
            time.sleep(0.3)
        time.sleep(0.5)
        for y in range(-10,11,1):
            ZuzaNanoMocap.dd_Target[1]=y/50
            time.sleep(0.3)
        time.sleep(0.5)
        for x in range(-10,11,1):
            ZuzaNanoMocap.dd_Target[0]=x/50
            time.sleep(0.3)
        time.sleep(0.5)
```

После завершения полёта по каждой из сторон квадрата программа ставит паузу 0.5 секунды (`time.sleep(0.5)`) для того, чтобы дрон успел стабилизироваться в точке вершины квадрата.&#x20;

Варьируя паузы и графики изменения координат - возможно выполнять произвольные полётные миссии.

Желаем Вам успешных полётов!


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://copter-space.gitbook.io/nebo-v-karmane/v-ray-teleupravlenie-dronom/untitled-1.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
