.. include:: ../../my-header_2.txt


**Especificación final del robot explorador**
^^^^^^^^^^^^^^^^^^^^^

Se trata del desarrollo de un prototipo de demostración de un robot explorador que trabajará autónomamente sobre la superficie de un planeta o asteroide en busca de indicios de vida. Aunque con algunas simplificaciones, el prototipo a desarrollar proporcionará, al menos desde el punto de vista de la parte software, una prueba de concepto de cómo debería funcionar la detección de vida en el espacio.

La Unión Europea apuesta por el software libre y abierto, por lo que todo el soporte software a utilizar será libre. En consecuencia, también el software desarrollado será libre y abierto.
 
Características del hardware
++++++++++++++++++++

Se trata de un vehículo con dos ruedas motrices, cada una propulsada con un motor, y una rueda trasera loca. Los motores de las ruedas motrices reciben pulsos que hacen que el vehículo avance o gire, dependiendo de si los pulsos los reciben ambos motores o solo uno de ellos. El sistema de tracción es también el encargado de producir los datos de posicionamiento a partir de la relación de pulsos enviados a cada rueda y la frecuencia de estos, generando una interrupción cuando calcula que el vehículo ha variado su posición significativamente.

El vehículo cuenta con varios sensores que permiten detectar la presencia de sustancias químicas en el suelo o en el aire. Para el prototipo a desarrollar se prevén dos sensores: de humedad y de CO2, que se estiman suficientes para cuantificar con precisión razonable la presencia de vida. Los sensores funcionan de manera independiente.

Dadas las condiciones ambientales en las que va a trabajar el robot, se han sacrificado prestaciones por una mayor robustez ante cambios de temperatura extremos, radiaciones, etc. La cantidad de memoria disponible es limitada, ya que las memorias RAM y flash comerciales no son resistentes a los rayos cósmicos y los discos duros están descartados por su escasa tolerancia a los golpes, por lo que se utilizarán tecnologías de baja densidad de integración. El suministro de energía es también limitado, por lo que se utilizará un procesador de bajo consumo y poco potente. 


Interfaz de programación
++++++++++++++++++++++

Debido a las limitaciones del soporte hardware, la placa procesadora que controla el robot montará una versión reducida de Linux, y en consecuencia esta carecerá de muchos de los módulos de los Linux de sobremesa, como gran parte de la biblioteca estándar de C.

Se han desarrollado drivers específicos para cada sensor y para el sistema de posicionamiento. Estos dispositivos se ven en el directorio ``/dev``:

#. El dispositivo de posicionamiento, ``/dev/pos``, es un dispositivo de caracteres que genera datos de posicionamiento asíncronamente. Para el prototipo, y sin pérdida de generalidad, las posiciones tienen una única dimensión; es decir, se supone que el robot se mueve en una línea representada por caracteres ASCII en el rango ‘A’..’Z’, siendo la distancia recorrida entre dos puntos X e Y (es decir, el área explorada), el valor absoluto de la diferencia entre los valores ASCII que representan ambos puntos, *|X-Y|*.
#. El dispositivo de CO2, ``/dev/CO2``, es un dispositivo de caracteres que genera caracteres ASCII en el rango ‘0’..’5’. El valor ‘0’ indica la ausencia de CO2, mientras que el valor ‘5’ indica el nivel máximo de CO2.
#. El sensor de humedad, ``/dev/H2O``, es un dispositivo de caracteres que genera  caracteres ASCII en el rango ‘a’..’f’. El valor ‘a’ indica la ausencia de agua, mientras que el valor ‘f’ indica el nivel máximo de humedad.

La versión de Linux utilizada no monta la biblioteca de entrada/salida estándar de C. Por lo tanto, la E/S no usa los buffers de la biblioteca. Sin embargo se ha montado un subconjunto de las funciones de la biblioteca de C para facilitar la programación, como por ejemplo las macros habituales de conversión de datos y formas sencillas de ``printf``.  

Para reducir el consumo de recursos (memoria y energía) la programación concurrente se basará fundamentalmente en threads (hilos), utilizándose por compatibilidad la biblioteca estándar *pthreads* de POSIX. 


Módulo de Cartografiado de Probabilidad de Vida (MCPV)
++++++++++++++++++++++

Nosotros somos los responsables del desarrollo del Módulo de Cartografiado de Probabilidad de Vida (MCPV), que se encargará de procesar los datos de posicionamiento y de los sensores para inferir indicios de vida en los lugares explorados por el robot. 

MCPV no tiene argumentos, leyendo la entrada de los tres sensores con los nombres especificados más arriba. Como resultado, MCPV producirá por la salida estándar un informe continuo de la probabilidad de vida en los trayectos por los que pasa, como se describe más abajo. Adicionalmente, MCPV generará una salida de nombre ``para_cifrar`` con la secuencia entrelazada de los valores de los sensores en el orden en que se han producido, que la utilidad *encriptador*, ya desarrollada, tomará como entrada para cifrarla, de forma que otro módulo del robot pueda enviarla a La Tierra de forma segura.

La entrada concurrente combinada de los datos de posicionamiento y de los sensores produce la secuencia entrelazada que contiene la información necesaria para el cálculo de las probabilidades de vida:

.. code-block:: bash

      A 0 d e 0 0 B 3 c 5 C …

De acuerdo la secuencia entrelazada, el MCPV irá calculando la probabilidad de presencia de vida en cada trayecto explorado, escribiendo por la salida estándar la secuencia de trayectos con las probabilidades calculadas. Es importante tener en cuenta que el orden de los valores en la secuencia entrelazada es relevante para el cálculo de la probabilidad, de forma que la lectura de cada valor debe hacerse en el momento en que el valor del sensor está disponible. Básicamente, la probabilidad de vida es una ponderación de la media de los datos entregados por los sensores en la zona explorada, de acuerdo a la siguiente fórmula:

      P(X,Y) = 1 - (1 - C(X,Y)/5)·(1 - H(X,Y)/5)

Donde P(X,Y) es la probabilidad de vida entre X e Y, C(X,Y) el valor medio de las medidas de CO2 entre X e Y, y H(X,Y) el valor medio de las medidas de humedad entre X e Y.

De esta forma, como resultado de procesar la secuencia ejemplo:

.. code-block:: bash

      A 0 d e 0 0 B 3 c 5 C …

deberemos interpretar que P(A,B) = 0 y P(B,C) = 0.32, y en consecuencia el módulo MCPV deberá escribir por la salida estándar:

.. code-block:: bash

	      A-B: 0.00
	      B-C: 0.32
              …

El MCPV no requiere tiempo real estricto para generar la salida. Sin embargo, los resultados no pueden retardarse indefinidamente, ya que el Módulo de Planificación del Recorrido deberá tomar decisiones de navegación en función de estos resultados (por ejemplo, para volver a explorar una zona). 


.. include:: ../../my-footer_2.txt





