Metadata-Version: 2.4
Name: agmen
Version: 0.9.0
Summary: Agmen: el sistema nervioso para robótica, IA e IoT
Keywords: robotics,robotica,middleware,pubsub,ros,ai,iot
Author: Adán López Lozano
License-Expression: MIT
License-File: LICENSE
Classifier: Development Status :: 2 - Pre-Alpha
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Science/Research
Classifier: Natural Language :: Spanish
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: C++
Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Scientific/Engineering
Classifier: Topic :: Software Development :: Libraries
Project-URL: Repository, https://github.com/flkochu/Agmen
Project-URL: Changelog, https://github.com/flkochu/Agmen/blob/main/CHANGELOG.md
Requires-Python: >=3.11
Provides-Extra: numpy
Requires-Dist: numpy>=1.24; extra == "numpy"
Description-Content-Type: text/markdown

# agmen (Python)

**Agmen** es un framework de código abierto para robótica, IA e IoT. Su núcleo
(en C++) es el "sistema nervioso" del robot: mueve mensajes entre nodos de
forma rápida, confiable y con marca de tiempo.

Desde la 0.9, este paquete trae **el mismo núcleo de C++** ya compilado para
Windows, Linux x64, Linux ARM64 (Raspberry Pi) y macOS (Intel y Apple
Silicon), con Python 3.11 o más nuevo: pip no compila nada. En otras
computadoras se instala la versión de Python puro, que funciona igual pero más
lenta. `agmen --version` dice cuál usas.

```bash
pip install agmen            # pip install agmen[numpy] para arreglos como NumPy
```

```python
from dataclasses import dataclass
import agmen
from agmen import wire

@dataclass
class MotorCommand(wire.Message):
    SCHEMA = "MotorCommand{f32 left;f32 right}"   # el mismo esquema que en C++
    left: float
    right: float

pub = agmen.Publisher(MotorCommand, "/cmd")      # un topic: sin IPs ni puertos
pub.publish(MotorCommand(0.5, 0.5))

sub = agmen.Subscriber(MotorCommand, "/cmd")     # cuantos quieras
sample = sub.receive(timeout=0.05)               # None si no llegó nada
```

Con topics, los nodos se encuentran solos con el `agmen hub` de la máquina
(`agmen run` lo arranca). También puedes usar una dirección fija
(`"127.0.0.1:7500"`), sin hub.

Basta con el esquema: el layout en bytes (igual que un struct de C) sale
solo.

También instala el comando `agmen`, que levanta todo tu robot con un solo
comando y abre un panel web para controlarlo:

```bash
agmen run robot.toml     # todos los nodos + panel web (nodos, logs, gráficas, inspector, manejar)
agmen run robot.toml --red   # el panel en tu red local (celular), con clave
agmen web                # solo el panel: grafica cualquier mensaje que le llegue
agmen echo 127.0.0.1:7400   # muestra cualquier mensaje en la terminal
agmen topic list            # qué topics hay, de qué tipo, quién manda y quién escucha
agmen topic echo /imu       # los mensajes de un topic, sin quitarle el puerto a nadie
```

Tus mensajes también pueden vivir en un archivo `.agmen`, el mismo que usa
C++ para generar su código:

```python
msgs = agmen.load("arca9.agmen")
pub = agmen.Publisher(msgs.Articulaciones, "/arca9/q")
pub.publish(msgs.Articulaciones(q=[90.0] * 12, modo=msgs.Modo.TROTAR))
```

Con `agmen.load("arca9.agmen", numpy=True)`, los arreglos llegan como
`numpy.ndarray` de solo lectura, sin copiar.

`agmen gen arca9.agmen --python .` escribe el `.py` (para el autocompletado
de tu editor) y `agmen gen arca9.agmen` muestra cada tipo con su esquema.

El panel también acepta a [Foxglove](https://foxglove.dev) (solo lectura):
conéctate a `ws://127.0.0.1:8080/ws`.

> ⚠ Versión 0.x: la API todavía va a cambiar entre versiones menores.

Documentación, tutorial y código: <https://github.com/flkochu/Agmen>
