TRADUCTOR NLP -> ROBOT  v3.0
=============================

PASOS (Windows)
---------------
1) pip install -r requirements.txt
2) Copia los 3 modelos fine-tuneados dentro de models\   (ver models\README_MODELOS_ENTRENADOS.txt)
   Si aun no los tienes, la app funciona igual con el traductor por reglas.
3) Doble clic en run_app.bat   -> construye el corpus si falta y abre http://127.0.0.1:7860

COMPROBAR QUE TODO ESTA SANO (no necesita torch)
------------------------------------------------
   python smoke_test_v3.py

   Son 8 pruebas. La ultima LEVANTA EL SERVIDOR DE VERDAD en el puerto 7861 y
   pide /config por HTTP. Si esa pasa, la interfaz carga en el navegador.

VER EL DISENO SIN LEVANTAR EL SERVIDOR
--------------------------------------
   Abre results\preview_ui_v3.html en cualquier navegador.

RECONSTRUIR EL CORPUS DESDE EL EXCEL
------------------------------------
   construir_dataset.bat
   (equivale a: python -m src.build_dataset_v3 --xlsx data\DATA_V2.xlsx --split-policy balanced)

   Genera:
     data\prepared\train.jsonl           2180 filas
     data\prepared\validation.jsonl       229 filas
     data\prepared\test_v3.jsonl          372 filas
     data\prepared\manifest.json          estadisticas y decisiones
     data\prepared\audit_datav2.csv       auditoria fila a fila del Excel

BENCHMARK CIENTIFICO (sin respaldo por reglas)
-----------------------------------------------
   run_benchmark.bat

LA SIMULACION PYBULLET
----------------------
Dos botones en la pestana Consola:

  * "Verificar en fisica"     -> corre PyBullet SIN ventana (~4 s) y devuelve
                                 el informe: contacto de los dedos, altura del
                                 cubo y error XY final sobre el cuadrado.
  * "Abrir PyBullet 3D"       -> abre la ventana animada con el ciclo completo.

Ciclo por cada cubo:
  HOME -> APPROACH -> DESCEND -> GRASP -> LIFT -> TRANSPORT (en arco) ->
  ALIGN -> RELEASE -> RETREAT -> HOME, y sigue con el siguiente cubo.

El agarre es REAL: el cubo se sostiene por friccion entre los dedos. En v2.6
la pinza quedaba 8,5 cm por encima del cubo y nunca lo tocaba; como no se
comprobaba el contacto, el cubo iba pegado al efector "por decreto".

Hoja de contactos de la secuencia: results\pybullet_secuencia.png

LO IMPORTANTE QUE DEBES SABER
-----------------------------
* DATA_V2.xlsx usa TCP en MILIMETROS y juntas 0..6.
  El proyecto usa METROS y juntas 1..7. La conversion se hace en src\dataset_v2.py
  y queda registrada en audit_datav2.csv. 8 de 2000 filas se descartan porque
  piden posiciones fuera del espacio de trabajo (z negativa o x=1.5 m).

* DATA_V2.xlsx no tiene NI UN ejemplo de pick_and_place, que es justo la orden
  que mueve los cubos en PyBullet. La ampliacion v3 genera 242 ejemplos
  bilingues calculados por regla (no por un LLM).

* El recommended_split del Excel deja get_end_effector_pose con 81 de 82 filas
  en TEST y solo 1 en TRAIN. La politica "balanced" del constructor lo corrige.
  Esto sale explicado en el README y en la pestana "Dataset v3" de la app.

* El benchmark por CLI mide el MODELO (sin respaldo). La interfaz muestra el
  SISTEMA (con respaldo), pero siempre separando "exito puro" de "exito final".
  No mezcles ambas cifras en la tesis.


SI EL NAVEGADOR SE QUEDA EN "Cargando..."
-----------------------------------------
Fue un bug de Gradio 6.22 ya corregido en esta version. El sintoma era:

   AttributeError: 'str' object has no attribute 'name'
   ... gradio\themes\utils\fonts.py, line 94, in __eq__

Ocurria DESPUES de imprimir "Running on local URL", asi que el servidor moria
con el navegador ya abierto esperando. La causa era pasar font=["Inter", ...]
al tema de Gradio. Ahora la tipografia va por CSS y se desactiva la telemetria
de arranque. Verificado contra Gradio 6.22.0.

Si aun asi falla, arranca con:
   python -m src.app_gradio
y pega el traceback completo: la aplicacion reintenta sola sin tema ni CSS.
