Базовое движение
Этот код представляет собой асинхронное приложение на 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 градусов вправо (по часовой стрелке), а затем три раза мигает фарами.
Last updated