Базовое движение
Этот код представляет собой асинхронное приложение на Python, использующее библиотеку socketio для удаленного управления ровером Контакт через веб-сокеты. Подробный обзор основных частей кода:
- Импорт библиотек: - timeи- signal— стандартные модули Python.
- socketio— для асинхронной работы с WebSocket.
- asyncio— для работы с асинхронными функциями и циклами.
- aiofiles— для асинхронной работы с файлами.
- datetime— для работы с датами и временем.
 
- Параметры подключения: - Адрес сервера хранится в переменной - server.
 
- Клиент Socket.IO: - Создается экземпляр асинхронного клиента - sio.
 
- Диаметр и окружность колеса: - Значения используются, возможно, для расчётов перемещения. 
 
- Функции для работы с файлами: - write_report: асинхронно записывает сообщения в файл отчёта.
 
- Обработчики событий Socket.IO: - connect: реагирует на успешное подключение к серверу.
- on_move,- on_spin,- on_lights: обработчики результатов выполнения команд движения, вращения и управления освещением соответственно.
 
- Функции для отправки команд на сервер: - perform_movement: отправляет команду на перемещение на определённое расстояние.
- perform_spin_angle: отправляет команду на вращение на определённый угол.
- control_lights: отправляет команду для включения или выключения света.
 
- Асинхронный основной цикл ( - main):- Соединяется с сервером и последовательно выполняет серию команд (движения, вращения, управление светом). 
 
- Запуск асинхронного цикла: - Используется - asyncio.run(main())для запуска асинхронной функции- main.
 
Перед началом работы убедитесь, что все библиотеки у вас скачаны. Скорее всего, вам нужно будет установить библиотеку socketio:
- Откройте терминал в Visual Studio Code ( - Terminal - New Terminalили комбинацией- ctrl + shift + `)
- В открывшимся терминале пишем команду: - pip install python-socketio
- Нажимаем Enter и ждем загрузки библиотеки. После завершения загрузки можно начинать работу с кодом 
Процесс работы с кодом:
- Создайте в иерархии файл с названием, например, move_example.py (НАПОМИНАНИЕ: обязательно прописывайте тип файла с названием, иначе по стандарту у вас создастся .txt файл) 
- Вставьте код в окно программирования 
- Сохраните свой код в любое место на компьютере ( - ctrl + shift + s)
import time
import signal
import socketio
import asyncio
import aiofiles
from datetime import datetime
server = 'http://localhost:8080/' # адресс вашего ровера
# Создаем экземпляр асинхронного клиента Socket.IO
sio = socketio.AsyncClient()
diameter_of_wheel = 0.24  # Диаметр колеса в метрах
circumference = 3.14159 * diameter_of_wheel  # Окружность колеса
async def write_report(message): # Функция создания автоматического отчета
    filename = f'Отчет_Фамилия_Имя.txt'
    async with aiofiles.open(filename, mode='a', encoding='utf-8') as file:
        await file.write(message + "\n")
# Определяем обработчик события "connect"
@sio.event
async def connect():
    await write_report('Подключено к серверу Socket.IO')
async def on_move(result):
    await write_report(f'Command done: {result}')
async def perform_movement(distance_cm):
    max_speed = 0.5  # Максимальная скорость м/с (примерная, можно изменить)
    distance_m = distance_cm / 100.0  # Переводим сантиметры в метры
    time_to_travel = distance_m / max_speed
    await sio.emit('command', {
        'id': 1,
        'type': "move",
        'value': {  
            'x': 0,
            'y': 1,
            'sensitivity': 1,
        },
    }, namespace='/vehicles', callback=on_move)
    movement_message = f"Команда движения отправлена, ожидайте {time_to_travel:.2f} секунд."
    await write_report(movement_message)
    print(movement_message)
    await asyncio.sleep(time_to_travel)
    await sio.emit('command', {
        'id': 1,
        'type': "move",
        'value': {
            'x': 0,
            'y': 0,
            'sensitivity': 1,
        },
    }, namespace='/vehicles', callback=on_move)
    
    await asyncio.sleep(1)
    completion_message = f"Движение завершено: Пройденное расстояние {distance_m} м."
    await write_report(completion_message)
    print(completion_message)
async def on_spin(result):
    await write_report(f'Spin command done: {result}')
async def perform_spin_angle(angle, clockwise=True):
    FULL_ROTATION_TIME = 2
    ACCELERATION_FACTOR = 0.05
    rotation_time = (angle / 360) * FULL_ROTATION_TIME
    total_time = rotation_time + (rotation_time * ACCELERATION_FACTOR)
    await sio.emit('command', {
        'id': 1,
        'type': "spin",
        'value': {
            'state': True,
            'direction': clockwise
        },
    }, namespace='/vehicles', callback=on_spin)
    
    spin_message = f"Начат поворот на {angle} градусов, {'по часовой стрелке' if clockwise else 'против часовой стрелки'}"
    await write_report(spin_message)
    print(spin_message)
    await asyncio.sleep(total_time)
    
    await sio.emit('command', {
        'id': 1,
        'type': "spin",
        'value': {
            'state': False,
            'direction': clockwise
        },
    }, namespace='/vehicles', callback=on_spin)
    await asyncio.sleep(0.5)
    completion_spin_message = f"Поворот на {angle} градусов завершён."
    await write_report(completion_spin_message)
    print(completion_spin_message)
    
    
async def on_lights(result):
    await write_report(f'Lights command done: {result}')
async def control_lights(on: bool):
    # Команда для управления светом
    lights_command = {
        'id': 1,
        'type': 'lights',
        'value': on
    }
    # Отправляем команду на сервер
    await sio.emit('command', lights_command, namespace='/vehicles', callback=on_lights)
    # Записываем сообщение в файл отчета и выводим его в консоль
    action = "включены" if on else "выключены"
    message = f"Команда на включение света {action} отправлена."
    await write_report(message)
    print(message)
async def main(): # Код выполнения подключения и выполнения команд движения Ровера Контакт
    await sio.connect(server, wait_timeout=20, transports='websocket', namespaces=['/vehicles'], auth={"token": 'your_token'})
    
    await perform_movement(100)
    
    await perform_spin_angle(90, clockwise=False)
    
    await control_lights(True)
    await asyncio.sleep(0.5)
    await control_lights(False)
    await asyncio.sleep(0.5)
    
    await control_lights(True)
    await asyncio.sleep(0.5)
    await control_lights(False)
    await asyncio.sleep(0.5)
    
    await control_lights(True)
    await asyncio.sleep(0.5)
    await control_lights(False)
    await asyncio.sleep(0.5)
    
    await sio.disconnect()  # Закрываем соединение после завершения всех операций
  
# Запускаем асинхронный цикл main()
asyncio.run(main())
Код организован таким образом, чтобы асинхронно управлять Ровером Контакт, реагируя на команды сервера и записывая результаты действий в файл отчета. Это может использоваться для тестирования или демонстрации возможностей удалённого управления ровером в реальном времени. Команды в этом коде выполнены таким образом: ровер сначала проезжает 1 метр, затем поворачивается на 90 градусов вправо (по часовой стрелке), а затем три раза мигает фарами.
Последнее обновление
