ФАЙЛ "MAIN.PY"

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

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

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

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

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

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

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

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

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 для обработки видео.

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

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-адреса, порты и токен аутентификации. Обратите внимание! Ваши данные могут отличаться от данных в примере, пропишите правильные данные.

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

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

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 из файла. Она считывает файл построчно и извлекает идентификаторы маркеров и их координаты.

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

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, управление состоянием ровера, обработку видео, обнаружение маркеров и объектов, а также управление ровером или симулятором. Функция включает опциональное использование симулятора и управления светом на ровере.

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

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

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

  1. Установите необходимые библиотеки: в данном случае не предустановлены библиотеки: 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. Для того, чтобы код работал корректно, в окне иерархии должны быть эти файлы.

Last updated