Mostrando entradas con la etiqueta idea. Mostrar todas las entradas
Mostrando entradas con la etiqueta idea. Mostrar todas las entradas

sábado, 1 de febrero de 2025

Entre entusiastas y detractores




El uso de la llamada Inteligencia Artificial se está generalizando en el mundo de las marcas y aplicaciones. El tiempo de las versiones Beta a dado paso, masivamente, a las versiones oficiales y no existe hoy en día, una marca que se precie, que no haya incorporado esta tecnología a su buque insignia.

Yo como aficionado a las tecnologías no paro de sorprenderme de la rapidez en su avance y la curiosidad me llama.

Entre entusiastas y detractores no es un artículo que pretende ahondar en la brecha abierta por el uso de estas tecnologías, sino más bien en su buen uso, para el desarrollo de nuevas ideas, provocando el cambio en los modelos de aprendizaje, derribando fronteras y procurando un cambio progresivo y beneficioso al conjunto de la sociedad.

Uno de los grandes miedos hacia esta, podría ser, la dependencia que se crea con su uso generalizado y para ello, nada mejor que el debate abierto y permanente. Una mente lucida, nunca deja en manos de otro, lo que considera importante, al menos sin una correcta supervisión. Y esta, ¿la dejaremos también en manos de la que podiamos llamar "IA vigilante"?.

Para el ejemplo que os traigo he usado Replit, un IDE en la nube que incorpora dos poderosas herramientas basadas en Inteligencia Artificial, Agent y Assistant. No se trata de contar las bonanzas de la aplicación, que sin duda las tiene. Tampoco tengo claro, si lo que hay detrás es unicamente la IA, o un equipo mixto (Humano/Máquina > 1 o Humano/Máquina < 1), así que me gustaría pensar que el merito se debe a su gran equipo humano de desarrollo.

La idea, que no es original pero para mí novedosa y bastante técnica, trata de crear un "input remote" o mando a distancia para un videojuego desarrollado con Unity, utilizando para ello un dispositivo móvil. Como siempre, esto es solo un prototipo de desarrollo, sin animo de lucro, con el foco puesto en el aprendizaje. Todas las herramientas usadas, son solo para uso particular y poder dar una salida a mi inquietud y curiosidad. A continuación os muestro un enlace de YouTube, donde se puede ver en que consiste facilmente Vídeo InputRemote

Las explicaciones y el código que he usado en este desarrollo lo podeis consultar libremente en https://github.com/jmcaneda/MobileJoystickControllerDef

Para llevarla a cabo, he tomado uno de "mis pequejuegos", el que mejor podría adaptarse, desarrollado en Unity.

Vamos a comenzar por a describir el apartado del videojuego con el motor Unity y el código que tiene mas relación con esta idea.

Unity

En la Build Settings

  • Utilizo como plataforma WebGL, que como sabéis significa Web Graphics Library, es una API (interfaz de programación de aplicaciones) utilizada para renderizar gráficos 3D y 2D en navegadores web sin necesidad de plugins y permite a los desarrolladores crear gráficos interactivos y animaciones utilizando JavaScript y el estándar de gráficos OpenGL ES. La mayoria de los navegadores web ya incorporan este framework por defecto.

En Player Settings. Estos parámetros han sido consultados en el manual de Unity https://docs.unity3d.com/2022.3/Documentation/Manual/webgl-deploying.html

  • Compression Format: a Gzip.
  • Data Caching: a check.
  • Decompression  Fallback: a check.

¿Qué nos proporciona la Build?. Las carpetas Build, TemplateData y el archivo index.html. Si comprimimos el conjunto en un archivo .zip y lo subimos a la Plataforma de videojuegos Indie itchio, indicándole que se pueden ejecutar en un navegador web, ya podriamos disfrutar del mismo, utilizando como mando del videojuego, el propio teclado.

Pero..., ¿dónde colocamos todo este código para que podamos ejecutar nuestra aplicación correctamente?. Pues colocamos el resultado de la Build en Unity en la carpeta static del servidor, tal cual, sin modificar nada. ¿Quiere decir esto que si en vez del juego utilizado MaribelProject, lo cambio por otra Build, respetando su ubicación, funcionaría el resto?. La respuesta es si. Podemos reutilizar todo el código y solo, crear nuestro juego y podremos manejar los inputs, desde cualquier dispositivo móvil. Esto es lo fantástico!!!.

Archivos de la Build en Unity


static/Build/
 ├── Builds.data
 ├── Builds.framework.js
 ├── Builds.loader.js
 └── Builds.wasm
 			
static/TemplateData/
├── style.css
└── [assets visuales]
          
index.html

Del código C#, el que mayor interés tiene para la cuestión que estamos tratando es PlayerController.cs, de este extraeremos la parte que nos interesa resaltar. Son la declaración de clases de los diferentes tipos de datos que manejaremos en los diferentes eventos.

void HandleJoystickInput(string jsonData)
En este evento se recibirán los datos x e y del Joystick para el desplazamiento del personaje.
void HandleButtonInput(string jsonData)
En este evento se recibirán los datos state y action, acerca de las teclas pulsadas para el desplazamiento del personaje y visión de cámara.
void HandleInputMethod(string jsonData)
En este evento se recibirá el dato state, sobre el método de input elegido, a off, desde teclado, a on, desde dispositivo móvil.

      
      
      void HandleJoystickInput(string jsonData)
      {
          if (GameManager.instancia.inputRemote)
          {
              JoystickData data = JsonUtility.FromJson(jsonData);
              movement = new Vector3(data.x, 0, data.y) * moveSpeed;

              animator.SetFloat("Horizontal", data.x);
              animator.SetFloat("Vertical", data.y);
          }
      }

      void HandleButtonInput(string jsonData)
      {
          if (GameManager.instancia.inputRemote)
          {
              ButtonData data = JsonUtility.FromJson(jsonData);
              if (data.state == "pressed")
              {
                  switch (data.action)
                  {
                      case "up":
                          {
                              movement = Vector3.forward * moveSpeed;
                              animator.SetFloat("Horizontal", movement.x);
                              animator.SetFloat("Vertical", movement.y);
                              break;
                          }
                      case "down":
                          {
                              movement = Vector3.back * moveSpeed;
                              animator.SetFloat("Horizontal", movement.x);
                              animator.SetFloat("Vertical", movement.y);
                              break;
                          }
                      case "left":
                          {
                              movement = Vector3.left * moveSpeed;
                              animator.SetFloat("Horizontal", movement.x);
                              animator.SetFloat("Vertical", movement.y);
                              break;
                          }
                      case "right":
                          {
                              movement = Vector3.right * moveSpeed;
                              animator.SetFloat("Horizontal", movement.x);
                              animator.SetFloat("Vertical", movement.y);
                              break;
                          }
                      case "A":
                          {
                              break;
                          }
                      case "B":
                          {
                              // Iniciar el desplazamiento a la siguiente esquina
                              GameManager.instancia.indiceEsquinaActual = (GameManager.instancia.indiceEsquinaActual + 1) % GameManager.instancia.esquinas.Length;
                              GameManager.instancia.offset = GameManager.instancia.esquinas[GameManager.instancia.indiceEsquinaActual];
                              break;
                          }
                  }

              }
              else if (data.state == "released")
              {
                  if (data.action != "A" && data.action != "B")
                  {
                      movement = Vector3.zero;
                  }
              }
          }
      }
      
      void HandleInputMethod(string jsonData)
      {
          InputMethodData data = JsonUtility.FromJson(jsonData);
          switch (data.state)
          {
              case "on": GameManager.instancia.inputRemote = true; break;
              case "off": GameManager.instancia.inputRemote = false; break;
          }
      }
      
      [System.Serializable]
      public class JoystickData
      {
          public float x;
          public float y;
      }

      [System.Serializable]
      public class ButtonData
      {
          public string action;
          public string state;
      }

      [System.Serializable]
      public class InputMethodData
      {
          public string state;
      }
    
    

Objeto importante en Unity

En Unity, debe existir el objeto MaribelController y tener como componente, entre otros el script PlayerController.cs

Python y JavaScript

Esta es la parte en la que la asistencia de la IA de Replit, no con pocos intentos en la fase de depuración, facilitó las claves para encaminar este desarrollo, a buen término.

Este proyecto implementa una comunicación bidireccional en tiempo real,       entre un controlador móvil y un juego Unity WebGL, utilizando WebSocket como protocolo de comunicación.


Componentes Principales


Servidor WebSocket (app.py)


Implementado con Flask-SocketIO
Gestiona conexiones y desconexiones
Retransmite eventos entre el controlador y Unity

Cliente Controlador (controller.js)


Implementa la interfaz de usuario del controlador
Captura eventos táctiles y de botones
Emite eventos WebSocket al servidor

Cliente Unity (websocket.js)


Recibe eventos del servidor
Comunica con el juego Unity via SendMessage
Gestiona la conexión WebSocket del lado del juego


Vamos a verlo sobre un diagrama de bloques.



[Dispositivo Móvil] --> (WebSocket) --> [Servidor Flask] --> (WebSocket) --> [Unity WebGL]
     ^                                                                            |
     |                                    Feedback                                |
     +--------------------------------------------------------------------------- +
 			


Partes del código que cabe resaltar



game.html, este es el verdadero contenedor de Unity. Tomamos todo lo que nos interesa del código index.html, de la build de Unity y lo reescribimos en este.


websocket.js, recibe los eventos del servidor y los comunica a Unity vía SendMessage


handleGameControl(data) {
        if (!this.gameInstance) {
            console.warn('Game instance not ready, retrying connection...');
            setTimeout(() => this.socket.connect(), 1000);
            return;
        }

        // Send the control data to Unity
        switch(data.type) {
            case 'joystick':
                this.gameInstance.SendMessage('MaribelController', 'HandleJoystickInput', 
                    JSON.stringify(data.data));
                break;
            case 'button':
                this.gameInstance.SendMessage('MaribelController', 'HandleButtonInput',
                    JSON.stringify(data.data));
                break;
            case 'inputMethod':
                this.gameInstance.SendMessage('MaribelController', 'HandleInputMethod',
                    JSON.stringify(data.data));
                break;
        }
}
        

Importante, se puede observar que SendMessage busca un objeto llamado MaribelController y los métodos HandleJoystickInputHandleButtonInputHandleInputMethod, incluidos en el componente PlayerController.cs


Error en la versión de producción (Deployments)

Cuando ya disponía de todo el código probado en desarrollo, al pasarlo a producción en Replit (Deployments), se producía un error, que pese a estar documentado en parte en los manuales de Unity, no lo estaba para su uso con servidores Flask. Paso a describirlo, junto con la solución adoptada.

"WebAssembly streaming compilation failed! This can happen for example if "Content-Encoding" HTTP header is incorrectly enabled on the server for file /static/Build/Builds.wasm, but the file is not pre-compressed on disk (or vice versa)".

En app.py podrás ver como se ha resuelto este tema y la clave, en el siguiente código.

    @app.route('/static/Build/')
    def serve_build(filename):
        try:
            response = send_from_directory('static/Build', filename)
            if filename.endswith('.wasm'):
                response.headers['Content-Type'] = 'application/wasm'
                response.headers['Cross-Origin-Embedder-Policy'] = 'require-corp'
                response.headers['Cross-Origin-Opener-Policy'] = 'same-origin'
                response.headers['Cross-Origin-Resource-Policy'] = 'cross-origin'
                response.headers['Cache-Control'] = 'no-cache'
                response.headers['Accept-Ranges'] = 'bytes'
                # Asegurarse de que no haya compresión
                response.direct_passthrough = True
                if 'Content-Encoding' in response.headers:
                    del response.headers['Content-Encoding']
                if 'Content-Length' in response.headers:
                    del response.headers['Content-Length']
            return response
        except Exception as e:
            app.logger.error(f'Error serving {filename}: {str(e)}')
            return str(e), 500
      

Técnica empleada y herramientas adicionales🔧

Asset Store 🏬

He utilizado los siguientes packages de Asset Store, casi siempre en su versión free o con mínima inversión.



Links de interés 🔗

He utilizado los sonidos de nuestro querido "Chiquito de la calzada".

El juego original, sin input remote, en WebGL y teclado, podéis probarlo sin problemas. Este es un videojuego regalo y me sirve como base para el desarrollo de este artículo. Gracias Maribel.

Elementos necesarios 🔑

  • La app requiere un dispositivo móvil, con capacidad para el escaneo de código QR y navegador web, compatible o habilitado para JavaScript (la mayoría ya lo tienen configurado por defecto).
  • La aplicación comenzará con el linkado desde el navegador web, compatible con WebGL (la mayoría ya lo son por defecto). Recomiendo que se realice desde equipo de sobremesa o portátil.
  • Desde el dispositivo móvil escanearemos el código QR y dispondremos el mismo en apaisado. Es importante que veamos el "connected" en verde, esto es indicativo que podemos hacer uso del dispositivo.
  • El foco debe estar puesto en el navegador, esto lo podemos conseguir posicionando el ratón en el mismo. Cambiaremos el input mode, en el dispositivo móvil, de Off a On y ya está, podremos manejar a nuestro personaje "Maribel", en su recorrido por las calles, escuchando los mensajes y procurando no ser convertida por los "UrbanZombies", de dos maneras: como Joystick o por medio de los botones de desplazamiento. El botón "B", esta programado para el cambio de posición de la cámara.
  • Requiere de una conexión a internet.

_

C.A.C. (Soho Málaga), supuso para nosotros (los de entonces), un lugar de encuentro.


sábado, 26 de septiembre de 2020

La agenda, una herramienta educativa

Por JMCp


   Son tantos los beneficios que proporciona el uso de la agenda en el ámbito escolar, que su utilización es apoyada por los docentes desde las etapas educativas tempranas.


   Tiene que ver con la competencia matemática, en lo relativo a la interrelación de conceptos, el orden en el que establecemos 'lo importante', en el ‘timeline’ del curso escolar.


   También participa del aprendizaje en competencia lingüística, ya que refuerza la expresión escrita y la ajusta a las necesidades, para decir lo máximo en el menor espacio posible (en el recuerdo tengo esas 'chuletas imposibles').


   De su uso continuado, se van aplicando mejoras que tienen que ver con los procesos mentales implicados en el aprendizaje (aprender a aprender), como la reflexión o la toma de conciencia.


   En el como comparte su contenido y a quienes implica, en el propio debate por establecer fechas y acciones, tiene que ver con las competencias sociales.


   Solo el hecho de tener iniciativa y aplicarla, para modificarla adaptándola, según una planificación con criterio autónomo, gestionando el tiempo y su riesgo, con el fin de poder manejar situaciones complejas de forma satisfactoria, es lo que tiene que ver con la iniciativa y su capacidad de emprender acciones con resultados, mejorando su autoestima.


   Agrupa, clasifica, anota, subraya, resalta con globos, pone color, incluso establece emoji que tienen que ver con su estado de ánimo, ante por ejemplo, un aprobado. ¿Quién no ha mirado alguna vez a un compañero como pone o resalta, en una verdadera experiencia creativa, algo por medio de caricaturas ;>)


   Y por último la competencia digital para los más mayores. En el cambio del formato tradicional hacia las apps de los dispositivos electrónicos, más acordes con los tiempos y edades del momento, fomentadas por el uso de las TIC, con el desarrollo de destrezas en la creación de contenidos, demostrando curiosidad con búsqueda de alternativas e integrarlas, como el hecho de colocarlos mediante ‘widgets’ en el acceso rápido del móvil.


   Comentar que para el alumnado digital, la app ‘Horario de clases’, el número 2 en la clasificación de IOS Educación de App Store, es una aplicación simple e intuitiva que permite organizar su horario en forma de clases o eventos semanales. Su interfaz llena de color la hace muy adecuada, favoreciendo su ‘usabilidad’.


   Respecto de los cuadernos digitales para el profesorado, proponemos para su uso otras más especializadas y completas, como son iDoceo o additio, potentes herramientas de apoyo, con una sencilla interfaz. Son aplicaciones que integran la gestión completa de la clase, desde la planificación, seguimiento a la evaluación, así como cualquier hecho de interés que sea reseñable, como la falta de asistencia a clase.



jueves, 10 de septiembre de 2020

El reto: inicio del curso

   Nada sustituye a un beso o un abrazo. El contacto físico entre las personas es algo habitual y tiene que ver con nuestras emociones, con nuestro bienestar. El saludo, nos acerca e involucra, junto con la mirada o la palabra, para transmitir un deseo de prosperidad. 

   Ningún inicio de curso es parecido, pero nada comparado con este. A los habituales buenos deseos, nervios e incertidumbres, a este curso hemos de añadir la presión que supone la crisis sanitaria provocada por el #coronavirus. Todo un reto para los alumnos, algunos amigos y docentes, muchos de ellos a la vez madres o padres y el resto de la comunidad educativa.

 

   Parte de la carga emotiva que trae consigo la reapertura de los colegios, con la vuelta del alumnado y docentes a las aulas, deberán canalizarse mediante mecanismos nuevos, algunos de estos habrán de ser muy creativos, a la vez que se eviten los contactos físicos, manteniendo la distancia social, sin mermar con ello en la medida de lo posible, la propia emoción que en los primeros días se produce, tras tantos meses de distanciamiento.

 

   Gestionar tal cúmulo de emociones, en las actuales circunstancias no será tarea fácil. Dar protagonismo al alumnado, dejar que cuenten sus experiencias, en círculos, en donde a nadie se le de la espalda, pienso que puede ser una buena forma de empezar.

 

   Como complemento, las herramientas TIC pueden ofrecernos fórmulas alternativas, para la gestión de las emociones. El poder liberar ese pensamiento o el poder facilitar el reconocimiento a un compañero o maestr@, son tareas que fácilmente se pueden implementar e integrar en el Aula.

 

   La aplicación Padlet es un buen ejemplo de como hacer cosas en ese sentido, con un poco de imaginación y habilidad.

 

   Se trata de un lienzo infinito, donde podemos situar cualquier cosa que podáis imaginar y trasladar al formato digital. Es intuitivo, interactivo, colaborativo y exportable, puedes limitarlo o extenderlo, compartirlo con quien quieras. La versión gratis posibilita hasta tres lienzos, pero gracias a la diversidad de formas que puede adoptar lo hace muy versátil, a pesar de esa limitación. Se puede integrar en plataformas LMS de diferentes maneras, incluso por medio de código HTML.

 

   Os dejo aquí un par de ejemplos que he creado y con ello sugeriros algunos mas, el primero en el formato 'Estantería', para las condecoraciones y el segundo en el formato 'Muro', para los buenos deseos.







   La mayoría de las imágenes de estos ejemplos pertenecen a la propia aplicación y al banco de imágenes de Freepik.es

 

   También aparecen imágenes creadas por la app Bitmoji y @BeatrizCerdan




sábado, 25 de julio de 2020

Como trabajar en un entorno colaborativo y mantener la información al día

   En el aprendizaje por proyectos, los docentes implicados deberán planificar los diferentes ítems del proyecto, definir objetivos, indicadores, grupos, rúbricas, registro de tareas, informes de seguimiento, encuestas, análisis y puntos de mejora, además de preparar toda la documentación de las tareas propuestas.

   

   Esta información deberá recogerse por medio de aplicaciones que permitan la compartición (en la nube) y de esta forma podrán mantenerse al día, para el seguimiento por otros colaboradores. Todo esto deberá realizarse en tiempo y forma, con una frecuente comunicación entre los diferentes participantes y con un control sobre los flujos de trabajo.


   Para el caso que nos ocupa, en el proyecto ficticio 'Radi-Olé-On', recomendamos tres aplicaciones, cuyas funcionalidades las hacen idóneas. OneNote, para la documentación compartida, Trello para el seguimiento y control del flujo del trabajo colaborativo e iThoughts para la esquematización de ideas. Todas permiten la sincronización en diferentes dispositivos, lo que proporciona portabilidad, facilitando su uso desde cualquier lugar y en cualquier momento. A estas aplicaciones podrían añadirse otras, para necesidades concretas, como las videoconferencias web ..., que serán motivo de otro artículo.


 

OneNote

   

   Permite tener control sobre la documentación y su compartición. Permite la creación de blocs, separando por pestañas las diferentes secciones, lo que ayuda a una buena organización y cada sección, formadas por grupos de páginas, para aquello que requiere un mayor detalle.

   Permite insertar todo tipo de información desde imágenes, archivos multimedia, documentos, texto con formato o en tablas, lo que le confiere una gran potencia y versatilidad.







Trello



   Facilita la comunicación y el control del flujo de trabajo entre los diferentes docentes, la coordinación y el responsable TIC. Se sigue un proceso simple, se crea un tablero y a este se le añaden listas. Estas listas facilitan el orden y la agrupación de tarjetas. Las tarjetas son tareas que se pueden asignar a colaboradores, permite la comunicación mediante mensajería, programación de fechas y otras funciones. Las tarjetas pueden moverse entre las listas, para un mejor control de fases.






iThoughts


   Es una herramienta para la creación de mapas mentales. ¿Tienes una idea?, la concretamos en una reunión de forma rápida y sencilla. Podemos crear esquemas mentales de las diferentes actividades que formaran parte del proyecto de aprendizaje, en colaboración con el equipo y todo realizado en tiempo real, en una reunión con videollamada y por compartición de escritorio. El resultado final quedará a disposición del equipo en formato .png, para su inclusión en la documentación para las diferentes tareas, junto con sus actividades.






miércoles, 22 de julio de 2020

Difusión de la idea


   Toda idea ha de darse a conocer, someterla a debate frente a otras ideas, ten en cuenta que ‘no siempre lo mejor es los mas adecuado’ y para averiguarlo, lo mas fácil, es difundirlo y someterlo a crítica.

   Debes tener bien preparado tu plan y abordarlo según unas fases. Para mostrar en que se puede convertir tu 'proyecto idea', lo mas práctico es mostrar un esquema, que te ayude en la presentación y que imprima fuerza.

   En el proyecto ficticio Radi-Olé-On (proyecto de aprendizaje busca Centro educativo que lo adopte), podría ser una buena forma de empezar.

   Adjunto una propuesta de esquema que podría servir como base para este u otros proyectos.

   Me encantan los lugares de inspiración y este respira de estos otros.

   Experiencias educativas inspiradoras