ФАЙЛ "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 и обеспечивает корректное завершение работы программы, включая остановку потоков и закрытие событий.
Процесс подготовки кода:
Создайте файл с названием main.py

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





Установите необходимые библиотеки: в данном случае не предустановлены библиотеки: aiofiles и plotly. В случае, если они у вас не установлены, выполните следующие действия:
Откройте терминал VS Code (Terminal -> New Termial или комбинацией Ctrl + Shift + `)
В терминале поочередно введите и запустите следующие команды: pip install aiofiles; pip install plotly
Так же в инициализации библиотек имеются такие библиотеки, как: Server_controller, Contact_state, Contact_controller и video_processing. Это не библиотеки файлов, это файлы, которые вызываются в main. Для того, чтобы код работал корректно, в окне иерархии должны быть эти файлы.
Last updated