Program your Aisoy1 with Scratch

April 29, 2014

Finally! It is possible to program your Aisoy1 using Scratch or BYOB (Snap!). If you are not familiar with Scratch we encourage you to give it a try. It’s a free, fun, visual programming environment for creating simple programs. Scratch was created by the “Lifelong Kindergarten" team at the Massachusetts Institute of Technology. The effort had the financial support of the National Science Foundation, Microsoft, the Intel Foundation, Nokia, and the Media Lab research consortium at MIT. The fundamental goal was to create a simple programming language that would appeal to children and young people from ages 8 to 16.

Since its initial release in 2003, the project has become a revolutionary educational tool and has been involved in more than five million public projects with over three million registered users. Projects such as BYOB evolved from Scratch with the intention of making it a more powerful tool suitable for more advanced computer courses. BYOB retains the aesthetics and philosophy of Scratch but allows the creation of custom blocks that encapsulate the execution of routines.

What do we need?

Currently the Aisoy1 Airosbridge is compatible with BYOB 3.1.1 although it will be integrated with Scratch 2.0 through the course of 2014. Before continuing with these instructions, be sure your Aisoy1 is updated. Please open the botserver and confirm that the the "Rosbridge" option appears.

In addition to an Aisoy1 Raspberry Pi, you'll need a computer to run BYOB, the Chrome browser and Airos Bridge, which is a chrome app. Airos Bridge (also called Scratch Bridge) is a "helper app" based on Chrome which acts as an interface between BYOB / Scratch and your robot. If you own several Aisoy1 bots, you can communicate to them (and between them) from the same BYOB program...imagine the types of apps you can develop! ;)

Required for this Project

We need:
  • Aisoy1 Raspberry Pi, with the Rosbridge section in botserver.
  • BYOB 3.1.1
  • Browser Google Chrome
  • Chrome App “Airos Bridge”

First we install BYOB which is available on all popular operating systems:

byob.png If you want learn more about BYOB before continuing, we recommend the following resources:

Next, we will install Chrome:

From the Chrome browser, you can download the “Airos Bridge” app from the link below. You will need to open a free Google account if you do not have one:

chromeapp_01.png After installing the Airos Bridge app, an Aisoy icon appears in the applications section of Chrome. However, before we launch it, we have to activate Rosbridge on Aisoy1. chrome_app_folder.png Within Aisoy1’s botserver, click on Rosbridge tab: botserver_rosbridge.png

Rosbridge needs about 1 minute to start up, so we can return to BYOB and open the Aisoy’s template that contains the blocks compatible with our bot while it’s loading.

You can download this template and other examples from here:
  • https://www.dropbox.com/s/f0d3k1phioqsmcc/aisoy_template.ypr
byob_aisoy_template.png After the system loads this template, it will display a message indicating that the sensory motors are connected. This allows us to connect to an external application. Read more here:

Ok, now BYOB is all set to use.

Good, now BYOB is ready to use. The next step is to start the Airos Bridge application. In the address bar of Chrome, type: chrome://apps/. The browser will display the apps installed in Chrome. Click on Airos Bridge to launch it and you should see something like this:

chromeapp_ros_scratch.png We see that Scratch is connected, so we are on track. Since we launched Rosbridge a long time ago, it should be working now and available for connecting. To connect to Rosbridge, type the IP address of your Aisoy1 in the upper text box. If the connection is successful, a new tab will appear in the application displaying information and settings for your Aisoy1. Try touching either side of your robot or tilting it. If things are working well you should see the result of those actions reflected in the corresponding touch or accelerometer fields.

Programming Aisoy1 using BYOB

Aisoy provides a template that includes the most common blocks used by Aisoy1v3. These support the use of motor functions (moving eyes, head, eyebrows ...), capture of events (touch, accelerometer), control of the mouth, changing the color of the heart, using TTS (text-to-speech or voice synthesis) as well as the ASR. They are listed under the “Control” group and classified on “actions” or “events”. aisoy_blocks.png

“Action” Aisoy blocks

Movement

Movement of eyebrows, eyes, horizontal head rotation and vertical head tilt have a similar process. They are supported by blocks with three parameters:

  1. Name of bot that launch the movement.

  2. Final position of movement. The value must be between 0 and 1.

  3. Execution time in miliseconds.

Voice synthesis (TTS)

Voice synthesis is only possible if bot is connected to a Raspberry Pi.

There are two blocks for this job, one that involves moving the mouth and one that supports speaking. The format is the same for both:

  1. Name of bot that is going to speak.

  2. Text to say.

Draw into LEDs matrix (Mouth)

The matrix of LEDs in the mouth can be used in two ways: writing text on it or drawing a picture (eg a smile). The block has the following format:

  1. Name of bot that we will write on mouth.

  2. Text or image to write

If we want to draw an image, the parameter will be a string with 70 characters, where 0 turns the LED off and x turns it on.

Change light heart

This block will change the heart color using three parameters (rgb format):

  1. Red component

  2. Green component

  3. Blue component

  4. Time to change the color in milliseconds

Aisoy Blocks “Events”

Voice recognition

Voice recognition for the Aisoy1 consist of  two phases:
  • Grammar scope: “Set grammar” block establishes a range of words and rules for the bot (a set of words and sentences that bot will recognize). If we establish a grammar with the words "hello" and "goodbye"; the robot will only be able to understand these words. Using grammar we can specify whole sentences too.
  • Voice recognition: When robot has a vocabulary loaded, it will start to listen and capture all the words and phrases that it recognizes. The message will be in this format:

[bot_name].asr [phrase]

For example:

bot1.asr hello

We can capture these messages using a “when I receive” block. The following picture shows the steps for activating voice recognition in BYOB:

Other Aisoy blocks

This combination of blocks is necessary for the program to operate properly.

Each block uses an Aisoy latch variable that disables the execution of new instructions when the latch is closed. When the a block with a latch is used, the latch is closed preventing the execution of other blocks. When the block that closed the latch ends the “command confirmation” block will open the latch and other blocks will be able to execute.

This mechanism allows synchronous program execution and prevents invalid simultaneous block execution.

Annexes

Aisoy1 Scratch / BYOB communication

Remote Sensors Protocol

A Scratch extension that allows interaction with other Scratch programs starting with version 1.3.

When remote sensors are active, Scratch listens on port 42001 to read / write messages.

To support this functionality, Scratch uses these two blocks:

  • Broadcast

It will send a message to the chrome-app with the format:

broadcast “MESSAGE”

  • When I receive

This block is a Trigger that executes instructions hooked to the block when receiving a MESSAGE on port 42001.

Message protocol supported

For communication between different bots is proposed a protocol for message passing. The format for the actuator messages will be:

BOT_NAME.COMMAND ARGUMENTS

  • BOT_NAME: The alias ​​assigned to each bot. Currently, alias (bot1, bot2…) will be assigned in the order of input.
  • COMMAND: The function to be executed by bot (MUST END WITH BLANK!)

  • ARGUMENTS: Required arguments to support execution of the command.

Example: To change the heart color to green in 300ms.

bot1.setColorf 0 255 0 300

Acutators commands

The supported actuators are:

Mouth print

Command: BOT_NAME.mouthPrint

Arguments:

  • TEXT: Text to write in matrix led. Text should be capitalized and spaces replaced by "_".

Example:

bot1.mouthPrint HELLO_WORLD

Mouth draw

Command: BOT_NAME.mouthDraw

Arguments:

  • PICTURE: String of 70 characters where '0 'is off and' x ' on.

Example:

bot1.mouthDraw 0000000000000000000000000000000x000000x000x0000x00000xxxx0000000000000

Set Color

Command: BOT_NAME.setColorf

Arguments:

  • RED: Red value (0 to 255)

  • GREEN:   Green value (0 to 255)

  • BLUE: Blue value (0 to 255)

  • TIME: (Optional) Time in ms to change exchange LED color

Examples:

bot1.setColorf 255 0 0

bot2.setColorf 0 255 255 300

Move Servo

Command: NOMBRE_BOT.moveServo

Arguments:

  • SERVO: Servo’s ID [1-4]

  • POSITION: Final position of servo [float between 0-1]

  • TIME: Time in ms to change position

Examples:

bot1.moveServo 1 0.65 300

bot2.moveServo 3 1 1000

Say

Only using ROS

Command: BOT_NAME.say

Arguments:

  • TEXT: Text to say

Example:

bot1.say hello human

Note: Write two vowels to accent a syllable!

Example:

bot1.say helloo

Touch sensors

Currently, the only supported sensors are the touch sensors. If bot sensor is touched, it sends two messages: one for each activated sensor (left, right, head) and another general that indicates it is being touched. (J, it doesn’t sound/look like two messages are being sent...more?)

The general is:

BOT_NAME.touched

And individuals:

BOT_NAME.touched.left

BOT_NAME.touched.right

BOT_NAME.touched.head

Example: bot will send the next messages if it is touched at head and left side:

bot1.touched

bot1.touched.left

bot1.touched.head

Block creation

To create a block, you have to press the “Make a block” button in the Variables tab. We can define it after naming the block and choosing the category.

We just need to attach blocks to the created block. This routine will run when you call the block that we created.

Example 1: Write in mouth

To illustrate the building blocks we can use the block to write text created in the mouth.

This section focuses on creating a message that will be sent to the chrome-app for the implementation of the action. The message to write will have the format:

<bot name>.mouthPrint <text to write>

It will produce this message:

bot1.mouthPrint TEXT TO WRITE

The latch variable support the proper execution of actions. It is a variable that prevents the execution of actions until the previous actions have finished.

Example 2: Move eyebrows

Another example is controlling the movement of eyebrows:

This block expects the bot name (“bot1” in the image), final position of eyebrows (value between 0 and 1, in this case 0.5) and the elapsed time to perform the movement (300ms).

The first step is to check if the value of position is valid (between 0 and 1).

Then the block parameters are concatenated to create a message to be sent to the chrome-app. This block sends:

bot1.moveServo 4 0.5 300

Example 3: Blink

You can create blocks to provide functionality that may not be directly supported in the BYOB template. For example, to create a blinking eye effect (which is not included in BYOB), you can send the appropriate movement instructions to the servos.

The code below defines a “Blink” block which contains “move eyes of” blocks:

And these blocks contain Aisoy commands.

Links

http://byob.berkeley.edu/

http://wiki.scratch.mit.edu/wiki/Build_Your_Own_Blocks_(Scratch_Modification)

http://byob.berkeley.edu/BYOBManual.pdf

  ¡Por fin!, ya es posible programar tu Aisoy1 utilizando Scratch o BYOB. Si aún no conoces Scratch te animamos a probarlo, es un entorno para crear animaciones, juegos, o lo que se ocurra, gratuito y divertidísimo. Scratch se creó gracias a un equipo de programación “The Lifelong Kidergarten” en el Instituto de Tecnología de Massachusetts. Tuvo el apoyo financiero de la National Science Foundation, Microsoft, Intel Foundation, Nokia, y el consorcio Media Lab research del MIT. La idea principal fue la creación de un lenguaje de programación sencillo que pudiese atraer a niños y jóvenes de 8 a 16 años, consiguiendo que se adentrasen al mundo de la informática. Desde su nacimiento, en el año 2003, el proyecto ha supuesto una revolución como herramienta educativa, y ha conseguido desde entonces más de 5 millones de proyectos publicados y 2 de usuarios registrados. Pronto comenzaron a surgir modificaciones que lo convertían en una herramienta más potente, como por ejemplo Byob, creado con ánimo de hacer de Scratch un entorno de programación adecuado para cursos más avanzados de computación. Byob mantiene las reglas estéticas y filosofía de Scratch, permitiendo, además, la creación de bloques personalizados que encapsulan la ejecución de rutinas.

¿Qué necesitamos?

Actualmente Aisoy1 es compatible con BYOB 3.1.1, aunque a lo largo del 2014 se integrará con la última versión, llamada Snap!, desarrollada íntegramente en Javascript, así como con Scratch 2.0. Actualmente, abril de 2014, la integración con Scratch sólo está disponible como una funcionalidad del repositorio experimental, para saber si tu robot es compatible comprueba si en la pantalla principal del botserver te aparece la opción “Rosbridge”. Además de un Aisoy1 Raspberry Pi, necesitarás un ordenador donde instalar BYOB, el navegador Chrome y Airos Bridge. Airos Bridge (también llamado Scratch Bridge) es una “Helper app” basada en Chrome, necesaria para que BYOB/Scratch pueda comunicarse con tu robot. Si tienes varios Aisoy1 puedes comunicarte con todos desde el mismo programa BYOB, imagina las aplicaciones que puedes desarrollar ;)

Manos a la obra

Resumiendo, necesitamos:
  • Aisoy1 Raspberry Pi, con sección Rosbridge en botserver.
  • Byob 3.1.1
  • Navegador Google Chrome
  • Chrome App “Airos Bridge”
1. Lo primero será instalar BYOB 3.1.1, disponible para prácticamente todos los sistemas operativos: byob.png Si antes de continuar te apetece trastear un poco con BYOB, te recomendamos los siguientes manuales: Continuamos con la instalación del navegador Chrome: Instalamos "Airos Bridge". Utilizando el navegador Chrome accede al siguiente enlace para descargar la aplicación “Airos Bridge”, necesitarás una cuenta de google para descargarla desde este enlace: chromeapp_01.png Al instalar Airos Bridge, te aparecerá su icono en la sección de aplicaciones de Chrome, pero no lo ejecutes aún, vamos a activar Rosbridge en Aisoy1. chrome_app_folder.png Activamos Rosbridge. Una vez en el botserver de tu Aisoy1 accede a settings para activar Rosbridge: botserver_rosbridge.png Rosbridge necesita en torno a un minuto para activarse, pero no te impacientes, mientras tanto podemos volver a BYOB para abrir la plantilla preparada por Aisoy con los bloques que necesitas para crear aplicaciones compatibles. Puedes descargar esta plantilla y otros ejemplos desde aquí: byob_aisoy_template.png Al cargar esta plantilla te aparecerá un mensaje para comunicar que los sensores remotos se han activado. Esta funcionalidad permite a Scratch y BYOB comunicar con una aplicación externa. Puedes encontrar más información aquí: Perfecto, BYOB está listo para empezar, ahora vamos a iniciar la aplicación Airos Bridge. Para ello escribe chrome://apps/ en la barra de direcciones de Chrome. Te aparecerán las distintas aplicaciones Chrome instaladas, inicia Airos Bridge y tendrás algo similar a lo siguiente: chromeapp_ros_scratch.png Por ahora sólo vemos que Scratch está conectado, buena señal. Como ya hace tiempo que hemos lanzado Rosbridge desde el botserver, ya debería estar funcionando y disponible para que conectemos. Para ello escribe la dirección ip de tu Aisoy1 en el cuadro de texto superior. Si la conexión es exitosa te aparecerá una nueva pestaña en la aplicación, con información y opciones de configuración de tu Aisoy1. Captura de pantalla 2014-04-07 a la(s) 10.58.22.png Prueba a tocar en alguno de los lados de tu robot, o a inclinarlo, si todo va bien deberías observar los cambios reflejados en los campos correspondientes de tacto o acelerómetro.

Programando Aisoy1 con BYOB

Aisoy proporciona una plantilla con la definición de los bloques más comunes para el uso del Aisoy1v3. Estos bloques permiten el uso de las funciones motoras (mover ojos, cabeza, cejas…), recibir eventos (tacto, acelerómetro), usar la boca, cambiar el color del corazón, utilizar la función TTS (text-to-speech, es decir la síntesis de voz) o incluso el ASR. Los puedes encontrar en el grupo “control”, y se clasifican en “acciones” y “eventos.

aisoy_blocks.png

Bloques Aisoy “Acciones”

Movimiento

El movimiento de las cejas, ojos, cabeza horizontal y cabeza vertical tienen un funcionamiento similar. Los bloques esperan tres parámetros.
  1. El nombre del bot que ejecute el movimiento.
  2. Posición final del movimiento. El valor deberá ser un número entre 0 y 1.
  3. Tiempo de ejecución del movimiento en milisegundos.

Síntesis de voz (TTS)

La síntesis de voz sólo podrá ser utilizada cuando el robot esté conectado mediante la raspberry pi. Hay dos bloques disponibles, hablar moviendo la boca y sin mover la boca. Para ambos el formato es el mismo:
  1. El nombre del bot que va a hablar.
  2. Texto a decir.

Dibujar en la matriz de Leds (Boca)

La matriz de LEDs de la boca se puede usar de dos maneras, escribiendo un texto en ella o dibujando una imagen (por ejemplo una sonrisa). Tiene el siguiente formato:
  1. Nombre del bot al que escribir en la boca
  2. Texto o imagen a escribir
En el caso de la imagen, será una cadena de texto con 70 caracteres. siendo 0 apagar el correspondiente LED y x encenderlo.

Cambiar luz del corazón

El bloque de cambiar el color del corazón permite definir un nuevo color para el corazón del Aisoy1v3.
  • Componente rojo
  • Componente verde
  • Componente azul
  • Tiempo de cambio del color en milisegundos
Para definir un color se usa el formato RGB.

Bloques Aisoy “Eventos”

Reconocimiento de voz El reconocimiento de voz en Aisoy1 consta de dos fases:
  • Descripción de la gramática. Con el bloque “set grammar” se permite establecer una gramática para el robot, esto es un subconjunto de palabras del diccionario que el robot será capaz de entender. A efectos prácticos, si establecemos la gramática sólo con las palabras “hola” y “adiós”; el robot sólo será capaz de entender estas palabras. En la gramática también se pueden especificar frases enteras.
  • Reconocimiento de voz. Cuando el robot tiene una gramática cargada, empezará a escuchar y mandará un mensaje cada vez que reconozca una frase. El mensaje será del tipo:
[nombre_bot].asr [frase] Por ejemplo: bot1.asr hola Este mensaje se puede capturar con un bloque del tipo “when I receive”. En la siguiente imagen tienes un resumen de los pasos necesarios para activar el reconocimiento de voz desde BYOB.

Otros bloques Aisoy

La siguiente combinación de bloques es necesaria para el correcto funcionamiento de los programas. Cada bloque Aisoy usa una variable latch (del inglés “pestillo”) que deshabilita la ejecución de nuevas instrucciones cuando el pestillo está cerrado. Básicamente cuando se utiliza un bloque Aisoy, el pestillo se cierra y bloquea la ejecución. Cuando acaba la ejecución del bloque que ha cerrado el pestillo el bloque “command confirmation” se encarga de abrir el pestillo permitiendo la ejecución de los siguientes bloques. Esto permite una ejecución secuencial de los comandos e impide que estos se “solapen”.

Anexos

Comunicación Aisoy1 - Scratch/BYOB

Protocolo de sensores remoto

Cuando los sensores remotos están activos, Scratch escucha al puerto 42001 para leer/escribir mensajes. Para ello se utilizan dos bloques de Scratch:
  • Enviar a todos
Esto enviará un mensaje a la chrome-app con el formato broadcast “MESSAGE”
  • Al recibir
Este bloque funciona de disparador, al recibir MESSAGE por el puerto 42001 se ejecutarán las instrucciones enganchadas al bloque.

Protocolo de mensajes soportados

Para la comunicación con los distintos bots se propone un protocolo para el paso de mensajes. El formato para los actuadores será: NOMBRE_BOT.COMANDO ARGUMENTOS
  • NOMBRE_BOT: Alias asignado a cada bot. De momento, por orden de entrada se asignarán los alias bot1, bot2…
  • COMANDO: Función a ejecutar por el bot (¡DEBE TERMINAR CON ESPACIO EN BLANCO!)
  • ARGUMENTOS: Argumentos dependientes del comando a realizar.
Ejemplo: Para cambiar el color del corazón a verde del bot 1 en 300ms. bot1.setColorf 0 255 0 300

Comandos de Actuadores

Los actuadores soportados son:

Mouth print

Comando: NOMBRE_BOT.mouthPrint Argumentos:
  • TEXTO: Texto a imprimir en la matriz de leds. El texto debe estar en mayúsculas y los espacios sustituidos por “_”.
Ejemplos:  bot1.mouthPrint HOLA_MUNDO

Mouth draw

Comando: NOMBRE_BOT.mouthDraw Argumentos:
  • PICTURE: Cadena de 70 caracteres, donde ‘0’ es apagado y ‘x’ encendido
Ejemplos: bot1.mouthDraw 0000000000000000000000000000000x000000x000x0000x00000xxxx0000000000000

Set Color

Comando: NOMBRE_BOT.setColorf Argumentos:
  • RED: Valor de rojo de 0 a 255
  • GREEN: Valor de verde de 0 a 255
  • BLUE: Valor de azul de 0 a 255
  • TIME: (Opcional) Tiempo en ms de cambio de led
Ejemplos: bot1.setColorf 255 0 0 bot2.setColorf 0 255 255 300

Move Servo

Comando: NOMBRE_BOT.moveServo Argumentos:
  • SERVO: ID del servo [1-4]
  • POSITION: Posición final del servo Float [0-1]
  • TIME: Tiempo en ms de cambio de posición
Ejemplos: bot1.moveServo 1 0.65 300 bot2.moveServo 3 1 1000

Say

Solo disponible por ROS. Comando: NOMBRE_BOT.say Argumentos:
  • TEXT: Texto a decir
Ejemplos: bot1.say hello human

Sensores de tacto

El bot al ser tocado en algún sensor, mandará varios mensajes uno por cada sensor activado (left, right, head) y otro general como que ha sido tocado sin importar el lugar. Siendo el general: NOMBRE_BOT.touched Y los particulares: NOMBRE_BOT.touched.left NOMBRE_BOT.touched.right NOMBRE_BOT.touched.head Ejemplo: si el bot 1 es tocado en la cabeza y en la parte izquierda, mandará los siguientes mensajes: bot1.touched bot1.touched.left bot1.touched.head

Creación de bloques

Para la creación de bloques, se ha de pulsar el botón “Make a block” de la pestaña Variables. Después de darle nombre al bloque y elegir la categoría podremos empezar a definirlo. Basta con encadenar bloques al bloque creado existente, esta rutina se ejecutará cuando se llame al bloque creado.

Ejemplo 1: Escribir en la boca

Para ilustrar la creación de bloques podemos usar el bloque creado para escribir texto en la boca. Este bloque se centra en crear el mensaje que se mandará a la chrome-app para la ejecución de la acción. El mensaje a escribir tendrá el formato: <bot name>.mouthPrint <text to write> El ejemplo de la imagen producirá el siguiente mensaje: bot1.mouthPrint TEXT TO WRITE Las directivas que incluyen la variable latch ayudan a la correcta ejecución de las acciones. Es una variable que impide la ejecución de las acciones hasta que no ha habido constancia de que las anteriores se han ejecutado con éxito.

Ejemplo 2: Mover cejas

Otro ejemplo podría ser el movimiento de las cejas del bot. El bloque espera que se le pase por parámetro el nombre del bot a ejecutar (“bot1” en la imagen), la posición a la que desea mover las cejas (un valor entre 0 y 1, 0.5 en la imagen) y el tiempo en milisegundos para realizar el movimiento (300 ms en la imagen). Lo primero que realiza el bloque al ser llamado será comprobar que la posición que a la que se desea mover las cejas está entre 0 y 1. Luego se unen los parámetros del bloque para crear un mensaje que se enviará a la chrome-app. En este caso el bloque enviaría: bot1.moveServo 4 0.5 300

Ejemplo 3: Parpadeo

Los bloques pueden ser llamados desde otros bloques, por lo que se pueden definir múltiples performances. Por ejemplo, realizar un parpadeo desde cero implicaría enviar varias veces un comando servo para el motor 3, etc., lo que no es necesario en BYOB. Podemos definir un bloque “Blink” que a su vez contiene otros bloques “move eyes”. Y estos a su vez contienen los comandos Aisoy.

Enlaces

http://byob.berkeley.edu/ (Página oficial del proyecto) http://wiki.scratch.mit.edu/wiki/Build_Your_Own_Blocks_(Scratch_Modification) (Página de la wiki de scratch) http://byob.berkeley.edu/BYOBManual.pdf (PDF Manual de referencia)


Also in Aisoy Blog

Aisoy welcomes North American Learning Robots, our new official distributor in the US.
Aisoy welcomes North American Learning Robots, our new official distributor in the US.

March 06, 2017

North American Learning Robotics is now the exclusive official distributor of Aisoy products in the US.

Aisoy, is a Spanish manufacturer of emotional educational robots which favor creativity and the development of multiple intelligences in a personalized way is ready to conquer the American market.

Read More

Aisoy wishes you a happy 2017
Aisoy wishes you a happy 2017

December 23, 2016

Every year has 365 days plenty of opportunities for enjoying life, with your family, with your friends, and why not, with a new robot that has come to our life and make us smile.

Read More

Aisoy is highly committed to children's education, particularly to children with special needs

October 29, 2016


New Friends 2016

Aisoy creates emotional robots for changing the way children play and learn. And makes them affordable for everyone. Since the first day, we participate and collaborate with people and initiatives aligned with us.

Read More