Пример кода передвижения ровера

Этот код представляет собой асинхронное приложение на Python, использующее библиотеку socketio для удаленного управления ровером Контакт через веб-сокеты. Подробный обзор основных частей кода:

  1. Импорт библиотек:

    • time и signal — стандартные модули Python.

    • socketio — для асинхронной работы с WebSocket.

    • asyncio — для работы с асинхронными функциями и циклами.

    • aiofiles — для асинхронной работы с файлами.

    • datetime — для работы с датами и временем.

  2. Параметры подключения:

    • Адрес сервера хранится в переменной server.

  3. Клиент Socket.IO:

    • Создается экземпляр асинхронного клиента sio.

  4. Диаметр и окружность колеса:

    • Значения используются, возможно, для расчётов перемещения.

  5. Функции для работы с файлами:

    • write_report: асинхронно записывает сообщения в файл отчёта.

  6. Обработчики событий Socket.IO:

    • connect: реагирует на успешное подключение к серверу.

    • on_move, on_spin, on_lights: обработчики результатов выполнения команд движения, вращения и управления освещением соответственно.

  7. Функции для отправки команд на сервер:

    • perform_movement: отправляет команду на перемещение на определённое расстояние.

    • perform_spin_angle: отправляет команду на вращение на определённый угол.

    • control_lights: отправляет команду для включения или выключения света.

  8. Асинхронный основной цикл (main):

    • Соединяется с сервером и последовательно выполняет серию команд (движения, вращения, управление светом).

  9. Запуск асинхронного цикла:

    • Используется asyncio.run(main()) для запуска асинхронной функции main.

Перед началом работы убедитесь, что все библиотеки у вас скачаны. Скорее всего, вам нужно будет установить библиотеку socketio:

  1. Откройте терминал в Visual Studio Code (Terminal - New Terminal или комбинацией ctrl + shift + `)

  2. В открывшимся терминале пишем команду: pip install python-socketio

  3. Нажимаем Enter и ждем загрузки библиотеки. После завершения загрузки можно начинать работу с кодом

Процесс работы с кодом:

  1. Создайте в иерархии файл с названием, например, move_example.py (НАПОМИНАНИЕ: обязательно прописывайте тип файла с названием, иначе по стандарту у вас создастся .txt файл)

  2. Вставьте код в окно программирования

  3. Сохраните свой код в любое место на компьютере (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 градусов вправо (по часовой стрелке), а затем три раза мигает фарами.

Last updated