<p align="center">
<img src="https://github.com/PunkNaPrekole/geodrive/blob/dev/docs/source/_static/logo.png" alt="geodrive" style="width: 500px;">
</p>
<p align="center">
<em>Python SDK для управления роботами-роверами через gRPC</em>
</p>
<p align="center">
<a href="https://github.com/PunkNaPrekole/geodrive/actions" target="_blank">
<img src="https://github.com/PunkNaPrekole/geodrive/actions/workflows/test.yml/badge.svg" alt="Tests">
</a>
<a href="https://pypi.org/project/geodrive" target="_blank">
<img src="https://img.shields.io/pypi/v/geodrive?color=%2334D058&label=pypi%20package" alt="Package version">
</a>
<a href="https://pypi.org/project/geodrive" target="_blank">
<img src="https://img.shields.io/pypi/pyversions/geodrive.svg?color=%2334D058" alt="Supported Python versions">
</a>
<a href="https://github.com/PunkNaPrekole/geodrive/blob/main/LICENSE" target="_blank">
<img src="https://img.shields.io/github/license/PunkNaPrekole/geodrive?color=%2334D058" alt="License">
</a>
</p>
---
**geodrive** - это современный Python SDK для управления роботами-роверами через gRPC протокол.
## 🚀 Ключевые особенности
* **🎯 Простота использования** - Интуитивный интерфейс с автодополнением
* **⚡ Производительность** - Асинхронный и синхронный клиенты для любых задач
* **🔧 Готов к продакшену** - Надежная обработка ошибок и переподключение
* **📡 Реальное время** - Потоковая телеметрия и управление
* **🤖 Универсальность** - Поддержка различных моделей роботов-роверов
## 📦 Установка
```bash
uv add geodrive
# или
pip install geodrive
```
# Быстрый старт
## Базовое использование
### Подключение к роверу
```python
from geodrive import Rover
# Подключение к роверу
with Rover(host="10.1.100.160", port=5656) as rover:
# Отправка команды движения к точке
rover.goto(5.0, 3.0, 1.57)
# Получение телеметрии
telemetry = rover.get_telemetry()
print(f"Позиция: ({telemetry.x:.2f}, {telemetry.y:.2f})")
print(f"Ориентация: {telemetry.yaw:.2f} рад")
```
## 🛠️ Что внутри?
### **Управление движением**
- Точное позиционирование в координатах X, Y, Yaw
- Потоковое отслеживание прогресса движения
- RC-стиль управления для плавного движения
### **Телеметрия в реальном времени**
- Потоковая передача данных о позиции и ориентации
- Мониторинг состояния батареи и датчиков
### **Надежная коммуникация**
- gRPC для высокопроизводительной связи
- Автоматическое переподключение при обрывах
- Валидация команд и данных
### **Гибкость использования**
- Синхронный для простых скриптов
- Асинхронный для веб-приложений
- Поддержка контекстных менеджеров
## 📋 Требования
- Python 3.10+
- gRPC сервер на стороне робота
- Сетевое соединение с роботом
## 🔗 Зависимости
**geodrive** построен на современных технологиях:
- **grpcio** - высокопроизводительный gRPC клиент
- **protobuf** - работа с бинарными протоколами
- **pydantic** - валидация и сериализация данных
- **structlog** - структурированное логирование
## 📚 Документация
### Начало работы
- [🚀 Быстрый старт](https://punknaprekole.github.io/geodrive/geodrive/getting_started)
- [📦 Установка](https://punknaprekole.github.io/geodrive/geodrive/installation)
- [💡 Примеры](https://punknaprekole.github.io/geodrive/geodrive/examples)
### API документация
- [🔧 Основные классы](https://punknaprekole.github.io/geodrive/geodrive/api/index)
### Сообщество
- [👥 Community Playbook](https://punknaprekole.github.io/geodrive/recipes/index)
### Для разработчиков
- [🤝 Руководство по контрибьютингу](https://punknaprekole.github.io/geodrive/geodrive/contributing)
## 📄 Лицензия
Проект распространяется под лицензией **MIT**.
Raw data
{
"_id": null,
"home_page": null,
"name": "geodrive",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "geoscan, geobot, robot, rover, education, grpc, sdk, robotics",
"author": "Roman",
"author_email": "Roman <r.lazarev@geoscan.ru>",
"download_url": "https://files.pythonhosted.org/packages/60/e5/4e37e1709882d29db0049ea34136f7d1c937c427662aad174a1e809aeb39/geodrive-0.0.4.tar.gz",
"platform": null,
"description": "<p align=\"center\">\n <img src=\"https://github.com/PunkNaPrekole/geodrive/blob/dev/docs/source/_static/logo.png\" alt=\"geodrive\" style=\"width: 500px;\">\n</p>\n\n<p align=\"center\">\n <em>Python SDK \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u043e\u0431\u043e\u0442\u0430\u043c\u0438-\u0440\u043e\u0432\u0435\u0440\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 gRPC</em>\n</p>\n\n<p align=\"center\">\n<a href=\"https://github.com/PunkNaPrekole/geodrive/actions\" target=\"_blank\">\n <img src=\"https://github.com/PunkNaPrekole/geodrive/actions/workflows/test.yml/badge.svg\" alt=\"Tests\">\n</a>\n<a href=\"https://pypi.org/project/geodrive\" target=\"_blank\">\n <img src=\"https://img.shields.io/pypi/v/geodrive?color=%2334D058&label=pypi%20package\" alt=\"Package version\">\n</a>\n<a href=\"https://pypi.org/project/geodrive\" target=\"_blank\">\n <img src=\"https://img.shields.io/pypi/pyversions/geodrive.svg?color=%2334D058\" alt=\"Supported Python versions\">\n</a>\n<a href=\"https://github.com/PunkNaPrekole/geodrive/blob/main/LICENSE\" target=\"_blank\">\n <img src=\"https://img.shields.io/github/license/PunkNaPrekole/geodrive?color=%2334D058\" alt=\"License\">\n</a>\n</p>\n\n---\n\n**geodrive** - \u044d\u0442\u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 Python SDK \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u043e\u0431\u043e\u0442\u0430\u043c\u0438-\u0440\u043e\u0432\u0435\u0440\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 gRPC \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b.\n\n## \ud83d\ude80 \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438\n\n* **\ud83c\udfaf \u041f\u0440\u043e\u0441\u0442\u043e\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f** - \u0418\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c\n* **\u26a1 \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c** - \u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \n* **\ud83d\udd27 \u0413\u043e\u0442\u043e\u0432 \u043a \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0443** - \u041d\u0430\u0434\u0435\u0436\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\n* **\ud83d\udce1 \u0420\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f** - \u041f\u043e\u0442\u043e\u043a\u043e\u0432\u0430\u044f \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u044f \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\n* **\ud83e\udd16 \u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c** - \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0440\u043e\u0431\u043e\u0442\u043e\u0432-\u0440\u043e\u0432\u0435\u0440\u043e\u0432\n\n## \ud83d\udce6 \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\n\n```bash\nuv add geodrive\n# \u0438\u043b\u0438\npip install geodrive\n```\n# \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\n\n## \u0411\u0430\u0437\u043e\u0432\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\n\n### \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0440\u043e\u0432\u0435\u0440\u0443\n\n```python\nfrom geodrive import Rover\n\n# \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0440\u043e\u0432\u0435\u0440\u0443\nwith Rover(host=\"10.1.100.160\", port=5656) as rover:\n # \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u043a \u0442\u043e\u0447\u043a\u0435\n rover.goto(5.0, 3.0, 1.57)\n \n # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u0438\n telemetry = rover.get_telemetry()\n print(f\"\u041f\u043e\u0437\u0438\u0446\u0438\u044f: ({telemetry.x:.2f}, {telemetry.y:.2f})\")\n print(f\"\u041e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u044f: {telemetry.yaw:.2f} \u0440\u0430\u0434\")\n```\n\n## \ud83d\udee0\ufe0f \u0427\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438?\n\n### **\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435\u043c**\n- \u0422\u043e\u0447\u043d\u043e\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 X, Y, Yaw\n- \u041f\u043e\u0442\u043e\u043a\u043e\u0432\u043e\u0435 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0430 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \n- RC-\u0441\u0442\u0438\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f\n\n### **\u0422\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438**\n- \u041f\u043e\u0442\u043e\u043a\u043e\u0432\u0430\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438\n- \u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0431\u0430\u0442\u0430\u0440\u0435\u0438 \u0438 \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432\n\n### **\u041d\u0430\u0434\u0435\u0436\u043d\u0430\u044f \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u044f**\n- gRPC \u0434\u043b\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438\n- \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043e\u0431\u0440\u044b\u0432\u0430\u0445\n- \u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434 \u0438 \u0434\u0430\u043d\u043d\u044b\u0445\n\n### **\u0413\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f**\n- \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432\n- \u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439\n- \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0445 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u0432\n\n## \ud83d\udccb \u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\n\n- Python 3.10+\n- gRPC \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0440\u043e\u0431\u043e\u0442\u0430\n- \u0421\u0435\u0442\u0435\u0432\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0440\u043e\u0431\u043e\u0442\u043e\u043c\n\n## \ud83d\udd17 \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\n\n**geodrive** \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u0445:\n\n- **grpcio** - \u0432\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 gRPC \u043a\u043b\u0438\u0435\u043d\u0442\n- **protobuf** - \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u043c\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430\u043c\u0438 \n- **pydantic** - \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445\n- **structlog** - \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\n\n## \ud83d\udcda \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\n\n### \u041d\u0430\u0447\u0430\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u044b\n- [\ud83d\ude80 \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442](https://punknaprekole.github.io/geodrive/geodrive/getting_started)\n- [\ud83d\udce6 \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430](https://punknaprekole.github.io/geodrive/geodrive/installation) \n- [\ud83d\udca1 \u041f\u0440\u0438\u043c\u0435\u0440\u044b](https://punknaprekole.github.io/geodrive/geodrive/examples)\n\n### API \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\n- [\ud83d\udd27 \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b](https://punknaprekole.github.io/geodrive/geodrive/api/index)\n\n### \u0421\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e\n- [\ud83d\udc65 Community Playbook](https://punknaprekole.github.io/geodrive/recipes/index)\n\n### \u0414\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432\n- [\ud83e\udd1d \u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u043a\u043e\u043d\u0442\u0440\u0438\u0431\u044c\u044e\u0442\u0438\u043d\u0433\u0443](https://punknaprekole.github.io/geodrive/geodrive/contributing)\n\n## \ud83d\udcc4 \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f\n\n\u041f\u0440\u043e\u0435\u043a\u0442 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0435\u0439 **MIT**.\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Universal SDK for rover programming",
"version": "0.0.4",
"project_urls": {
"Documentation": "https://github.com/PunkNaPrekole/geodrive",
"Homepage": "https://github.com/PunkNaPrekole/geodrive",
"Repository": "https://github.com/PunkNaPrekole/geodrive"
},
"split_keywords": [
"geoscan",
" geobot",
" robot",
" rover",
" education",
" grpc",
" sdk",
" robotics"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "9366f78bb1dbd831eb068036c51bd1c051cffff37392a8cf8d25e151b322726f",
"md5": "e33922825b8d363ae353500ca8112968",
"sha256": "1ddb6f0894932cb83bb4f14c80736d39c684ecffbd69e5ca36ac1386c3288766"
},
"downloads": -1,
"filename": "geodrive-0.0.4-py3-none-any.whl",
"has_sig": false,
"md5_digest": "e33922825b8d363ae353500ca8112968",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 23732,
"upload_time": "2025-10-08T12:56:11",
"upload_time_iso_8601": "2025-10-08T12:56:11.135928Z",
"url": "https://files.pythonhosted.org/packages/93/66/f78bb1dbd831eb068036c51bd1c051cffff37392a8cf8d25e151b322726f/geodrive-0.0.4-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "60e54e37e1709882d29db0049ea34136f7d1c937c427662aad174a1e809aeb39",
"md5": "11cc9eb302e589f0171062100fbe67c3",
"sha256": "95f658ea8796d744d2cce4579f602c2f4824bf3978ce45472870557b23259817"
},
"downloads": -1,
"filename": "geodrive-0.0.4.tar.gz",
"has_sig": false,
"md5_digest": "11cc9eb302e589f0171062100fbe67c3",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 15958,
"upload_time": "2025-10-08T12:56:12",
"upload_time_iso_8601": "2025-10-08T12:56:12.254118Z",
"url": "https://files.pythonhosted.org/packages/60/e5/4e37e1709882d29db0049ea34136f7d1c937c427662aad174a1e809aeb39/geodrive-0.0.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-08 12:56:12",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "PunkNaPrekole",
"github_project": "geodrive",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "geodrive"
}