# ФАЙЛ "MAIN.PY"

Файл "Main.py" является основным файлом для дальнейшего управления всеми файлами.&#x20;

## Задачи файла "MAIN.PY"

1\. Установка соединения с различными сервисами (RTSP, YOLO, ArUco и т.д.).

2\. Загрузка и обработка данных (карты ArUco и видеопотока).

3\. Обнаружение маркеров и объектов на видеоизображении.

4\. Управление состоянием ровера (перемещение к маркерам, управление светом и т.д.).

5\. Корректное завершение работы (закрытие соединений и остановка потоков).

<br>

## ИНИЦИАЛИЗАЦИЯ БИБЛИОТЕК

```python
import asyncio
import contextlib
import socket
import threading
import aiofiles
import logging
from contextlib import suppress
from Server_Controller import Attachments, Site_run
from queue import SimpleQueue
from Contact_state import ContactState
import plotly.graph_objs as go
from Contact_controller import SimulationController, RoverController
from video_processing import Connect_aruco, Connect_yolo
```

\- asyncio: Модуль для асинхронного программирования.

\- contextlib: Модуль для управления контекстными менеджерами.

\- socket: Модуль для сетевого взаимодействия.

\- threading: Модуль для работы с потоками.

\- aiofiles: Библиотека для асинхронной работы с файлами.

\- logging: Модуль для ведения логов.

\- Server\_Controller: Импортирует классы Attachments и Site\_run для управления внешними устройствами и веб-сервером.

\- queue.SimpleQueue: Простая очередь для межпоточной коммуникации.

\- Contact\_state: Импортирует класс ContactState для представления состояния ровера.

\- plotly.graph\_objs: Библиотека для создания интерактивных графиков и визуализаций.

\- Contact\_controller: Импортирует классы SimulationController и RoverController для управления ровером.

\- video\_processing: Импортирует классы Connect\_aruco и Connect\_yolo для обработки видео.

## КОНФИГУРАЦИЯ ПОДКЛЮЧЕНИЯ

```python
IP_ADDRESS      = socket.gethostbyname(socket.gethostname())
SERVER_PORT     = 3006
RTSP_PORT       = 8554
PORT_YOLO       = 12345
PORT_ARUCO      = 6690
PORT_REALSENSE  = 5527
PORT_SERVO      = 5520
PORT_RELE       = 5525
SERVER_URL      = f'http://{IP_ADDRESS}:{SERVER_PORT}/'
RTSP_LINK       = f'rtsp://{IP_ADDRESS}:{RTSP_PORT}/web'
TOKEN           = 'your_token'   Токен аутентификации
HOST_SOCKET     = 'localhost'
PORT_SOCKET     = 5530
PORT_SITE       = 8888
#Данные меняются в зависимости от ваших портов и данных
```

Этот блок кода задает настройки подключения, такие как IP-адреса, порты и токен аутентификации. Обратите внимание! Ваши данные могут отличаться от данных в примере, пропишите правильные данные.

## СОЗДАНИЕ СОБЫТИЙ И ОЧЕРЕДЕЙ

```python
event = asyncio.new_event_loop()
asyncio.set_event_loop(event)
 
video_frame_queue = SimpleQueue()   Очередь для кадров видео
robot_state = ContactState(0, 0, 0)   Начальное состояние робота
sayt_start = asyncio.Event()
sayt_stop = asyncio.Event()   Событие для остановки видеопотока
thread_running = threading.Event()
thread_running.set()
```

Здесь создаются объекты для событий, очередей и начальное состояние ровера. Эти объекты помогают координировать работу различных частей программы.

## ФУНКЦИЯ ЗАГРУЗКИ КАРТЫ ARUCO

```python
async def load_aruco_map(filename):
    aruco_map = {}
    async with aiofiles.open(filename, mode='r', encoding='utf-8') as file:
        async for line in file:
            parts = line.strip().split()
            if len(parts) == 8:
                marker_id = int(parts[0])
                x = float(parts[2])
                y = float(parts[3])
                aruco_map[marker_id] = {'x': x, 'y': y}
    return aruco_map

```

Эта асинхронная функция загружает карту маркеров ArUco из файла. Она считывает файл построчно и извлекает идентификаторы маркеров и их координаты.

## ОСНОВНАЯ ФУНКЦИЯ

```python
async def main(use_simulator):
    aruco_map = await load_aruco_map("region.txt")   Загрузка карты ArUco
 
    if use_simulator:
        site = Site_run(HOST_SOCKET, PORT_SITE, HOST_SOCKET, PORT_SOCKET, RTSP_LINK)
        ax = go.Figure(layout=go.Layout(width=700, height=800))
        ax.update_layout(showlegend=False)
        controller = SimulationController(aruco_map, robot_state, ax, HOST_SOCKET, PORT_SOCKET)
    else:
        controller = RoverController(aruco_map, robot_state)
 
    yolo = Connect_yolo(IP_ADDRESS, PORT_YOLO, RTSP_LINK)   Подключение к YOLO
    aruco = Connect_aruco(IP_ADDRESS, PORT_ARUCO, RTSP_LINK)   Подключение к ArUco
 
    marker_ids = await aruco.aruco_detect()   Обнаружение маркеров ArUco
    if marker_ids:
        logging.info(f"Detected ArUco markers: {marker_ids}")
 
    detect = await yolo.yolo_detect()   Обнаружение объектов с помощью YOLO
    if detect:
        logging.info(f"Detected Objects: {detect}")
 
    attachments = Attachments(IP_ADDRESS, PORT_RELE, PORT_SERVO)
    await attachments.rele_status(True)
    await attachments.servo_grad(0)
 
    await controller.control_lights(True)
    await controller.navigate_to_marker(36)
    await controller.control_lights(False)
    await controller.navigate_to_marker(47)
    await controller.perform_movement(100)
    await controller.perform_spin_angle(90)
    await controller.control_lights(False)
    
    site.stop()
    yolo.stop()

```

Эта функция координирует работу всех компонентов системы, включая загрузку карты ArUco, управление состоянием ровера, обработку видео, обнаружение маркеров и объектов, а также управление ровером или симулятором. Функция включает опциональное использование симулятора и управления светом на ровере.

## ЗАПУСК ПРОГРАММЫ

```python
if __name__ == "__main__":
    controller = None
    with suppress(contextlib):
        event.run_until_complete(main(use_simulator=True))
        event.close()
        thread_running.clear()

```

Этот блок кода запускает основную функцию main и обеспечивает корректное завершение работы программы, включая остановку потоков и закрытие событий.

\
Процесс подготовки кода:

1. Создайте файл с названием main.py

<br>

<figure><img src="/files/CWUIS1MhjW2L8QHmMpdy" alt=""><figcaption><p>Файл "main.py" в иерархии</p></figcaption></figure>

2. Поэтапно копируйте код в свой файл

<figure><img src="/files/yFwCZP6QVoH2Jjt1dc1T" alt=""><figcaption><p>Окно программирования файла main.py. Часть 1</p></figcaption></figure>

<figure><img src="/files/QQIijU1xoPIWBmJeXBhS" alt=""><figcaption><p>Окно программирования файла main.py. Часть 2</p></figcaption></figure>

<figure><img src="/files/WYOtnMmhSCqFSZaEaTVM" alt=""><figcaption><p>Окно программирования файла main.py. Часть 3</p></figcaption></figure>

<figure><img src="/files/sBVWvTWisbmfxNxG0LLa" alt=""><figcaption><p>Окно программирования файла main.py. Часть 4</p></figcaption></figure>

<figure><img src="/files/Jy68opmQWHUciRbt2KlV" alt=""><figcaption><p>Окно программирования файла main.py. Часть 5</p></figcaption></figure>

3. Установите необходимые библиотеки: в данном случае не предустановлены библиотеки: aiofiles и plotly. В случае, если они у вас не установлены, выполните следующие действия:

   1. Откройте терминал VS Code (Terminal -> New Termial или комбинацией Ctrl + Shift + \`)
   2. В терминале поочередно введите и запустите следующие команды: pip install aiofiles; pip install plotly

   Так же в инициализации библиотек имеются такие библиотеки, как: Server\_controller, Contact\_state, Contact\_controller и video\_processing. Это не библиотеки файлов, это файлы, которые вызываются в main. Для того, чтобы код работал корректно, в окне иерархии должны быть эти файлы.


---

# 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://dh-organization.gitbook.io/droneshub-rover-kontakt/opisanie-osnovnoi-chasti-programmy/fail-main.py.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.
