Urbi es una plataforma informática multiplataforma de código abierto escrita en C++ que se utiliza para desarrollar aplicaciones para robótica y sistemas complejos. [2] Urbi se basa en la arquitectura de componentes distribuidos de C++ de UObject. También incluye el lenguaje de orquestación urbiscript , que es un lenguaje de script paralelo y controlado por eventos. Los componentes de UObject se pueden conectar a urbiscript y aparecen como objetos nativos que se pueden programar para especificar sus interacciones e intercambios de datos. Los UObjects se pueden vincular al intérprete de urbiscript o ejecutar como procesos autónomos en modo "remoto".
El lenguaje urbiscript fue creado en 2003 por Jean-Christophe Baillie en el Laboratorio de Robótica Cognitiva de ENSTA , París. Ha sido desarrollado activamente en la industria a través de la empresa Gostai fundada en 2006. Actualmente es un proyecto de código abierto, con licencia BSD, disponible en GitHub. [3]
El lenguaje urbiscript se puede describir mejor como un lenguaje de script de orquestación: al igual que Lua en los videojuegos, urbiscript se puede utilizar para unir componentes de C++ en un comportamiento funcional, dejándose la parte algorítmica que consume mucha CPU a C++ y la parte de scripting de comportamiento al lenguaje de script, que es más flexible, fácil de mantener y permite la interacción dinámica durante la ejecución del programa. Como lenguaje de orquestación, urbiscript también aporta algunas abstracciones útiles a un programa al tener paralelismo y programación basada en eventos como parte de la semántica del lenguaje. El scripting de comportamientos paralelos y reacciones a eventos son requisitos básicos de la mayoría de las aplicaciones robóticas y de IA complejas, por lo tanto, urbiscript (y toda la plataforma Urbi) es muy adecuado para tales aplicaciones.
El siguiente ejemplo muestra cómo escribir un bucle de acción/percepción de seguimiento de pelota en urbiscript: headYaw/headPitch son dos objetos motores y ball es el objeto de detección de pelota (x e y varían de -1/2 a 1/2):
siempre que ( pelota . visible ) { cabezaYaw . val += cámara . xfov * pelota . x & cabezaPitch . val += cámara . yfov * pelota . y };
Se utiliza siempre que se active un fragmento de código en bucles siempre que la condición asociada sea verdadera. El &
signo se utiliza para especificar que ambos comandos deben iniciarse al mismo tiempo, por lo que se ejecutan en paralelo.
Otras construcciones notables impulsadas por eventos incluyen at , que activa el código asociado una vez cuando se activa el evento:
en ( discurso . escuchar ?( "hola" )) { voz . decir ( "¿Cómo estás?" ) & robot . ponerse de pie (); }
Cada comando o grupo de comandos se puede etiquetar, lo que proporciona una forma de detenerlo más tarde si es necesario:
myTag : while ( true ) echo ( "Este es un bucle sin fin" ), at ( botón . presionado ) myTag . stop ;
Observe que en el ejemplo anterior hay una coma al final del comando. Esto colocará el comando anterior en segundo plano, lo que permitirá que la ejecución del flujo continúe, en particular, que se ejecute el siguiente comando "at".
La arquitectura de componentes UObject permite a los desarrolladores interconectar cualquier objeto Java/C++ dentro de Urbi, haciendo visibles los métodos y atributos seleccionados en urbiscript, mientras que en realidad son código compilado. Se pueden configurar notificadores especiales en cualquiera de los atributos del objeto para notificar al lado C++ de cualquier cambio en estos atributos en el lado urbiscript/Urbi.
UObject utiliza plantillas C++ para mapear de forma transparente cualquier método solicitado a una maquinaria de interfaz que se encarga de la verificación de tipos.
Un UObject puede utilizarse en modo plugged si está vinculado directamente a Urbi en tiempo de compilación o con carga dinámica. En ese caso, el objeto C++ comparte la memoria de Urbi directamente, lo que resulta en una integración eficiente. Esto se utiliza normalmente para componentes críticos en cuanto al tiempo, como controladores de motores o sensores. El mismo UObject también puede utilizarse sin modificaciones como un componente remoto. En ese caso, se convertirá en un programa autónomo que se ejecutará con la dirección IP del servidor Urbi como parámetro. En ambos casos, el objeto aparecerá de forma transparente en urbiscript como un objeto urbiscript nativo.
Liberado:
Anunciado: