El aprendizaje es un tesoro que seguirá a su dueño en todas partes

El aprendizaje es un tesoro que seguirá a su dueño en todas partes

Simulación del mundo con Microsoft Robotics Studio

Simulación del mundo con Microsoft Robotics Studio


fuente:


En este artículo se describen los siguientes temas:
  • Creación de la animación robótica
  • Creación del entorno
  • Dirección de un robot o una simulación
  • Creación de entidades
En este artículo se usan las siguientes tecnologías:
C#, Robotics Studio
Descarga de código disponible en: RoboticsStudio2008_06.exe (646 KB)
Examinar el código en línea



No se deje engañar por el nombre. Microsoft® Robotics Studio (MSRS) es mucho más que jugar con robots. MSRS permite crear aplicaciones basadas en servicios para una amplia gama de dispositivos de hardware. Microsoft Research lo lanzó hace casi dos años y prácticamente todos los desarrolladores de aplicaciones empresariales lo ignoraron. El kit de herramientas incluye un módulo de tiempo de ejecución que le resultará familiar a los desarrolladores de Windows® Communication Framework (WCF). Además, incluye una herramienta de lenguaje de programación visual (VPL) y un entorno de simulación visual (VSE).
MSRS proporciona un módulo de tiempo de ejecución orientado a servicios, además de las herramientas necesarias para diseñar e implementar aplicaciones basadas en robótica. Incluye herramientas, tutoriales y documentación para crear elementos visuales, diseñados para introducir rápidamente a los diseñadores con poca experiencia en el mundo de la robótica. Los desarrolladores comerciales deberán adquirir el kit de herramientas por una pequeña cantidad, pero los desarrolladores aficionados e investigadores académicos podrán descargarlo y usarlo de forma gratuita.
El tiempo de ejecución de MSRS consiste en dos tiempos de ejecución de menor nivel que se basan en CLR 2.0. Estos dos tiempos de ejecución son los servicios de software descentralizado (DSS) y el módulo de tiempo de ejecución de simultaneidad y coordinación (CCR). DSS es un módulo de tiempo de ejecución ligero y orientado al servicio, basado en los principios de Transferencia de estado de representación (REST) que se usan para aumentar la eficacia de la Web. CCR es una biblioteca de Microsoft .NET Framework compatible con el procesamiento asincrónico. Esto tiene una importancia vital para las aplicaciones de robótica, ya que hay numerosos sensores y accionadores que están continuamente enviando y recibiendo datos.
Además del módulo de tiempo de ejecución, el kit de herramientas de MSRS incluye una herramienta VPL que permite la creación de aplicaciones de robótica si se arrastran los elementos a una superficie de diseño. MSRS también incluye un VSE que le permite experimentar con simulaciones complejas que impliquen a varios robots y obstáculos. En este artículo me centraré exclusivamente en esta parte de MSRS. Trataré el entorno de simulación visual y le guiaré por los pasos necesarios para crear una simulación con una nueva entidad robótica. La buena noticia es que, gracias al código de este artículo, no le hace falta un robot que funcione. Éste es el gran atractivo de las simulaciones: ofrecen la oportunidad de aprender sin tener que invertir en un hardware costoso.

¿Qué es una simulación?
Si no está familiarizado con las simulaciones, imagínese un folioscopio, un libro pequeño con una imagen en cada página que "se mueve" cuando se pasan rápidamente las páginas. Las simulaciones funcionan de un modo semejante. Una simulación contiene una o más entidades. Cada una de ellas se presenta en un fotograma. Cada fotograma equivale a una página del folioscopio. La velocidad a la que se presentan los fotogramas depende de la tarjeta gráfica del equipo host.
La diferencia principal entre el folioscopio y la simulación es que el primero es estático o predecible, mientras que una simulación no lo es. Cada fotograma de la simulación se presenta de forma dinámica y las fuerzas con las que se encuentra una entidad en cada fotograma no se conocen siempre de antemano. Esto es lo que convierte a las simulaciones en algo tan útil. Puede representar un escenario con un robot y observar cómo interactúa éste con el mundo.

Introducción
Si aún no lo ha hecho, ahora es un buen momento para descargar e instalar el kit de herramientas de MSRS (disponible en go.microsoft.com/fwlink/?LinkId=113902). Actualmente, el sitio web de MSRS ofrece una instalación nueva de la versión 1.5. Esto incluye la versión completa de MSRS 1.5, además de todas las actualizaciones disponibles.
MSRS proporciona plantillas para Visual Studio® 2005, pero si en su equipo ya se ejecuta Visual Studio 2008, también puede ejecutar los ejemplos incluidos en este artículo. Su equipo de desarrollo necesitará una tarjeta gráfica compatible con DirectX® 9.0. En particular, la tarjeta debe ser compatible con el sombreador de vértices VS_2_0 o superior, así como con el sombreador de píxeles PS_2_0 o superior. Ya los tienen incorporados la mayoría de equipos de escritorio y portátiles que puedan ejecutar los gráficos de los juegos actuales.
Si no está seguro de si su tarjeta gráfica es compatible, vaya a go.microsoft.com/fwlink/?LinkId=113904para obtener una lista de tarjetas gráficas y los sombreadores que admiten. Además, puede instalar MSRS y usar el menú de ayuda en VSE para ver los sombreadores de vértices y píxeles que admite su tarjeta gráfica. Si intenta ejecutar una de las simulaciones que se incluyen en MSRS o en este artículo y la pantalla se queda en blanco, su tarjeta gráfica no es compatible.
MSRS usa el motor de AGEIA PhysX para proporcionar las reglas físicas del entorno de simulación. Sin la física, la simulación no tendría utilidad alguna, ya que no sería un reflejo del mundo que intenta simular. Por ejemplo, sin gravedad las entidades podrían flotar. Si lee la documentación que se adjunta con MSRS, se percatará de que se menciona el uso de una tarjeta aceleradora adicional de AGEIA (visiteageia.com). No es necesario adquirir e instalar esta tarjeta para trabajar con las simulaciones de este artículo; las reglas físicas aún estarán disponibles para su simulación a través del motor de software de AGEIA PhysX.

Ejecución de una simulación
En este momento, probablemente estará deseando ver una simulación. Antes de crear su propia simulación, deberá intentar ejecutar una de las simulaciones que se incluyen con MSRS. Cuando lo haya instalado, MSRS creará una carpeta de menú que contiene siete simulaciones. La primera simulación de esta carpeta, el entorno básico de simulación, presentará una escena similar a la de la figura 1.

Figura 1 Entorno básico de simulación (haga clic en la imagen para aumentarla)
Puede que piense que la simulación básica sólo incluye dos entidades: un globo terráqueo y una caja. En realidad, la escena de simulación también incluye las entidades que representan la cámara principal, el suelo, el cielo y el sol. Para consultar las identidades incluidas, haga clic en Mode y Edit del menú de VSE.
El modo de edición, tal y como se muestra en la figura 2, incluye un panel a la izquierda en el que puede modificar las propiedades asociadas a cada entidad. Estas propiedades lo controlan todo, desde el nombre de la entidad hasta su posición en el entorno de la simulación. Además, también le permiten controlar con precisión el modo en que se presenta la entidad, lo que afecta a cómo aparece en la simulación.

Figura 2 Modo de edición para modificar las propiedades de la entidad (haga clic en la imagen para aumentarla)
Si vuelve al modo de ejecución, puede moverse por la simulación con el mouse o las teclas de dirección. De este modo se cambia el punto de vista de la cámara principal, que es su propio punto de vista en la simulación. También es importante mencionar que VSE permite presentar la escena de diferentes modos. El modo visual es el modo predeterminado y consiste en una visión realista de la escena de simulación. Sin embargo, el elemento del menú Render permite elegir entre los modos Wireframe, Physics, Combined o No Rendering.
La opción No Rendering se incluye porque la representación sólo es un aspecto más de la simulación. Lo más valioso de una simulación es la interacción entre diversas entidades. Como la representación de entidades en una escena de simulación es bastante costoso en cuanto a recursos, la opción No Rendering puede ser bastante útil cuando haya un gran número de entidades implicadas.

Entidades y tipos de entidades
Un tipo de entidad permite definir una nueva instancia de un tipo de entidad determinado. Por ejemplo, el globo terráqueo incluido en el entorno básico de simulación es un tipo de entidad de forma única. El tipo de entidad actúa como una plantilla para la nueva entidad, en el sentido de que especifica las propiedades asociadas a un tipo de entidad determinada. Una vez que se haya creado la entidad, es posible modificar los valores de estas propiedades, pero el tipo de entidad es el que define las propiedades que se incluyen.
VSE precisa un tipo de entidad para agregar una entidad a una simulación. Por ejemplo, para agregar un robot como Create de iRobot, habría que agregar una nueva entidad desde VSE; para ello, se hace clic en Entity y Nuevo mientras se encuentre en el modo de edición. De este modo se abrirá el cuadro de diálogo New Entity (consulte la figura 3).

Figura 3 Inserción de una nueva entidad en el cuadro de diálogo New Entity
Create de iRobot es uno de los robots que incluye MSRS como un tipo de entidad. Esto significa que puede agregar un nuevo robot Create a su simulación mediante el cuadro de diálogo New Entity. En el cuadro de diálogo New Entity, habría que elegir iRobot-Create como el tipo y, a continuación, escribir un nombre único como, por ejemplo, "Entidad Create". Cuando haga clic en OK, el robot Create aparecerá en la escena de la simulación.

Adición de una nueva entidad mediante programación
MSRS proporciona más de una manera de crear y trabajar con simulaciones. Además de VSE, se pueden agregar entidades a una simulación mediante programación. Para ello se crea un proyecto de un servicio DSS. MSRS proporciona una plantilla de Visual Studio que se puede usar para crear un servicio DSS nuevo. Cuando instale MSRS, seleccione Simple Dss Service (1.5) como la plantilla al crear un proyecto nuevo de Visual Studio (consulte la figura 4).

Figura 4 Creación de un nuevo servicio DSS en una plantilla de Visual Studio 2005 (haga clic en la imagen para aumentarla)
La creación de un nuevo servicio DSS con una plantilla dará como resultado la creación de dos archivos de clase. Para crear una nueva entidad, agregue el código en la clase de implementación, que tiene el mismo nombre que el proyecto de forma predeterminada. Las simulaciones que se hayan creado mediante programación necesitarán obtener acceso a los ensamblados que no se incluyan en la plantilla del servicio DSS simple. Por lo tanto, necesitará agregar referencias a los ensamblados que aparecen en la lista de la figura 5.

Nombre del ensambladoDescripción
PhysicsEngineProporciona acceso al motor físico del software AGEIA subyacente.
RoboticsCommonProporciona acceso al espacio de nombres PhysicalModel, que se usa para definir las características físicas de los robots.
SimulationCommonProporciona acceso a las definiciones de tipo que se usan al trabajar con la simulación y con los motores físicos.
SimulationEngineProporciona acceso al motor de la simulación.
SimulationEngine.proxyRepresenta un proxy para el motor de la simulación, que se usa al cargar el motor de la simulación como asociado.
Después de agregar las referencias, es necesario agregar las siguientes declaraciones de espacio de nombres al archivo de implementación de clase:

using Microsoft.Robotics.Simulation;
using Microsoft.Robotics.Simulation.Engine;
using engineproxy = Microsoft.Robotics.Simulation.Engine.Proxy;
using Microsoft.Robotics.Simulation.Physics;
using Microsoft.Robotics.PhysicalModel;

Para comprender qué código necesita para su simulación, en primer lugar deberá examinar los tutoriales de simulación que se incluyen en MSRS. Las muestras que se encuentran en el directorio \samples\simulation tutorials de la instalación de MSRS se corresponden con las simulaciones disponibles en el menú de MSRS. Por ejemplo, el entorno básico de simulación es el mismo que el proyecto SimulationTutorial1.
Si abre el proyecto SimulationTutorial1 con Visual Studio 2005, podrá ver el código que se ha usado para crear el entorno básico de simulación. Lo primero que se debe observar es el método Start, al que se llama automáticamente cuando comienza el servicio:

protected override void Start()
{
      base.Start();
      // Orient sim camera view point
      SetupCamera();
      // Add objects (entities) in our simulated world
      PopulateWorld();
}

Para definir el entorno de la simulación, debe agregar código al método Start. En cuanto al proyecto SimulationTutorial1, esto implica la configuración de la cámara y el relleno de la escena de la simulación con objetos de entidad.
Además de la cámara principal, el entorno básico de simulación contiene las entidades para representar el cielo, el suelo, la caja y el globo terráqueo. El código para insertar el globo terráqueo o la esfera con textura se expone en la figura 6.


void AddTexturedSphere(Vector3 position)
{
    SingleShapeEntity entity = new SingleShapeEntity(
       new SphereShape(
          new SphereShapeProperties(10, // mass in kg
          new Pose(), // pose of shape within entity
          1)), //default radius
       position);

    entity.State.Assets.Mesh = "earth.obj";
    entity.SphereShape.SphereState.Material = 
       new MaterialProperties("sphereMaterial", 0.5f, 0.4f, 0.5f);

    // Name the entity
    entity.State.Name = "detailed sphere";

    // Insert entity in simulation.
    SimulationEngine.GlobalInstancePort.Insert(entity);
}
La primera línea de código del método AddTexturedSphere crea una instancia de SingleShapeEntity. Este tipo representa una entidad con una forma geométrica única, como es el caso de una esfera, y tiene una gran utilidad cuando hace falta agregar una entidad que tenga una geometría física muy simple. En este caso, estoy creando una entidad con una masa de 10 kilogramos, aproximadamente cuatro libras y media.
La malla asignada a esta entidad es un archivo de objeto, que tiene una extensión de archivo .obj. El archivo de objeto se crea con una herramienta de edición gráfica en 3D y se exporta en un formato de objeto de alias. MSRS precisa que el archivo de objeto de malla tenga este formato. Lo último que debe hacer en el método AddTexturedSphere es insertar la entidad esférica en el entorno de la simulación.

Definición de una nueva entidad en el VSE
Ahora creemos una nueva entidad de robot para representar el Boe-Bot de Parallax. El Boe-Bot es un pequeño robot con ruedas que admite un sistema diferencial de conducción con dos ruedas (para ver una fotografía, consulte la figura 7). Para obtener más información acerca del Boe-Bot, visite el sitio web de Parallax en parallax.com.

Figura 7 Boe-Bot de Parallax (haga clic en la imagen para aumentarla)
El Boe-Bot es una de las múltiples plataformas robóticas que admite MSRS. Esto quiere decir que la instalación de MSRS incluye los servicios básicos necesarios para que funcione el sistema de conducción del Boe-Bot, así como sus sensores de contacto integrados. Aunque MSRS incluye los servicios de plataforma para el Boe-Bot, no incluye un tipo de entidad del Boe-Bot.

Creación de una clase de entidad
Para crear un nuevo tipo de entidad para el Boe-Bot, es necesario agregar una clase derivada de DifferentialDriveEntity. Al derivarlo de la clase DifferentialDriveEntity, es posible volver a usar el código que define el modo de comportamiento del Boe-Bot cuando se mueva en una simulación. El código para crear el tipo de entidad del Boe-Bot se muestra en la figura 8.


[DataContract]
public class BoeBot : DifferentialDriveEntity
{
    Port _notifications = 
           new Port();

    // Default constructor, used for creating the entity from XML
    public BoeBot() { }

    // Custom constructor for building model from hardcoded values. 
    // Used to create entity programmatically
    public BoeBot(Vector3 initialPos)
    {
        MASS = 0.454f; //in kilograms  (around 1 pound)
        // the default settings approximate the BoeBot chassis
        CHASSIS_DIMENSIONS = new Vector3(0.09f, //meters wide
                                         0.09f,  //meters high
                                         0.13f); //meters long
        FRONT_WHEEL_MASS = 0.01f;
        CHASSIS_CLEARANCE = 0.015f;
        FRONT_WHEEL_RADIUS = 0.025f;
        CASTER_WHEEL_RADIUS = 0.0125f;
        FRONT_WHEEL_WIDTH = 0.01f;
        CASTER_WHEEL_WIDTH = 0.008f; 
        FRONT_AXLE_DEPTH_OFFSET = 0.01f; // distance from center of robot

        base.State.Name = "BoeBot";
        base.State.MassDensity.Mass = MASS;
        base.State.Pose.Position = initialPos;

        // chassis position
        BoxShapeProperties motorBaseDesc = 
            new BoxShapeProperties("BoeBot Body", MASS,
                new Pose(new Vector3(
                0, // Use 0 for X axis offset
                CHASSIS_CLEARANCE + CHASSIS_DIMENSIONS.Y / 2, 
                0.03f)), // minor offset in the z/depth axis
                CHASSIS_DIMENSIONS);

        motorBaseDesc.Material = 
             new MaterialProperties("high friction", 0.0f, 1.0f, 20.0f);
        motorBaseDesc.Name = "Chassis";
        ChassisShape = new BoxShape(motorBaseDesc);

        // rear wheel is also called the castor
        CASTER_WHEEL_POSITION = new Vector3(0, // center of chassis
             CASTER_WHEEL_RADIUS,              // distance from ground
             CHASSIS_DIMENSIONS.Z / 2);        // at the rear of the robot

        RIGHT_FRONT_WHEEL_POSITION = new Vector3(
             +CHASSIS_DIMENSIONS.X / 2,// left of center
             FRONT_WHEEL_RADIUS,       // distance from ground of axle
             FRONT_AXLE_DEPTH_OFFSET); // distance from center, on z-axis

        LEFT_FRONT_WHEEL_POSITION = new Vector3(
             -CHASSIS_DIMENSIONS.X / 2,// right of center
             FRONT_WHEEL_RADIUS,       // distance from ground of axle
             FRONT_AXLE_DEPTH_OFFSET); // distance from center, on z-axis

        MotorTorqueScaling = 30;

        // specify a default mesh 
        State.Assets.Mesh = "boe-bot.bos";
}
Se usa un constructor para la clase BoeBot con el fin de configurar los valores de diversas variables que se definen en la clase DifferentialDriveEntity. Por ejemplo, la masa está configurada con un valor de 0,454, lo que representa la masa en kilogramos. Además, el chasis del Boe-Bot se define según su anchura, longitud y altura. Estas medidas se obtuvieron al pesar el propio robot y medirlo con una cinta métrica.
La posición del Boe-Bot se define mediante una serie de coordenadas que se transmiten cuando se crea la entidad. Estas coordenadas representan los puntos de eje X, Y y Z. El motor de simulación de MSRS usa un sistema de coordenadas de mano derecha, lo que afecta a la dirección hacia la que apunta el eje Z.
El constructor BoeBot también define la posición del chasis y las ruedas de la entidad. La clase DifferentialDriveSystem da por hecho que el robot tiene dos ruedas principales y una rueda trasera más pequeña que se usa sobre todo para mantener el equilibrio. El funcionamiento se asignará a los motores de la izquierda y de la derecha, que controlan las ruedas principales. La diferencia entre los niveles de funcionamiento asignados a cada rueda determina si se mueve hacia adelante, hacia atrás, a la izquierda o a la derecha. Éste es el mismo método que se usa para dirigir el robot de verdad.
El atractivo de la simulación reside en que, teóricamente, no importa si el robot es de verdad o no: el código que se usa para que funcione el robot y para enviar datos a los sensores es el mismo. Una parte del código que se usa en el proyecto de simulación se puede volver a usar al trabajar con el robot de verdad. Puede que se haya percatado de que he dicho "teóricamente". Esto se debe a que la simulación no puede simular un entorno real por completo. La simulación no puede tener en cuenta el ruido: las cosas inesperadas como los obstáculos que se encuentran en el lugar equivocado.
Lo que sí puede hacer una simulación es proporcionarle una oportunidad bastante realista de experimentar con el diseño de un nuevo robot o simular una interacción entre varios de ellos. Esto tiene una enorme utilidad en entornos académicos en los que los recursos son limitados y el número de estudiantes es elevado.

Creación de una malla
Cada entidad se puede asociar a una malla, que es lo que hace que una entidad parezca realista. Por ejemplo, en el caso del globo, la malla es lo que permite que la entidad del globo se parezca al planeta Tierra. En un sentido estricto, no hace falta asociar una entidad a una malla, pero en el caso de las entidades complejas, como es el caso de los robots, es preferible usar un objeto de malla.
Para crear una malla, se pueden usar casi todas las herramientas de edición de gráficos en 3D. Para este artículo tuve la suerte de contar con un colega, Steve Grand, que creó la malla del Boe-Bot con un paquete 3D llamado SoftImage (para obtener más información acerca de esta herramienta, visitesoftimage.com). Los archivos asociados a esta malla se incluyen en el archivo .zip descargable que acompaña a este artículo. Para seguir con el artículo, descargue el archivo .zip, extraiga los archivos y copie el contenido de la carpeta Boe-Bot en el directorio /store/media que está asociado a la instalación local de MSRS.
SoftImage puede exportar la imagen al formato .obj. Esto es algo que no pueden hacer todos los paquetes. Por ejemplo, SolidWorks (visite solidworks.com) es un paquete 3D que recomendó MSDN en la wiki Channel9 (go.microsoft.com/fwlink/?LinkId=114031). Lamentablemente, SolidWorks no puede exportar al formato .obj, por lo que recomienda una herramienta llamada Blender (blender.org) para realizar la conversión. Tenga esto en mente al seleccionar un paquete de gráficos para crear el archivo de malla.
Los detalles relacionados con la creación de la malla del Boe-Bot no se tratarán en este artículo, pero es necesario que sepa que se creó con la unión de varias formas poligonales de malla. Por ejemplo, el chasis de metal comenzó como una forma cúbica que se modificó para que representara el tamaño y la forma del Boe-Bot. Luego se agregaron otras formas cilíndricas para que representaran las ruedas. Se estableció una jerarquía para unir las ruedas al chasis y permitir que el objeto complejo funcionara como una sola forma. El resultado (como se aprecia en la figura 9) es una imagen que representa al Boe-Bot de verdad.

Figura 9 Uso de SoftImage para crear el archivo de malla del Boe-Bot (haga clic en la imagen para aumentarla)

Conversión de la malla al formato binario
MSRS ofrece una herramienta de la línea de comandos que puede convertir un archivo .obj en un archivo binario optimizado con una extensión de archivo .bos. La ventaja de este tipo de archivo es que se carga mucho más rápidamente que el archivo .obj. Se puede obtener acceso a la herramienta de la línea de comando, denominada Obj2bos.exe, mediante el elemento de menú del símbolo del sistema que se incluye en la instalación de MSRS.
Cuando se trabaja con una malla es importante recordar que se usan materiales para colorear los objetos físicos; y que cada entidad se puede asociar a uno o varios material. Por lo tanto, al crear un archivo .obj, seguramente incluirá algunos archivos de material adicionales con extensión .mtl. También puede incluir archivos de imagen para crear texturas. Es necesario copiar estos archivos en la misma ubicación del archivo .obj antes de usar la herramienta de conversión de malla.
El archivo .obj y todos sus archivos asociados deben estar almacenados en el directorio /store/media que esté asociado a la instalación local de MSRS. Los archivos asociados a la malla del Boe-Bot, que se incluyen en la descarga de código, son los siguientes: Aluminum.png, Boe-bot.mtl, Boe-bot.obj, BoebotWheel.png y Pcb.png. Cuando se encuentren en el directorio media, abra el símbolo del sistema de MSRS y escriba lo siguiente:

Obj2bos.exe /i:"store\media\Boe-bot.obj"

La herramienta de conversión creará un archivo llamado Boe-bot.bos, que se almacenará en el directorio media. Deje el archivo ahí, ya que volveremos a él más tarde.

Creación de un servicio de simulación
Ya estoy listo para crear el servicio de simulación del Boe-Bot. Si está siguiendo la descarga de código que acompaña a este artículo, asegúrese de que ya ha instalado MSRS y ha colocado el código descargado en la carpeta \samples de la instalación local de MSRS.
Si está creando el proyecto desde cero, deberá crear un nuevo servicio DSS mediante la plantilla de Visual Studio 2005. Puede asignar el nombre SimulatedBoeBot al proyecto. Además de las referencias del ensamblado que se mencionaron anteriormente, deberá agregar una referencia para Microsoft.Xna.Framework y, a continuación, agregar las siguientes referencias de espacio de nombres al comienzo del archivo de clase SimulatedBoeBot.cs:

using xna = Microsoft.Xna.Framework;
using xnagrfx = Microsoft.Xna.Framework.Graphics;
using xnaprof = Microsoft.Robotics.Simulation.MeshLoader;

MSRS usa el marco Xna para representar las entidades. Las referencias de Xna se usarán en el código que define el tipo de entidad del Boe-Bot. Todos los tipos de entidad incluidos en MSRS se encuentran en el espacio de nombres Microsoft.Robotics.Simulation.Engine.

Relleno de la escena de simulación
Una de las tareas principales de un servicio de simulación consiste en insertar las entidades en la escena de la simulación. Esto debe hacerse cuando comience el servicio, por lo que normalmente se agrega al método Start una llamada al método PopulateWorld. Para la simulación del Boe-Bot, el método PopulateWorld tendrá este aspecto:

private void PopulateWorld()
{
     AddSky();
     AddGround();
     AddBoeBot(new Vector3(1, 0, 1));
     AddBox(new Vector3(2, 1, 1));
}

Los métodos AddSky y AddGround se usan para configurar el entorno en el que residirá el BoeBot. Para el método AddSky se crea un nuevo tipo SkyDomeEntity y se inserta en la simulación. También se inserta en la simulación una luz direccional para que represente al sol (el código para este método se muestra en la figura 10).


void AddSky()  {
    // Add a sky using a static texture. We will use the sky texture
    // to do per pixel lighting on each simulation visual entity
    SkyDomeEntity sky = new SkyDomeEntity("skydome.dds",  
                                          "sky_diff.dds");
    SimulationEngine.GlobalInstancePort.Insert(sky);

    // Add a directional light to simulate the sun.
    LightSourceEntity sun = new LightSourceEntity();
    sun.State.Name = "Sun";
    sun.Type = LightSourceEntityType.Directional;
    sun.Color = new Vector4(0.8f, 0.8f, 0.8f, 1);
    sun.Direction = new Vector3(0.5f, -.75f, 0.5f);
    SimulationEngine.GlobalInstancePort.Insert(sun);
}
El método AddGround usa el tipo HeightFieldEntity para crear un amplio plano horizontal con elevación cero. Para representar el suelo, se usa una imagen de textura que se incluye en la instalación de MSRS. El código para este método es el siguiente:

void AddGround()
{
    // create a large horizontal plane, at zero elevation.
    HeightFieldEntity ground = new HeightFieldEntity(
        "simple ground", // name
        "03RamieSc.dds", // texture image
        new MaterialProperties("ground",
            0.2f, // restitution
            0.5f, // dynamic friction
            0.5f) // static friction
        );
    SimulationEngine.GlobalInstancePort.Insert(ground);
}

Lo siguiente consiste en agregar la entidad del Boe-Bot. El método AddBoeBot acepta un parámetro Vector3 entrante, que se usa para representar la posición del robot. Esta posición se transmite al constructor de la entidad del BoeBot, que ya se ha creado anteriormente. El método AddBoeBot también inicia el servicio de conducción del Boe-Bot simulado como una entidad asociada. El código para este método es el siguiente:

void AddBoeBot(Vector3 pos)
{
     BoeBot boeBot = new BoeBot(pos);
     boeBot.State.Name = "SimulatedBoeBot";

     // Start simulated Boe-Bot Drive service
     CreateService(
        drive.Contract.Identifier,
          Microsoft.Robotics.Simulation.Partners.CreateEntityPartner(
           "http://localhost/" + boeBot.State.Name));

     SimulationEngine.GlobalInstancePort.Insert(boeBot);
}

La última entidad que queda por agregar es una caja de color sólido que representa un obstáculo. El método AddBox creará una entidad con forma de caja a partir del tipo SingleShapeEntity. Consulte en lafigura 11 el código de este método.


void AddBox(Vector3 position)
{
    Vector3 dimensions =
        new Vector3(0.2f, 0.2f, 0.2f); // meters

    // create simple movable entity, with a single shape
    SingleShapeEntity box = new SingleShapeEntity(
        new BoxShape(
            new BoxShapeProperties(
              100, // mass in kilograms.
              new Pose(), // relative pose
              dimensions)), // dimensions
              position);

    box.State.MassDensity.Mass = 0;
    box.State.MassDensity.Density = 0;

    // Name the entity. All entities must have unique names
    box.State.Name = "box";

    // Insert entity in simulation.  
    SimulationEngine.GlobalInstancePort.Insert(box);
}

Creación de un manifiesto
La mayoría de los servicios se asocian a otros para obtener acceso a los datos y funcionalidad necesarios. A estos servicios asociados se hace referencia al comienzo de la clase de implementación, para lo que se usa el atributo Partner. Por ejemplo, el servicio de simulación del Boe-Bot se asociará al servicio del motor de simulación. El código para incluir la declaración asociada debe tener este aspecto:

//Simulation Engine Port
[Partner("Engine",
     Contract = engineproxy.Contract.Identifier,
     CreationPolicy = PartnerCreationPolicy.UseExistingOrCreate)]
private engineproxy.SimulationEnginePort _engineStub =
     new engineproxy.SimulationEnginePort();

Los servicios DSS usan un archivo basado en XML conocido como un manifiesto para enumerar los servicios asociados a un servicio base. Esto le indica al módulo de tiempo de ejecución de MSRS el modo en que debe cargarse el servicio de base e interactuar con los servicios asociados. Aunque el manifiesto es un archivo basado en XML y se puede editar con un editor de texto, es preferible usar el editor de DSS Manifest, que se incluye con MSRS. El editor de DSS Manifest es una herramienta visual que permite arrastrar los servicios asociados a una superficie de diseño. Antes de usar el editor de DSS Manifest, deberá compilar correctamente el servicio de base. Esto creará los archivos del ensamblado que use el editor de DSS Manifest.
Una vez cargado el editor de DSS Manifest, se incluye en el panel izquierdo una lista de todos los servicios disponibles. Para empezar, deberá buscar el servicio base en la lista de servicios disponibles y arrastrar una instancia de él a la superficie de diseño. Si hace esto para el servicio de la simulación del Boe-Bot, la superficie de diseño incluirá un nodo para el servicio SimulatedBoeBot y un subnodo para el servicio del motor de simulación.
La instalación de MSRS incluye varios servicios en la carpeta \samples. Uno de ellos, el servicio SimpleDashboard, se puede usar como panel de control para los robots simulados. SimpleDashboard permite iniciar otros servicios que se usan para controlar la funcionalidad específica del robot. Por ejemplo, el código del servicio SimulatedBoeBot rellena con entidades la escena de la simulación, entre las que se encuentra el Boe-Bot. Sin embargo, no existe ningún código en el servicio para mover al robot. Este código se toma prestado del servicio Drive.
Para cargar y usar el panel simple debe agregarlo al manifiesto, por lo que debe buscar una instancia de SimpleDashboard en la lista de servicios y arrastrarla al final de la superficie de diseño. El resultado será semejante al de la figura 12. Lo último que debe hacer es guardar el manifiesto en el directorio del proyecto del servicio SimulatedBoeBot, así como sobrescribir el manifiesto llamado SimulatedBoeBot.mainfest.xml.

Figura 12 Versión final del manifiesto en el editor de DSS Manifest (haga clic en la imagen para aumentarla)

Ejecución de la simulación
Ahora puede ejecutar el servicio SimulatedBoeBot. Para ello, simplemente haga clic en Depurar y Ejecutar en el menú de Visual Studio 2005. En primer lugar deberá aparecer una ventana del símbolo del sistema.
Una vez que se haya cargado el servicio, deberán aparecer otras dos ventanas. La interfaz del panel simple es un formulario de Windows que incluye varios cuadros de grupo. A la derecha del cuadro (consulte la figura 13) se encuentra un cuadro de grupo denominado Remote Node. Para comenzar, deberá escribir el nombre del equipo local (localhost) en el cuadro de texto del equipo y hacer clic en Connect. De este modo se iniciará una conexión con el servicio SimulatedBoeBot y se cargarán los servicios asociados de la entidad, como el servicio de conducción que aparece en cuadro de lista del directorio.

Figura 13 Conducción del Boe-Bot en un entorno virtual (haga clic en la imagen para aumentarla)
El servicio de conducción se usa para que funcionen las ruedas que controlan el Boe-Bot. Esto le permite mover el Boe-Bot por la simulación con la ayuda del control virtual del joystick o con un joystick conectado al equipo. Para comenzar, deberá hacer doble clic en el elemento SimulatedBoeBot que aparece en el cuadro de lista. A continuación, podrá usar el mouse para arrastrar el control redondo del joystick virtual, que se encuentra en la esquina superior izquierda del cuadro del panel simple.
Puede que le cueste acostumbrarse a usar el control del joystick virtual (consulte la figura 14 para ver el aspecto de la simulación). Practique desplazando el Boe-Bot por la escena de la simulación y vea cómo reacciona cuando choca con el obstáculo de la caja. A continuación, vaya al modo de edición, seleccione una de las entidades y ajuste sus propiedades para ver cómo le afecta. Dedique tiempo a experimentar con el entorno de la simulación y tener una idea de cómo funciona.

Figura 14 Funcionamiento de un Boe-Bot simulado en un entorno virtual (haga clic en la imagen para aumentarla)

Creación de una entidad sin una conducción diferencial
En este artículo he tratado cómo crear una nueva entidad robótica conocida como Boe-Bot. Como el Boe-Bot usa un sistema de conducción diferencial para controlar las ruedas del robot, puede crear un tipo de entidad que se derive de la clase DifferentialDriveEntity. Esto me permitió volver a usar el código que se incluye en MSRS para controlar un robot que use este tipo de sistema de conducción.
Si deseara simular un robot que usara un sistema de conducción diferente, en primer lugar tendría que agregar una clase que representara dicho sistema de conducción. Por ejemplo, algunos robots usan lo que se denomina sistema de conducción tricíclico. En este caso, se usa una rueda delantera para mover al robot, además de otras dos ruedas conectadas a un motor independiente para conducirlo en una dirección u otra.
Para incorporar este tipo de sistema en el mundo simulado o real, es necesario crear una clase que tenga en cuenta este tipo de sistema de conducción. Los pasos para llevar esto a cabo no se tratarán en este artículo, pero MSRS es compatible con este tipo de escenario. Este carácter tan expansible forma parte de lo que convierte a MSRS en algo tan valioso para los investigadores del ámbito de la robótica. Es posible ampliar MSRS para que sea compatible con cualquier tipo de plataforma de hardware.

Comentarios